From ee1d570b4e641dc18c0feeae45abce6f40bab747 Mon Sep 17 00:00:00 2001 From: dmiller Date: Fri, 1 Dec 2023 23:38:19 +0000 Subject: [PATCH] Fix an incorrect match case --- osscan.cc | 53 ++++++++++++++++++++++------------------ tests/expr_match_test.cc | 2 ++ 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/osscan.cc b/osscan.cc index 405cd2045..338ffe971 100644 --- a/osscan.cc +++ b/osscan.cc @@ -355,34 +355,39 @@ bool expr_match(const char *val, size_t vlen, const char *expr, size_t explen, b } } sublen = q ? q - p : explen - (p - expr); - if (*p == '>') { - if ((vlen > sublen - 1) - || (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) > 0)) { - return true; + if (isxdigit(*subval)) { + if (*p == '>') { + if ((vlen > sublen - 1) + || (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) > 0)) { + return true; + } + goto next_expr; } - } - else if (*p == '<') { - if ((vlen < sublen - 1) - || (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) < 0)) { - return true; - } - } else { - q1 = strchr(p, '-'); - if (q1 != NULL) { - size_t sublen1 = q1 - p; - if ((vlen > sublen1) - || (vlen == sublen1 && strncmp(subval, p, vlen) >= 0)) { - p = q1 + 1; - sublen -= (sublen1 + 1); - if ((vlen < sublen) - || (vlen == sublen && strncmp(subval, p, vlen) <= 0)) { - return true; + else if (*p == '<') { + if ((vlen < sublen - 1) + || (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) < 0)) { + return true; + } + goto next_expr; + } else { + q1 = strchr(p, '-'); + if (q1 != NULL) { + size_t sublen1 = q1 - p; + if ((vlen > sublen1) + || (vlen == sublen1 && strncmp(subval, p, vlen) >= 0)) { + p = q1 + 1; + sublen -= (sublen1 + 1); + if ((vlen < sublen) + || (vlen == sublen && strncmp(subval, p, vlen) <= 0)) { + return true; + } } + goto next_expr; } } - else if (vlen == sublen && !strncmp(p, subval, vlen)) { - return true; - } + } + if (vlen == sublen && !strncmp(p, subval, vlen)) { + return true; } next_expr: if (q) diff --git a/tests/expr_match_test.cc b/tests/expr_match_test.cc index f9069a1c9..e3a7cafce 100644 --- a/tests/expr_match_test.cc +++ b/tests/expr_match_test.cc @@ -115,6 +115,8 @@ const struct expr_test tests[] = { {"[<5]S", "2B", false}, {"[>A7]S", "FS", false}, {"[>A7]S", "A6S", false}, + {"G", "0", false}, + {"0-FFFF", "G", false}, {"", "", true} };