Add nf_ct_helper_parse_uint() for bounded unsigned integer parsing from an unterminated buffer, and nf_ct_helper_parse_port() which calls it with max=65535 and rejects port zero. Both helpers are exported so conntrack protocol helpers can replace ad-hoc simple_strtoul() usage. Signed-off-by: HACKE-RC --- include/net/netfilter/nf_conntrack_helper.h | 5 +++ net/netfilter/nf_conntrack_helper.c | 39 +++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/net/netfilter/nf_conntrack_helper.h b/include/net/netfilter/nf_conntrack_helper.h index de2f956ab..ab145fcd9 100644 --- a/include/net/netfilter/nf_conntrack_helper.h +++ b/include/net/netfilter/nf_conntrack_helper.h @@ -160,6 +160,11 @@ nf_ct_helper_expectfn_find_by_name(const char *name); struct nf_ct_helper_expectfn * nf_ct_helper_expectfn_find_by_symbol(const void *symbol); +int nf_ct_helper_parse_uint(const char *cp, unsigned int len, + unsigned long max, unsigned long *val, char **endp); +int nf_ct_helper_parse_port(const char *cp, unsigned int len, + u16 *port, char **endp); + extern struct hlist_head *nf_ct_helper_hash; extern unsigned int nf_ct_helper_hsize; diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index a715304a5..f6229957c 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c @@ -499,6 +499,45 @@ void nf_nat_helper_unregister(struct nf_conntrack_nat_helper *nat) } EXPORT_SYMBOL_GPL(nf_nat_helper_unregister); +int nf_ct_helper_parse_uint(const char *cp, unsigned int len, + unsigned long max, unsigned long *val, char **endp) +{ + unsigned long result = 0; + + if (!len || *cp < '0' || *cp > '9') + return -1; + + while (len > 0 && *cp >= '0' && *cp <= '9') { + result = result * 10 + (*cp - '0'); + if (result > max) + return -1; + cp++; + len--; + } + + *val = result; + if (endp) + *endp = (char *)cp; + + return 0; +} +EXPORT_SYMBOL_GPL(nf_ct_helper_parse_uint); + +int nf_ct_helper_parse_port(const char *cp, unsigned int len, + u16 *port, char **endp) +{ + unsigned long val; + + if (nf_ct_helper_parse_uint(cp, len, 65535, &val, endp)) + return -1; + if (val == 0) + return -1; + + *port = val; + return 0; +} +EXPORT_SYMBOL_GPL(nf_ct_helper_parse_port); + int nf_conntrack_helper_init(void) { nf_ct_helper_hsize = 1; /* gets rounded up to use one page */ -- 2.54.0