Browse Source

ucimap: fix boolean interpretation, add range checks for int values (thx, henning)

Felix Fietkau 14 years ago
parent
commit
65f3dccc35
1 changed files with 14 additions and 10 deletions
  1. 14 10
      ucimap.c

+ 14 - 10
ucimap.c

@@ -16,6 +16,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <limits.h>
 #include "ucimap.h"
 
 struct uci_alloc {
@@ -179,6 +180,7 @@ ucimap_add_value(union ucimap_data *data, struct uci_optmap *om, struct ucimap_s
 {
 	union ucimap_data tdata = *data;
 	char *eptr = NULL;
+	long lval;
 	char *s;
 	int val;
 
@@ -196,28 +198,30 @@ ucimap_add_value(union ucimap_data *data, struct uci_optmap *om, struct ucimap_s
 		ucimap_add_alloc(sd, s);
 		break;
 	case UCIMAP_BOOL:
-		val = -1;
-		if (strcmp(str, "on"))
+		if (!strcmp(str, "on"))
 			val = true;
-		else if (strcmp(str, "1"))
+		else if (!strcmp(str, "1"))
 			val = true;
-		else if (strcmp(str, "enabled"))
+		else if (!strcmp(str, "enabled"))
 			val = true;
-		else if (strcmp(str, "off"))
+		else if (!strcmp(str, "off"))
 			val = false;
-		else if (strcmp(str, "0"))
+		else if (!strcmp(str, "0"))
 			val = false;
-		else if (strcmp(str, "disabled"))
+		else if (!strcmp(str, "disabled"))
 			val = false;
-		if (val == -1)
+		else
 			return;
 
 		tdata.b = val;
 		break;
 	case UCIMAP_INT:
-		val = strtol(str, &eptr, om->data.i.base);
+		lval = strtol(str, &eptr, om->data.i.base);
+		if (lval < INT_MIN || lval > INT_MAX)
+			return;
+
 		if (!eptr || *eptr == '\0')
-			tdata.i = val;
+			tdata.i = (int) lval;
 		else
 			return;
 		break;