On Sat, Feb 1, 2020 at 10:16 PM Florian Westphal <fw@xxxxxxxxx> wrote: > > Cong Wang <xiyou.wangcong@xxxxxxxxx> wrote: > > > 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 struct xt_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!