X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fregex%2Fregexec.c;h=16c5d0ac5c7b5ae6f4a7aaa9313d474682ef6a85;hb=140ad50cbf9244eecc21a0126c743396a34e8106;hp=674c5907fe7ec2e0de0f3450ca932e459cd90b49;hpb=21f01e1bf951dc3c543bb53de4d001dd4194da84;p=musl diff --git a/src/regex/regexec.c b/src/regex/regexec.c index 674c5907..16c5d0ac 100644 --- a/src/regex/regexec.c +++ b/src/regex/regexec.c @@ -52,7 +52,7 @@ tre_fill_pmatch(size_t nmatch, regmatch_t pmatch[], int cflags, #define GET_NEXT_WCHAR() do { \ prev_c = next_c; pos += pos_add_next; \ if ((pos_add_next = mbtowc(&next_c, str_byte, MB_LEN_MAX)) <= 0) { \ - if (pos_add_next < 0) return REG_NOMATCH; \ + if (pos_add_next < 0) { ret = REG_NOMATCH; goto error_exit; } \ else pos_add_next++; \ } \ str_byte += pos_add_next; \ @@ -181,6 +181,7 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, int reg_notbol = eflags & REG_NOTBOL; int reg_noteol = eflags & REG_NOTEOL; int reg_newline = tnfa->cflags & REG_NEWLINE; + reg_errcode_t ret; char *buf; tre_tnfa_transition_t *trans_i; @@ -439,11 +440,11 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, reach_next_i->state = NULL; } - if (buf) - xfree(buf); - *match_end_ofs = match_eo; - return match_eo >= 0 ? REG_OK : REG_NOMATCH; + ret = match_eo >= 0 ? REG_OK : REG_NOMATCH; +error_exit: + xfree(buf); + return ret; } @@ -596,6 +597,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string, started from. */ int next_c_start; const char *str_byte_start; + int pos_start = -1; #ifdef TRE_MBSTATE mbstate_t mbstate_start; #endif /* TRE_MBSTATE */ @@ -675,7 +677,9 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string, } state = NULL; + pos = pos_start; GET_NEXT_WCHAR(); + pos_start = pos; next_c_start = next_c; str_byte_start = str_byte; #ifdef TRE_MBSTATE @@ -980,6 +984,7 @@ regexec(const regex_t *restrict preg, const char *restrict string, tre_tnfa_t *tnfa = (void *)preg->TRE_REGEX_T_FIELD; reg_errcode_t status; int *tags = NULL, eo; + if (tnfa->cflags & REG_NOSUB) nmatch = 0; if (tnfa->num_tags > 0 && nmatch > 0) { tags = xmalloc(sizeof(*tags) * tnfa->num_tags);