diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2024-10-12 17:26:40 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2024-10-22 11:49:32 +0200 |
commit | 401d91326bc9c3a5bab2fd319acdc844f511bb7e (patch) | |
tree | 9065ae8c54d9c117788eceba34ac4b309c77ecc4 /src | |
parent | bd20d768ce9a1433182ac523ab2b6c18bb9a1649 (diff) |
conntrack: improve --mark parser
Enhance helper function to parse mark and mask (if available), bail out
if input is not correct.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/conntrack.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/conntrack.c b/src/conntrack.c index 18829db..a51a3ef 100644 --- a/src/conntrack.c +++ b/src/conntrack.c @@ -1233,17 +1233,35 @@ static int parse_value(const char *str, uint32_t *ret, uint64_t max) return 0; } -static void +static int parse_u32_mask(const char *arg, struct u32_mask *m) { - char *end; + uint64_t val, mask; + char *endptr; + + val = strtoul(arg, &endptr, 0); + if (endptr == arg || + (*endptr != '\0' && *endptr != '/') || + (val == ULONG_MAX && errno == ERANGE) || + val > UINT32_MAX) + return -1; - m->value = (uint32_t) strtoul(arg, &end, 0); + m->value = val; - if (*end == '/') - m->mask = (uint32_t) strtoul(end+1, NULL, 0); - else + if (*endptr == '/') { + mask = strtoul(endptr + 1, &endptr, 0); + if (endptr == arg || + *endptr != '\0' || + (val == ULONG_MAX && errno == ERANGE) || + val > UINT32_MAX) + return -1; + + m->mask = mask; + } else { m->mask = ~0; + } + + return 0; } static int @@ -3115,7 +3133,9 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[]) break; case 'm': options |= opt2type[c]; - parse_u32_mask(optarg, &tmpl->mark); + if (parse_u32_mask(optarg, &tmpl->mark) < 0) + exit_error(OTHER_PROBLEM, "unexpected value '%s' with -%c option", optarg, c); + tmpl->filter_mark_kernel.val = tmpl->mark.value; tmpl->filter_mark_kernel.mask = tmpl->mark.mask; tmpl->filter_mark_kernel_set = true; |