From 8174e79f59a93437b0fe02378889e27df7bfc299 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sat, 5 Jan 2008 19:57:25 +0000 Subject: [PATCH] Handle anychar (.) correctly with bounded repeaat regex expression. --- CHANGES.RUNTIME | 3 +++ lib/silcutil/silcregex.c | 40 +++++++++++++++++++---------- lib/silcutil/silctypes.h | 4 +-- lib/silcutil/tests/test_silcregex.c | 16 ++++++++++++ 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/CHANGES.RUNTIME b/CHANGES.RUNTIME index 0372c00a..b7b5e2f4 100644 --- a/CHANGES.RUNTIME +++ b/CHANGES.RUNTIME @@ -4,6 +4,9 @@ Sat Jan 5 20:19:28 EET 2008 Pekka Riikonen deleting data after regex match with SILC_STR_REGEX. Affected files are lib/silcutil/silcbuffmt.[ch]. + * Handle regex anychar (.) with bounded repeat correctly. + Affected file is lib/silcutil/silcregex.c. + Sat Jan 5 18:00:06 EET 2008 Pekka Riikonen * Added silc_buffer_equal to lib/silcutil/silcbuffer.h. diff --git a/lib/silcutil/silcregex.c b/lib/silcutil/silcregex.c index f13e8483..f08c1b61 100644 --- a/lib/silcutil/silcregex.c +++ b/lib/silcutil/silcregex.c @@ -1520,7 +1520,7 @@ SilcResult silc_re_compile_pattern(unsigned char *regex, int size, Rnormals and one Rplus. The third is compiled as n-1 Rnormals and m-n Rnormals with Roptionals. 0 values have special compilation. */ - int min, max, i; + int min, max, i, alen = 2; if (pos >= size) goto normal_char; /* Consider literal */ @@ -1530,6 +1530,16 @@ SilcResult silc_re_compile_pattern(unsigned char *regex, int size, goto normal_char; /* Consider literal */ pos -= 2; NEXTCHAR(a); + if (translate) + a = translate[(unsigned char)a]; + op = silc_regexp_plain_ops[(unsigned char)a]; + + if (op == Ranychar) { + opcode = Canychar; + a = 0; + alen = 1; + } + NEXTCHAR(ch); /* Get min value */ @@ -1559,9 +1569,10 @@ SilcResult silc_re_compile_pattern(unsigned char *regex, int size, /* Store min - 1 many Cexacts. */ for (i = 0; i < min - 1; i++) { SET_LEVEL_START; - ALLOC(2); - STORE(Cexact); - STORE((unsigned char)a); + ALLOC(alen); + STORE(opcode); + if (a) + STORE((unsigned char)a); } break; } @@ -1581,9 +1592,10 @@ SilcResult silc_re_compile_pattern(unsigned char *regex, int size, /* Store min - 1 many Cexacts. */ for (i = 0; i < min - 1; i++) { SET_LEVEL_START; - ALLOC(2); - STORE(Cexact); - STORE((unsigned char)a); + ALLOC(alen); + STORE(opcode); + if (a) + STORE((unsigned char)a); } /* Store Rplus */ @@ -1625,17 +1637,19 @@ SilcResult silc_re_compile_pattern(unsigned char *regex, int size, /* Store min - 1 many Cexacts. */ for (i = 0; min && i < min - 1; i++) { SET_LEVEL_START; - ALLOC(2); - STORE(Cexact); - STORE((unsigned char)a); + ALLOC(alen); + STORE(opcode); + if (a) + STORE((unsigned char)a); } /* Store max - min Cexacts and Roptionals. */ for (i = 0; i < max - min; i++) { SET_LEVEL_START; - ALLOC(2); - STORE(Cexact); - STORE((unsigned char)a); + ALLOC(alen); + STORE(opcode); + if (a) + STORE((unsigned char)a); ALLOC(3); INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, pattern_offset + 3); diff --git a/lib/silcutil/silctypes.h b/lib/silcutil/silctypes.h index eabb83f0..6b4ca861 100644 --- a/lib/silcutil/silctypes.h +++ b/lib/silcutil/silctypes.h @@ -313,9 +313,9 @@ typedef SilcUInt32 SilcParam; #define SILC_PARAM_REGEX 109 #define SILC_PARAM_OFFSET_START 110 #define SILC_PARAM_OFFSET_END 111 -#define SILC_PARAM_APPEND 112 -#define SILC_PARAM_DELETE 113 +#define SILC_PARAM_DELETE 112 #define SILC_PARAM_ALLOC 0x00010000 /* Allocate, bitmask */ +#define SILC_PARAM_APPEND 0x00020000 /* Append, bitmask */ /* Macros */ diff --git a/lib/silcutil/tests/test_silcregex.c b/lib/silcutil/tests/test_silcregex.c index b650f6e6..41c51ad3 100644 --- a/lib/silcutil/tests/test_silcregex.c +++ b/lib/silcutil/tests/test_silcregex.c @@ -18,6 +18,22 @@ int main(int argc, char **argv) silc_log_set_debug_string("*regex*,*errno*"); } + regex = ".{5}"; + SILC_LOG_DEBUG(("Regex %s", regex)); + string = "abcdefghijklmn"; + SILC_LOG_DEBUG(("Match %s", string)); + if (!silc_regex(string, regex, &bmatch, NULL)) + goto err; + silc_buffer_printf(&bmatch, TRUE); + + regex = "....."; + SILC_LOG_DEBUG(("Regex %s", regex)); + string = "abcdefghijklmn"; + SILC_LOG_DEBUG(("Match %s", string)); + if (!silc_regex(string, regex, &bmatch, NULL)) + goto err; + silc_buffer_printf(&bmatch, TRUE); + regex = "^a{0}$"; SILC_LOG_DEBUG(("Regex %s", regex)); string = ""; -- 2.24.0