On Wed, 2020-04-29 at 11:10 -0700, Jakub Kicinski wrote: > > +static int nla_validate_int_range_unsigned(const struct nla_policy *pt, > > + const struct nlattr *nla, > > + struct netlink_ext_ack *extack) > > { > > - bool validate_min, validate_max; > > - s64 value; > > + struct netlink_range_validation _range = { > > + .min = 0, > > + .max = U64_MAX, > > + }, *range = &_range; > > + u64 value; > > > > - validate_min = pt->validation_type == NLA_VALIDATE_RANGE || > > - pt->validation_type == NLA_VALIDATE_MIN; > > - validate_max = pt->validation_type == NLA_VALIDATE_RANGE || > > - pt->validation_type == NLA_VALIDATE_MAX; > > + WARN_ON_ONCE(pt->min < 0 || pt->max < 0); > > I'm probably missing something, but in case of NLA_VALIDATE_RANGE_PTR > aren't min and max invalid (union has the range pointer set, so this > will read 2 bytes of the pointer). No, you're right of course. It's reading 4 bytes, actually, they're both s16. Which I did because that's the maximum range that doesn't increase the size on 32-bit. I could move it into the switch, but, hm.. the unused ones (min/max if only one is used) should be 0, so I guess just WARN_ON_ONCE(pt->validation_type != NLA_VALIDATE_RANGE_PTR && (pt->min < 0 || pt->max < 0)); will be fine. Thanks! johannes