]> granicus.if.org Git - php/commitdiff
- Fix the fix for bug #42233
authorJani Taskinen <jani@php.net>
Fri, 10 Aug 2007 12:17:26 +0000 (12:17 +0000)
committerJani Taskinen <jani@php.net>
Fri, 10 Aug 2007 12:17:26 +0000 (12:17 +0000)
ext/standard/array.c
ext/standard/tests/array/bug42233.phpt [new file with mode: 0644]

index 8fdff262bf6d53a75579b88966110da20a2a8503..b9937e4993cd6277eb1058d539fbfd76816a3812 100644 (file)
@@ -1282,32 +1282,34 @@ PHP_FUNCTION(array_search)
 
 static int php_valid_var_name(char *var_name, int len) /* {{{ */
 {
-       int i;
+       int i, ch;
        
        if (!var_name)
                return 0;
 
        /* These are allowed as first char: [a-zA-Z_\x7f-\xff] */
-       if (var_name[0] == '_' ||
-               (((int)((unsigned char *)var_name)[0]) >= 65  /* A    */ && /* Z    */ 90  <= ((int)((unsigned char *)var_name)[0])) ||
-               (((int)((unsigned char *)var_name)[0]) >= 97  /* a    */ && /* z    */ 122 <= ((int)((unsigned char *)var_name)[0])) ||
-               (((int)((unsigned char *)var_name)[0]) >= 127 /* 0x7f */ && /* 0xff */ 255 <= ((int)((unsigned char *)var_name)[0]))
+       ch = (int)((unsigned char *)var_name)[0];
+       if (var_name[0] != '_' &&
+               (ch < 65  /* A    */ || /* Z    */ ch > 90)  &&
+               (ch < 97  /* a    */ || /* z    */ ch > 122) &&
+               (ch < 127 /* 0x7f */ || /* 0xff */ ch > 255)
        ) {
-               /* And these as the rest: [a-zA-Z0-9_\x7f-\xff] */
-               if (len > 1) {
-                       for (i = 1; i < len; i++) {
-                               if (var_name[i] == '_' ||
-                                       (((int)((unsigned char *)var_name)[i]) >= 48  /* 0    */ && /* 9    */ 57  <= ((int)((unsigned char *)var_name)[i])) ||
-                                       (((int)((unsigned char *)var_name)[i]) >= 65  /* A    */ && /* Z    */ 90  <= ((int)((unsigned char *)var_name)[i])) ||
-                                       (((int)((unsigned char *)var_name)[i]) >= 97  /* a    */ && /* z    */ 122 <= ((int)((unsigned char *)var_name)[i])) ||
-                                       (((int)((unsigned char *)var_name)[i]) >= 127 /* 0x7f */ && /* 0xff */ 255 <= ((int)((unsigned char *)var_name)[i]))
-                               ) {     } else {
-                                       return 0;
-                               }
+               return 0;
+       }
+
+       /* And these as the rest: [a-zA-Z0-9_\x7f-\xff] */
+       if (len > 1) {
+               for (i = 1; i < len; i++) {
+                       ch = (int)((unsigned char *)var_name)[i];
+                       if (var_name[i] != '_' &&
+                               (ch < 48  /* 0    */ || /* 9    */ ch > 57)  &&
+                               (ch < 65  /* A    */ || /* Z    */ ch > 90)  &&
+                               (ch < 97  /* a    */ || /* z    */ ch > 122) &&
+                               (ch < 127 /* 0x7f */ || /* 0xff */ ch > 255)
+                       ) {     
+                               return 0;
                        }
                }
-       } else {
-               return 0;
        }
        return 1;
 }
diff --git a/ext/standard/tests/array/bug42233.phpt b/ext/standard/tests/array/bug42233.phpt
new file mode 100644 (file)
index 0000000..0cebc42
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Bug #42233 (extract(): scandic characters not allowed as variable name)
+--FILE--
+<?php
+
+$test = array(
+       'a'     => '1',
+       'æ'     => '2',
+       'æøåäö' => '3',
+);
+
+var_dump($test);
+var_dump(extract($test));
+var_dump($a);
+var_dump($æ);
+var_dump($æøåäö);
+
+echo "Done.\n";
+?>
+--EXPECT--
+array(3) {
+  ["a"]=>
+  string(1) "1"
+  ["æ"]=>
+  string(1) "2"
+  ["æøåäö"]=>
+  string(1) "3"
+}
+int(3)
+string(1) "1"
+string(1) "2"
+string(1) "3"
+Done.