aboutsummaryrefslogtreecommitdiff
path: root/pcre.c
diff options
context:
space:
mode:
authorDmitry Mikhirev2015-01-24 14:31:23 +0300
committerDmitry Mikhirev2015-01-24 14:31:23 +0300
commit15f22648cd99f392ac5cab6afeec2a0e97b85c6d (patch)
tree5c94d011d1ae45d066a21d550a85f3f77564ed96 /pcre.c
parent2b494614096cdb578993b473b1f4ac93cd4dce1a (diff)
downloadmake_pcre-15f22648cd99f392ac5cab6afeec2a0e97b85c6d.tar.gz
make_pcre-15f22648cd99f392ac5cab6afeec2a0e97b85c6d.tar.bz2
make_pcre-15f22648cd99f392ac5cab6afeec2a0e97b85c6d.tar.xz
make_pcre-15f22648cd99f392ac5cab6afeec2a0e97b85c6d.zip
fixed global search hang when zero-length matching foundv0.3.1
Diffstat (limited to 'pcre.c')
-rw-r--r--pcre.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/pcre.c b/pcre.c
index 9da5387..3245d79 100644
--- a/pcre.c
+++ b/pcre.c
@@ -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));