]> granicus.if.org Git - php/commitdiff
Fixed ext/fileinfo conversion mistakes
authorDmitry Stogov <dmitry@zend.com>
Wed, 7 May 2014 13:58:28 +0000 (17:58 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 7 May 2014 13:58:28 +0000 (17:58 +0400)
ext/fileinfo/libmagic/softmagic.c

index fb275f7f26139bd41ce8d83573a576d178f161c1..bfcae28c51ad397e6dc7fae6b6200101622f8a12 100644 (file)
@@ -2102,12 +2102,17 @@ magiccheck(struct magic_set *ms, struct magic *m)
                                zval *pzval;
                                HashTable *ht = Z_ARRVAL(subpats);
                                zval *pattern_match = NULL, *pattern_offset = NULL;
+                               int first = 1, inner_first;
 
                                ZEND_HASH_FOREACH_VAL(ht, pzval) {
                                        HashTable *inner_ht;
                                        zval *match, *offset;
                                        zval tmpcopy, matchcopy, offsetcopy;
 
+                                       if (first) {
+                                               first = 0;
+                                               continue;
+                                       }
                                        ZVAL_DUP(&tmpcopy, pzval);
 
                                        inner_ht = Z_ARRVAL(tmpcopy);
@@ -2116,34 +2121,44 @@ magiccheck(struct magic_set *ms, struct magic *m)
                                           tmpcopy now contains two elements:
                                           0 = the match
                                           1 = starting position of the match */
+                                       inner_first = 1;
                                        ZEND_HASH_FOREACH_VAL(inner_ht, match) {
+                                               if (inner_first) {
+                                                       inner_first = 0;
+                                                       continue;
+                                               }
                                                ZVAL_DUP(&matchcopy, match);
                                                convert_to_string(&matchcopy); 
                                                pattern_match = &matchcopy;
                                        } ZEND_HASH_FOREACH_END();
 
+                                       inner_first = 1;
                                        ZEND_HASH_FOREACH_VAL(inner_ht, offset) {
+                                               if (inner_first) {
+                                                       inner_first = 0;
+                                                       continue;
+                                               }
                                                ZVAL_DUP(&offsetcopy, offset);
                                                convert_to_long(&offsetcopy); 
                                                pattern_offset = &offsetcopy;
                                        } ZEND_HASH_FOREACH_END();
 
                                        zval_dtor(&tmpcopy);    
-                               } ZEND_HASH_FOREACH_END();
 
-                               if ((pattern_match != NULL) && (pattern_offset != NULL)) {
-                                       ms->search.s += Z_LVAL_P(pattern_offset); /* this is where the match starts */
-                                       ms->search.offset += Z_LVAL_P(pattern_offset); /* this is where the match starts as size_t */
-                                       ms->search.rm_len = Z_STRLEN_P(pattern_match) /* This is the length of the matched pattern */;
-                                       v = 0;
-
-                                       zval_ptr_dtor(pattern_match);
-                                       zval_ptr_dtor(pattern_offset);
-                               } else {
-                                       zval_ptr_dtor(&subpats);
-                                       zval_ptr_dtor(&pattern);
-                                       return -1;
-                               }
+                                       if ((pattern_match != NULL) && (pattern_offset != NULL)) {
+                                               ms->search.s += Z_LVAL_P(pattern_offset); /* this is where the match starts */
+                                               ms->search.offset += Z_LVAL_P(pattern_offset); /* this is where the match starts as size_t */
+                                               ms->search.rm_len = Z_STRLEN_P(pattern_match) /* This is the length of the matched pattern */;
+                                               v = 0;
+
+                                               zval_ptr_dtor(pattern_match);
+                                               zval_ptr_dtor(pattern_offset);
+                                       } else {
+                                               zval_ptr_dtor(&subpats);
+                                               zval_ptr_dtor(&pattern);
+                                               return -1;
+                                       }
+                               } ZEND_HASH_FOREACH_END();
                        } else {
                                v = 1;
                        }