Date: Thu, 25 Aug 2011 00:55:19 +0000 (UTC) From: Gabor Kovesdan <gabor@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r225159 - user/gabor/tre-integration/contrib/tre/lib Message-ID: <201108250055.p7P0tJxG077695@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gabor Date: Thu Aug 25 00:55:19 2011 New Revision: 225159 URL: http://svn.freebsd.org/changeset/base/225159 Log: - Only compile shortcut if length is at least 2 - Still, fix segfault in fast matcher when len == 1 because this code may be used independently through the public interface Modified: user/gabor/tre-integration/contrib/tre/lib/tre-compile.c user/gabor/tre-integration/contrib/tre/lib/tre-fastmatch.c Modified: user/gabor/tre-integration/contrib/tre/lib/tre-compile.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/tre-compile.c Thu Aug 25 00:25:15 2011 (r225158) +++ user/gabor/tre-integration/contrib/tre/lib/tre-compile.c Thu Aug 25 00:55:19 2011 (r225159) @@ -1873,25 +1873,31 @@ tre_compile(regex_t *preg, const tre_cha /* Parse context. */ tre_parse_ctx_t parse_ctx; - /* Check if we can cheat with a fixed string algorithm. */ - shortcut = xmalloc(sizeof(fastmatch_t)); - if (!shortcut) - return REG_ESPACE; - ret = (cflags & REG_LITERAL) - ? tre_compile_literal(shortcut, regex, n, cflags) - : tre_compile_fast(shortcut, regex, n, cflags); - if (ret == REG_OK) - { - preg->shortcut = shortcut; - preg->re_nsub = 0; - DPRINT("tre_compile: pattern compiled for fast matcher\n"); - return REG_OK; - } - else + /* + * Check if we can cheat with a fixed string algorithm + * if the pattern is long enough. + */ + if (n >= 2) { - xfree(shortcut); - preg->shortcut = NULL; - DPRINT("tre_compile: pattern compilation failed for fast matcher\n"); + shortcut = xmalloc(sizeof(fastmatch_t)); + if (!shortcut) + return REG_ESPACE; + ret = (cflags & REG_LITERAL) + ? tre_compile_literal(shortcut, regex, n, cflags) + : tre_compile_fast(shortcut, regex, n, cflags); + if (ret == REG_OK) + { + preg->shortcut = shortcut; + preg->re_nsub = 0; + DPRINT("tre_compile: pattern compiled for fast matcher\n"); + return REG_OK; + } + else + { + xfree(shortcut); + preg->shortcut = NULL; + DPRINT("tre_compile: pattern compilation failed for fast matcher\n"); + } } /* Allocate a stack used throughout the compilation process for various Modified: user/gabor/tre-integration/contrib/tre/lib/tre-fastmatch.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/tre-fastmatch.c Thu Aug 25 00:25:15 2011 (r225158) +++ user/gabor/tre-integration/contrib/tre/lib/tre-fastmatch.c Thu Aug 25 00:55:19 2011 (r225159) @@ -265,7 +265,10 @@ static int fastcmp(const void *, const v fg->sbmGs = xmalloc(fg->len * sizeof(int)); \ if (!fg->sbmGs) \ return REG_ESPACE; \ - _FILL_BMGS(fg->sbmGs, fg->pattern, fg->len, false); \ + if (fg->len == 1) \ + fg->sbmGs[0] = 1; \ + else \ + _FILL_BMGS(fg->sbmGs, fg->pattern, fg->len, false); \ } /* @@ -277,7 +280,10 @@ static int fastcmp(const void *, const v fg->bmGs = xmalloc(fg->wlen * sizeof(int)); \ if (!fg->bmGs) \ return REG_ESPACE; \ - _FILL_BMGS(fg->bmGs, fg->wpattern, fg->wlen, true); \ + if (fg->wlen == 1) \ + fg->bmGs[0] = 1; \ + else \ + _FILL_BMGS(fg->bmGs, fg->wpattern, fg->wlen, true); \ } #define _FILL_BMGS(arr, pat, plen, wide) \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108250055.p7P0tJxG077695>