/** * Check whether a given parameter name is valid in the * smbconf registry backend. */ bool smbconf_reg_parameter_is_valid(const char *param_name) { /* hard code the list of forbidden names here for now */ const char *forbidden_names[] = { "state directory", "lock directory", "lock dir", "config backend", "include", /* * "includes" has a special meaning internally. * It is currently not necessary to list it here since it is * not a valid parameter. But for clarity and safety, we keep * it for now. */ INCLUDES_VALNAME, NULL }; const char **forbidden = NULL; if (!lp_parameter_is_valid(param_name)) { return false; } for (forbidden = forbidden_names; *forbidden != NULL; forbidden++) { if (strwicmp(param_name, *forbidden) == 0) { return false; } } return true; }
static bool smbconf_reg_valname_valid(const char *valname) { return (!smbconf_reg_valname_forbidden(valname) && lp_parameter_is_valid(valname)); }
/** * add a value to a key. */ static sbcErr smbconf_reg_set_value(struct registry_key *key, const char *valname, const char *valstr) { struct registry_value val; WERROR werr = WERR_OK; sbcErr err; char *subkeyname; const char *canon_valname; const char *canon_valstr; if (!lp_parameter_is_valid(valname)) { DEBUG(5, ("Invalid parameter '%s' given.\n", valname)); err = SBC_ERR_INVALID_PARAM; goto done; } if (!smbconf_reg_parameter_is_valid(valname)) { DEBUG(5, ("Parameter '%s' not allowed in registry.\n", valname)); err = SBC_ERR_INVALID_PARAM; goto done; } subkeyname = strrchr_m(key->key->name, '\\'); if ((subkeyname == NULL) || (*(subkeyname +1) == '\0')) { DEBUG(5, ("Invalid registry key '%s' given as " "smbconf section.\n", key->key->name)); err = SBC_ERR_INVALID_PARAM; goto done; } subkeyname++; if (!strequal(subkeyname, GLOBAL_NAME) && lp_parameter_is_global(valname)) { DEBUG(5, ("Global parameter '%s' not allowed in " "service definition ('%s').\n", valname, subkeyname)); err = SBC_ERR_INVALID_PARAM; goto done; } if (!lp_canonicalize_parameter_with_value(valname, valstr, &canon_valname, &canon_valstr)) { /* * We already know the parameter name is valid. * So the value must be invalid. */ DEBUG(5, ("invalid value '%s' given for parameter '%s'\n", valstr, valname)); err = SBC_ERR_INVALID_PARAM; goto done; } ZERO_STRUCT(val); val.type = REG_SZ; if (!push_reg_sz(talloc_tos(), &val.data, canon_valstr)) { err = SBC_ERR_NOMEM; goto done; } werr = reg_setvalue(key, canon_valname, &val); if (!W_ERROR_IS_OK(werr)) { DEBUG(5, ("Error adding value '%s' to " "key '%s': %s\n", canon_valname, key->key->name, win_errstr(werr))); err = SBC_ERR_NOMEM; goto done; } err = SBC_ERR_OK; done: return err; }