mirror of
https://github.com/nmap/nmap.git
synced 2026-08-04 06:40:48 +00:00
Handle leading zeroes in expr_match
This commit is contained in:
parent
e47b742669
commit
96995a92d9
2 changed files with 66 additions and 5 deletions
43
osscan.cc
43
osscan.cc
|
|
@ -354,30 +354,59 @@ bool expr_match(const char *val, size_t vlen, const char *expr, size_t explen, b
|
|||
if ((explen - (p - expr)) == sublen && !strncmp(subval, p, sublen)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
goto next_expr;
|
||||
}
|
||||
}
|
||||
// Now sublen is the length of the relevant portion of expr
|
||||
sublen = q ? q - p : explen - (p - expr);
|
||||
if (isxdigit(*subval)) {
|
||||
while (*subval == '0' && vlen > 1) {
|
||||
subval++;
|
||||
vlen--;
|
||||
}
|
||||
if (*p == '>') {
|
||||
if ((vlen > sublen - 1)
|
||||
|| (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) > 0)) {
|
||||
do {
|
||||
p++;
|
||||
sublen--;
|
||||
} while (*p == '0' && sublen > 1);
|
||||
if ((vlen > sublen)
|
||||
|| (vlen == sublen && strncmp(subval, p, vlen) > 0)) {
|
||||
return true;
|
||||
}
|
||||
goto next_expr;
|
||||
}
|
||||
else if (*p == '<') {
|
||||
if ((vlen < sublen - 1)
|
||||
|| (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) < 0)) {
|
||||
do {
|
||||
p++;
|
||||
sublen--;
|
||||
} while (*p == '0' && sublen > 1);
|
||||
if ((vlen < sublen)
|
||||
|| (vlen == sublen && strncmp(subval, p, vlen) < 0)) {
|
||||
return true;
|
||||
}
|
||||
goto next_expr;
|
||||
} else {
|
||||
}
|
||||
else if (isxdigit(*p)) {
|
||||
while (sublen > 1 && *p == '0') {
|
||||
p++;
|
||||
sublen--;
|
||||
}
|
||||
q1 = strchr_p(p, q ? q : p_end, '-');
|
||||
if (q1 != NULL) {
|
||||
if (q1 == p) {
|
||||
p--;
|
||||
sublen++;
|
||||
}
|
||||
size_t sublen1 = q1 - p;
|
||||
if ((vlen > sublen1)
|
||||
|| (vlen == sublen1 && strncmp(subval, p, vlen) >= 0)) {
|
||||
p = q1 + 1;
|
||||
sublen -= (sublen1 + 1);
|
||||
while (sublen > 1 && *p == '0') {
|
||||
p++;
|
||||
sublen--;
|
||||
}
|
||||
if ((vlen < sublen)
|
||||
|| (vlen == sublen && strncmp(subval, p, vlen) <= 0)) {
|
||||
return true;
|
||||
|
|
@ -386,6 +415,10 @@ bool expr_match(const char *val, size_t vlen, const char *expr, size_t explen, b
|
|||
goto next_expr;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// subval isxdigit, but expr doesn't start with xdigit or < or >
|
||||
goto next_expr;
|
||||
}
|
||||
}
|
||||
//fprintf(stderr, "cmp(%-.*s, %-.*s)\n", sublen, p, vlen, subval);
|
||||
if (vlen == sublen && !strncmp(p, subval, vlen)) {
|
||||
|
|
|
|||
|
|
@ -153,6 +153,34 @@ const struct expr_test tests[] = {
|
|||
{"M[500|5B4]ST11NW[7-9]", "M500ST11NWA", false},
|
||||
{"M[500|5B4]ST11NW[7-9]", "M5B40ST11NW9", false},
|
||||
{"A|20-22", "A", true},
|
||||
{"00-05", "0", true},
|
||||
{"00-05", "4", true},
|
||||
{"00-05", "5", true},
|
||||
{">0000", "5", true},
|
||||
{">0000", "0", false},
|
||||
{"<6", "00", true},
|
||||
{"<06", "07", false},
|
||||
{"<06", "7", false},
|
||||
{"0", "00", true},
|
||||
{"1", "01", true},
|
||||
{"1", "001", true},
|
||||
{"1", "0001", true},
|
||||
{"00", "0", true},
|
||||
{"01", "1", true},
|
||||
{"001", "1", true},
|
||||
{"0001", "1", true},
|
||||
{"A", "0A", true},
|
||||
{"A", "00A", true},
|
||||
{"A", "000A", true},
|
||||
{"0A", "A", true},
|
||||
{"00A", "A", true},
|
||||
{"000A", "A", true},
|
||||
{"1", "0A", false},
|
||||
{"1", "00A", false},
|
||||
{"1", "000A", false},
|
||||
{"01", "A", false},
|
||||
{"001", "A", false},
|
||||
{"0001", "A", false},
|
||||
{"", "", true}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue