Messages in this thread | ![/](/images/icornerl.gif) | | From | David Laight <> | Subject | RE: [PATCH v3] netlink: Return unsigned value for nla_len() | Date | Mon, 11 Dec 2023 09:39:57 +0000 |
| |
From: Kees Cook > Sent: 06 December 2023 20:59 > > The return value from nla_len() is never expected to be negative, and can > never be more than struct nlattr::nla_len (a u16). Adjust the prototype > on the function. This will let GCC's value range optimization passes > know that the return can never be negative, and can never be larger than > u16. As recently discussed[1], this silences the following warning in > GCC 12+: > ... > -static inline int nla_len(const struct nlattr *nla) > +static inline u16 nla_len(const struct nlattr *nla) > { > return nla->nla_len - NLA_HDRLEN; > }
It also adds an explicit mask with 0xffff. I suspect that returning 'unsigned int' will silence the warning from gcc (since the error message has a huge max size).
If the value is too small copying ~64k or ~4G will both overflow the buffer. The former might (just) be exploitable, the latter will crash (so is probably better!)
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| ![\](/images/icornerr.gif) |