Re: Problem with 3Com-User-Access-Level and rlm_perl





On Sun, 26 Nov 2006, Krzysztof Olędzki wrote:

On 2006-11-26 20:25, Alan DeKok wrote:
Krzysztof Olędzki wrote:

Like I said in my first mail: problem with rlm_perl was tested with both
freeradius-1.1.2 and 1.1.3. The test with users file was done using
version 1.1.3.

  Ok... I get enough email that I don't keep track of previous messages
in a thread.

  In any case, the issue is that the VALUE name starts with '3', so
*any* of the '3Com-*' VALUES get parsed as '3'.  The solution is to
update the VALUE name so it doesn't start with '3'.

  Or, update the source code to be a little more intelligent about
parsing VALUEs

OK, probably found it (src/lib/valuepair.c):

How about attached (for patching) and inlined (for easy review) patch?

I also fixed else/if abuse - this is a code in a switch/case statement so we can simply use a "break;".

diff -Nur freeradius-1.1.3-orig/src/lib/valuepair.c freeradius-1.1.3/src/lib/valuepair.c
--- freeradius-1.1.3-orig/src/lib/valuepair.c	2006-05-03 19:40:58.000000000 +0200
+++ freeradius-1.1.3/src/lib/valuepair.c	2006-11-26 21:26:05.000000000 +0100
@@ -699,29 +699,29 @@
 			if (s) free(s);
 			vp->length = 4;
 			break;
+
 		case PW_TYPE_INTEGER:
 			/*
-			 * 	If it starts with a digit, it must
-			 * 	be a number (or a range).
-			 *
 			 *	Note that ALL integers are unsigned!
 			 */
-			if (isdigit((int) *value)) {
-				vp->lvalue = (uint32_t) strtoul(value, NULL, 10);
+			vp->lvalue = (uint32_t) strtoul(value, &p, 10);
+			if (!*p) {
 				vp->length = 4;
+				break;
 			}
+
 			/*
 			 *	Look for the named value for the given
 			 *	attribute.
 			 */
-			else if ((dval = dict_valbyname(vp->attribute, value)) == NULL) {
+			if ((dval = dict_valbyname(vp->attribute, value)) == NULL) {
 				librad_log("Unknown value %s for attribute %s",
 					   value, vp->name);
 				return NULL;
-			} else {
-				vp->lvalue = dval->value;
-				vp->length = 4;
 			}
+
+			vp->lvalue = dval->value;
+			vp->length = 4;
 			break;

 		case PW_TYPE_DATE:

Best regards,


				Krzysztof Olędzki
diff -Nur freeradius-1.1.3-orig/src/lib/valuepair.c freeradius-1.1.3/src/lib/valuepair.c
--- freeradius-1.1.3-orig/src/lib/valuepair.c	2006-05-03 19:40:58.000000000 +0200
+++ freeradius-1.1.3/src/lib/valuepair.c	2006-11-26 21:26:05.000000000 +0100
@@ -699,29 +699,29 @@
 			if (s) free(s);
 			vp->length = 4;
 			break;
+
 		case PW_TYPE_INTEGER:
 			/*
-			 * 	If it starts with a digit, it must
-			 * 	be a number (or a range).
-			 *
 			 *	Note that ALL integers are unsigned!
 			 */
-			if (isdigit((int) *value)) {
-				vp->lvalue = (uint32_t) strtoul(value, NULL, 10);
+			vp->lvalue = (uint32_t) strtoul(value, &p, 10);
+			if (!*p) {
 				vp->length = 4;
+				break;
 			}
+
 			/*
 			 *	Look for the named value for the given
 			 *	attribute.
 			 */
-			else if ((dval = dict_valbyname(vp->attribute, value)) == NULL) {
+			if ((dval = dict_valbyname(vp->attribute, value)) == NULL) {
 				librad_log("Unknown value %s for attribute %s",
 					   value, vp->name);
 				return NULL;
-			} else {
-				vp->lvalue = dval->value;
-				vp->length = 4;
 			}
+
+			vp->lvalue = dval->value;
+			vp->length = 4;
 			break;
 
 		case PW_TYPE_DATE:


This archive was generated by a fusion of Pipermail (Mailman edition) and MHonArc.