r24496: Add initial synonym handling to "net conf":
authorMichael Adam <obnox@samba.org>
Thu, 16 Aug 2007 15:32:00 +0000 (15:32 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:29:52 +0000 (12:29 -0500)
When storing parameters in the smbconf portion of the registry,
up to now, synonyms could be misused to store a parameter twice.
Now this is prevented by canonicalizing the paramter name first.

Also, the value for a boolean parameter checked for validity
before storing the bool in registry.

(The canonicalization should finally go into the registry smbconf
code to also prevent e.g. "regedit" or "net rpc registry" from
storing synonyms. - This is in the making.)

Michael

source/utils/net_conf.c

index bcb116a0c8626e905b82deab94bf4322b4c59da0..f7385586fb336a619e69361874cef296a6a13d46 100644 (file)
@@ -151,12 +151,10 @@ static WERROR reg_setvalue_internal(struct registry_key *key,
        struct registry_value val;
        WERROR werr = WERR_OK;
        char *subkeyname;
-
-       ZERO_STRUCT(val);
-
-       val.type = REG_SZ;
-       val.v.sz.str = CONST_DISCARD(char *, valstr);
-       val.v.sz.len = strlen(valstr) + 1;
+       const char *canon_valname;
+       const char *canon_valstr;
+       BOOL canon_inverse;
+       struct parm_struct *parm;
 
        if (!lp_parameter_is_valid(valname)) {
                d_fprintf(stderr, "Invalid parameter '%s' given.\n", valname);
@@ -164,9 +162,45 @@ static WERROR reg_setvalue_internal(struct registry_key *key,
                goto done;
        }
 
-       if (registry_smbconf_valname_forbidden(valname)) {
+       if (!lp_canonicalize_parameter(valname, &canon_valname, &canon_inverse))
+       {
+               d_fprintf(stderr, "ERROR: could not canonicalize parameter "
+                         "'%s' after successful validation: this should not "
+                         "happen!\n", valname);
+               werr = WERR_INVALID_PARAM;
+               goto done;
+       }
+       if (canon_inverse) {
+               if (!lp_invert_boolean(valstr, &canon_valstr)) {
+                       d_fprintf(stderr, "invalid value '%s' given for "
+                                 "parameter '%s'\n", valstr, canon_valname);
+                       werr = WERR_INVALID_PARAM;
+                       goto done;
+               }
+       } else {
+               parm = lp_get_parameter(canon_valname);
+               if (parm->type == P_BOOL) {
+                       if (!lp_canonicalize_boolean(valstr, &canon_valstr)) {
+                               d_fprintf(stderr, "invalied value '%s' given "
+                                         "for parameter '%s'\n", valstr,
+                                         canon_valname);
+                               werr = WERR_INVALID_PARAM;
+                               goto done;
+                       }
+               } else {
+                       canon_valstr = valstr;
+               }
+       }
+
+       ZERO_STRUCT(val);
+
+       val.type = REG_SZ;
+       val.v.sz.str = CONST_DISCARD(char *, canon_valstr);
+       val.v.sz.len = strlen(canon_valstr) + 1;
+
+       if (registry_smbconf_valname_forbidden(canon_valname)) {
                d_fprintf(stderr, "Parameter '%s' not allowed in registry.\n",
-                         valname);
+                         canon_valname);
                werr = WERR_INVALID_PARAM;
                goto done;
        }
@@ -183,18 +217,18 @@ static WERROR reg_setvalue_internal(struct registry_key *key,
            lp_parameter_is_global(valname))
        {
                d_fprintf(stderr, "Global paramter '%s' not allowed in "
-                         "service definition ('%s').\n", valname,
+                         "service definition ('%s').\n", canon_valname,
                          subkeyname);
                werr = WERR_INVALID_PARAM;
                goto done;
        }
 
-       werr = reg_setvalue(key, valname, &val);
+       werr = reg_setvalue(key, canon_valname, &val);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr,
                          "Error adding value '%s' to "
                          "key '%s': %s\n",
-                         valname, key->key->name, dos_errstr(werr));
+                         canon_valname, key->key->name, dos_errstr(werr));
        }
 
 done: