svn commit: samba r24496 - in branches: SAMBA_3_2/source/utils SAMBA_3_2_0/source/utils

obnox at samba.org obnox at samba.org
Thu Aug 16 15:32:01 GMT 2007


Author: obnox
Date: 2007-08-16 15:32:00 +0000 (Thu, 16 Aug 2007)
New Revision: 24496

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24496

Log:
Add initial synonym handling to "net conf":
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


Modified:
   branches/SAMBA_3_2/source/utils/net_conf.c
   branches/SAMBA_3_2_0/source/utils/net_conf.c


Changeset:
Modified: branches/SAMBA_3_2/source/utils/net_conf.c
===================================================================
--- branches/SAMBA_3_2/source/utils/net_conf.c	2007-08-16 15:27:06 UTC (rev 24495)
+++ branches/SAMBA_3_2/source/utils/net_conf.c	2007-08-16 15:32:00 UTC (rev 24496)
@@ -151,22 +151,56 @@
 	struct registry_value val;
 	WERROR werr = WERR_OK;
 	char *subkeyname;
+	const char *canon_valname;
+	const char *canon_valstr;
+	BOOL canon_inverse;
+	struct parm_struct *parm;
 
-	ZERO_STRUCT(val);
-
-	val.type = REG_SZ;
-	val.v.sz.str = CONST_DISCARD(char *, valstr);
-	val.v.sz.len = strlen(valstr) + 1;
-
 	if (!lp_parameter_is_valid(valname)) {
 		d_fprintf(stderr, "Invalid parameter '%s' given.\n", valname);
 		werr = WERR_INVALID_PARAM;
 		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 @@
 	    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:

Modified: branches/SAMBA_3_2_0/source/utils/net_conf.c
===================================================================
--- branches/SAMBA_3_2_0/source/utils/net_conf.c	2007-08-16 15:27:06 UTC (rev 24495)
+++ branches/SAMBA_3_2_0/source/utils/net_conf.c	2007-08-16 15:32:00 UTC (rev 24496)
@@ -151,22 +151,56 @@
 	struct registry_value val;
 	WERROR werr = WERR_OK;
 	char *subkeyname;
+	const char *canon_valname;
+	const char *canon_valstr;
+	BOOL canon_inverse;
+	struct parm_struct *parm;
 
-	ZERO_STRUCT(val);
-
-	val.type = REG_SZ;
-	val.v.sz.str = CONST_DISCARD(char *, valstr);
-	val.v.sz.len = strlen(valstr) + 1;
-
 	if (!lp_parameter_is_valid(valname)) {
 		d_fprintf(stderr, "Invalid parameter '%s' given.\n", valname);
 		werr = WERR_INVALID_PARAM;
 		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 @@
 	    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:



More information about the samba-cvs mailing list