libsmbconf:registry: reorganize the validity check and canonicalization of the input...
authorMichael Adam <obnox@samba.org>
Sun, 22 Sep 2013 06:47:14 +0000 (08:47 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 24 Sep 2013 05:44:28 +0000 (07:44 +0200)
- first check that the name is an smbconf parameter
- then check that the parameter is allowed in the registry config
- then check that a global parameter is not to be set in a service section
- then canonicalize the parameter and value name, thereby checking that the
  value has valid format

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/lib/smbconf/smbconf_reg.c

index 696dd1f82382bb0caa08d2224e0d877485efc1fd..9bdcbfd9037fa41671ebe1df978ad60cb2ca74d5 100644 (file)
@@ -174,24 +174,15 @@ static sbcErr smbconf_reg_set_value(struct registry_key *key,
        const char *canon_valname;
        const char *canon_valstr;
 
-       if (!lp_canonicalize_parameter_with_value(valname, valstr,
-                                                 &canon_valname,
-                                                 &canon_valstr))
-       {
-               if (canon_valname == NULL) {
-                       DEBUG(5, ("invalid parameter '%s' given\n",
-                                 valname));
-               } else {
-                       DEBUG(5, ("invalid value '%s' given for "
-                                 "parameter '%s'\n", valstr, valname));
-               }
+       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(canon_valname)) {
+       if (!smbconf_reg_parameter_is_valid(valname)) {
                DEBUG(5, ("Parameter '%s' not allowed in registry.\n",
-                         canon_valname));
+                         valname));
                err = SBC_ERR_INVALID_PARAM;
                goto done;
        }
@@ -208,12 +199,26 @@ static sbcErr smbconf_reg_set_value(struct registry_key *key,
            lp_parameter_is_global(valname))
        {
                DEBUG(5, ("Global parameter '%s' not allowed in "
-                         "service definition ('%s').\n", canon_valname,
+                         "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;