]> granicus.if.org Git - onig/commitdiff
invalid empty check in STACK_EMPTY_CHECK_MEMST_REC()
authorK.Kosako <kkosako0@gmail.com>
Sat, 31 Mar 2018 07:45:03 +0000 (16:45 +0900)
committerK.Kosako <kkosako0@gmail.com>
Sat, 31 Mar 2018 07:45:03 +0000 (16:45 +0900)
src/regexec.c

index 694981d5bfae0e30bee34d24b33d9f368d49a400..bf118ce5f49cf7b63763cc89e6ffaaf13fafc69c 100644 (file)
@@ -1873,7 +1873,6 @@ stack_double(int is_alloca, char** arg_alloc_base,
                 endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
               else\
                 endp = (UChar* )k->u.mem.end;\
-              /*fprintf(stderr, "num: %d, pstr: %p, endp: %p\n", k->u.mem.num, STACK_AT(k->u.mem.start)->u.mem.pstr, endp);*/ \
               if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
                 (isnull) = 0; break;\
               }\
@@ -1908,20 +1907,28 @@ stack_double(int is_alloca, char** arg_alloc_base,
             (isnull) = 1;\
             while (k < stk) {\
               if (k->type == STK_MEM_START) {\
-                if (k->u.mem.end == INVALID_STACK_INDEX) {\
-                  (isnull) = 0; break;\
-                }\
-                if (MEM_STATUS_AT(reg->bt_mem_end, k->zid))\
-                  endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
-                else\
-                  endp = (UChar* )k->u.mem.end;\
-                if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
-                  (isnull) = 0; break;\
-                }\
-                else if (endp != s) {\
-                  (isnull) = -1; /* empty, but position changed */ \
+                if (level == 0) {\
+                  if (k->u.mem.end == INVALID_STACK_INDEX) {\
+                    (isnull) = 0; break;\
+                  }\
+                  if (MEM_STATUS_AT(reg->bt_mem_end, k->zid))\
+                    endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
+                  else\
+                    endp = (UChar* )k->u.mem.end;\
+                  if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
+                    (isnull) = 0; break;\
+                  }\
+                  else if (endp != s) {\
+                    (isnull) = -1; /* empty, but position changed */\
+                  }\
                 }\
               }\
+              else if (k->type == STK_EMPTY_CHECK_START) {\
+                if (k->zid == (sid)) level++;\
+              }\
+              else if (k->type == STK_EMPTY_CHECK_END) {\
+                if (k->zid == (sid)) level--;\
+              }\
               k++;\
             }\
             break;\