From f87380994e9d2df719d483664e776e475e27d221 Mon Sep 17 00:00:00 2001 From: Sébastien Marie Date: Mon, 22 Jun 2015 13:42:08 +0200 Subject: several cosmetics fixes + add a new error checking - there is no need to escape "%" with "%%" in error message - corrects a comment - add a check for error --- httpd/patterns.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/httpd/patterns.c b/httpd/patterns.c index 8fbaa28..1dbea15 100644 --- a/httpd/patterns.c +++ b/httpd/patterns.c @@ -215,7 +215,7 @@ matchbalance(struct match_state *ms, const char *s, const char *p) { if (p >= ms->p_end - 1) { match_error(ms, - "malformed pattern (missing arguments to '%%b')"); + "malformed pattern (missing arguments to '%b')"); return (NULL); } if (*s != *p) @@ -308,6 +308,8 @@ match_capture(struct match_state *ms, const char *s, int l) { size_t len; l = check_capture(ms, l); + if (l == -1) + return NULL; len = ms->capture[l].len; if ((size_t) (ms->src_end - s) >= len && memcmp(ms->capture[l].init, s, len) == 0) @@ -370,7 +372,7 @@ match(struct match_state *ms, const char *s, const char *p) p += 2; if (*p != '[') { match_error(ms, "missing '['" - " after '%%f' in pattern"); + " after '%f' in pattern"); break; } /* points to what is next */ @@ -667,7 +669,7 @@ str_match(const char *string, const char *pattern, struct str_match *m, ret = str_find_aux(&ms, pattern, string, sm, nsm, 0); if (ret == 0 || ms.error != NULL) { - /* Return 0 on error and store the error string */ + /* Return -1 on error and store the error string */ *errstr = ms.error; return (-1); } -- cgit v1.2.3-54-g00ecf From 95318c663159a0143edbe41e2e8c94bc057276a8 Mon Sep 17 00:00:00 2001 From: Sébastien Marie Date: Mon, 22 Jun 2015 13:44:20 +0200 Subject: add regress testsuite for patterns --- regress/patterns/Makefile | 20 ++++++++ regress/patterns/patterns-tester.c | 98 ++++++++++++++++++++++++++++++++++++++ regress/patterns/test-patterns.in | 23 +++++++++ regress/patterns/test-patterns.out | 87 +++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 regress/patterns/Makefile create mode 100644 regress/patterns/patterns-tester.c create mode 100644 regress/patterns/test-patterns.in create mode 100644 regress/patterns/test-patterns.out diff --git a/regress/patterns/Makefile b/regress/patterns/Makefile new file mode 100644 index 0000000..024f96e --- /dev/null +++ b/regress/patterns/Makefile @@ -0,0 +1,20 @@ +# $OpenBSD$ + +HTTPDSRC = ${.CURDIR}/../../httpd + +.PATH: ${HTTPDSRC} + +REGRESS_TARGETS= test-patterns + +CLEANFILES += patterns-tester + +patterns-tester: patterns-tester.c patterns.c patterns.h + ${CC} -o $@ ${CFLAGS} ${.CURDIR}/patterns-tester.c ${HTTPDSRC}/patterns.c -I${HTTPDSRC} + +test-patterns: patterns-tester test-patterns.out test-patterns.in + cat ${.CURDIR}/test-patterns.in | grep -v '^#' | \ + while IFS=' ' read string pattern comments ; do \ + ./patterns-tester "$${string}" "$${pattern}" 2>&1 || true; \ + done | diff -I 'OpenBSD' -u ${.CURDIR}/test-patterns.out - + +.include diff --git a/regress/patterns/patterns-tester.c b/regress/patterns/patterns-tester.c new file mode 100644 index 0000000..9134c0c --- /dev/null +++ b/regress/patterns/patterns-tester.c @@ -0,0 +1,98 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2015 Sebastien Marie + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +#include "patterns.h" + +extern char * malloc_options; + +static void read_string(char *, size_t); +static void read_string_stop(void); + +static void +read_string(char *buf, size_t len) +{ + size_t i; + + /* init */ + bzero(buf, len); + + /* read */ + if (fgets(buf, len, stdin) == NULL) + err(1, "fgets"); + + /* strip '\n' */ + i = strnlen(buf, len); + if (i != 0) + buf[i-1] = '\0'; +} + +static void +read_string_stop() +{ + if (getchar() != EOF) + errx(1, "read_string_stop: too many input"); +} + +int +main(int argc, char *argv[]) +{ + char string[1024]; + char pattern[1024]; + struct str_match m; + const char *errstr = NULL; + int ret; + size_t i; + + /* configure malloc */ + malloc_options = "S"; + + /* read testcase */ + if (argc != 3) { + /* from stdin (useful for afl) */ + read_string(string, sizeof(string)); + read_string(pattern, sizeof(pattern)); + read_string_stop(); + } else { + /* from arguments */ + strlcpy(string, argv[1], sizeof(string)); + strlcpy(pattern, argv[2], sizeof(pattern)); + } + + /* print testcase */ + printf("string='%s'\n", string); + printf("pattern='%s'\n", pattern); + + /* test it ! */ + ret = str_match(string, pattern, &m, &errstr); + if (errstr != NULL) + errx(1, "str_match: %s", errstr); + + /* print result */ + printf("ret=%d num=%d\n", ret, m.sm_nmatch); + for (i=0; i