Re: [Patch nf 3/3] xt_hashlimit: limit the max size of hashtable
From: Cong Wang <hidden>
Date: 2020-02-02 18:27:48
Also in:
netfilter-devel
On Sat, Feb 1, 2020 at 10:16 PM Florian Westphal [off-list ref] wrote:
Cong Wang [off-list ref] wrote:quoted
quoted
In order to prevent breaking userspace, perhaps make it so that the kernel caps cfg.max at twice that value? Would allow storing up to 16777216 addresses with an average chain depth of 16 (which is quite large). We could increase the max limit in case someone presents a use case.Not sure if I understand this, I don't see how cap'ing cfg->max could help prevent breaking user-space? Are you suggesting to cap it with HASHLIMIT_MAX_SIZE too? Something like below? + if (cfg->max > 2 * HASHLIMIT_MAX_SIZE) + cfg->max = 2 * HASHLIMIT_MAX_SIZE;Yes, thats what I meant, cap the user-provided value to something thats going to be less of a problem. But now that I read it, the "2 *" part looks really silly, so I suggst to go with " > FOO_MAX", else its not a maximum value after all.
Ok, so here is what I have now:
+#define HASHLIMIT_MAX_SIZE 1048576
+
static int hashlimit_mt_check_common(const struct xt_mtchk_param *par,
struct xt_hashlimit_htable **hinfo,
struct hashlimit_cfg3 *cfg,@@ -847,6 +849,14 @@ static int hashlimit_mt_check_common(const structxt_mtchk_param *par,
if (cfg->gc_interval == 0 || cfg->expire == 0)
return -EINVAL;
+ if (cfg->size > HASHLIMIT_MAX_SIZE) {
+ cfg->size = HASHLIMIT_MAX_SIZE;
+ pr_info_ratelimited("size too large, truncated to
%u\n", cfg->size);
+ }
+ if (cfg->max > HASHLIMIT_MAX_SIZE) {
+ cfg->max = HASHLIMIT_MAX_SIZE;
+ pr_info_ratelimited("max too large, truncated to
%u\n", cfg->max);
+ }
Please let me know if it is still different with your suggestion.
Thanks!