diff options
author | Dmitry Mikhirev | 2015-01-24 14:31:23 +0300 |
---|---|---|
committer | Dmitry Mikhirev | 2015-01-24 14:31:23 +0300 |
commit | 15f22648cd99f392ac5cab6afeec2a0e97b85c6d (patch) | |
tree | 5c94d011d1ae45d066a21d550a85f3f77564ed96 /pcre.c | |
parent | 2b494614096cdb578993b473b1f4ac93cd4dce1a (diff) | |
download | make_pcre-0.3.1.tar.gz make_pcre-0.3.1.tar.bz2 make_pcre-0.3.1.tar.xz make_pcre-0.3.1.zip |
fixed global search hang when zero-length matching foundv0.3.1
Diffstat (limited to 'pcre.c')
-rw-r--r-- | pcre.c | 31 |
1 files changed, 29 insertions, 2 deletions
@@ -389,7 +389,17 @@ static char *match(const char *name, int argc, char **argv) retstr[retlen] = '\0'; /* where to start next search */ - offset = ovec[1]; + if (offset == ovec[1]) { //zero-length match + if (offset < len) { + // continue with one character shift + offset++; + } else { + // stop global search + global = 0; + } + } else { + offset = ovec[1]; + } /* set named make vars to captured substrings */ set_named_vars(re, str, ovec, ncap); @@ -513,7 +523,24 @@ static char *subst(const char *name, int argc, char **argv) rep = NULL; /* where to start next search */ - offset = ovec[1]; + if (offset == ovec[1]) { //zero-length match + if (offset < subjlen) { + // continue with one character shift + s = str_extend(retstr, retlen + 1); + if (s == NULL) { + goto end_subst; + } + retstr = s; + strncpy(retstr + retlen, str + offset, 1); + retlen++; + offset++; + } else { + // stop global search + global = 0; + } + } else { + offset = ovec[1]; + } } } while (global && (ncap != PCRE_ERROR_NOMATCH)); |