From: Rusty Russell Date: Mon, 23 Jun 2014 06:36:19 +0000 (+0930) Subject: tal/str: fix error when strreg regex looks for literal slashes. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=c8e75cdce11b3ad7db6c1fff580c587395b59965 tal/str: fix error when strreg regex looks for literal slashes. Signed-off-by: Rusty Russell --- diff --git a/ccan/tal/str/str.c b/ccan/tal/str/str.c index 237652f7..059817b6 100644 --- a/ccan/tal/str/str.c +++ b/ccan/tal/str/str.c @@ -236,9 +236,31 @@ fail: goto out; } +static size_t count_open_braces(const char *string) +{ +#if 1 + size_t num = 0, esc = 0; + + while (*string) { + if (*string == '\\') + esc++; + else { + /* An odd number of \ means it's escaped. */ + if (*string == '(' && (esc & 1) == 0) + num++; + esc = 0; + } + string++; + } + return num; +#else + return strcount(string, "("); +#endif +} + bool tal_strreg(const tal_t *ctx, const char *string, const char *regex, ...) { - size_t nmatch = 1 + strcount(regex, "("); + size_t nmatch = 1 + count_open_braces(regex); regmatch_t matches[nmatch]; regex_t r; bool ret = false; diff --git a/ccan/tal/str/test/run-strreg.c b/ccan/tal/str/test/run-strreg.c index 6d126f39..fa8a86c6 100644 --- a/ccan/tal/str/test/run-strreg.c +++ b/ccan/tal/str/test/run-strreg.c @@ -21,7 +21,7 @@ int main(int argc, char *argv[]) /* If it accesses this, it will crash. */ char **invalid = (char **)1L; - plan_tests(40); + plan_tests(41); /* Simple matching. */ ok1(tal_strreg(ctx, "hello world!", "hello") == true); ok1(tal_strreg(ctx, "hello world!", "hi") == false); @@ -116,5 +116,9 @@ int main(int argc, char *argv[]) ok1(no_children(ctx)); tal_free(ctx); + /* Don't get fooled by \(! */ + ok1(tal_strreg(ctx, "(hello) (world)!", "\\([a-z]*\\) \\([a-z]+\\)", + invalid) == true); + return exit_status(); }