On Sun, Sep 27, 2026 at 07:53:58AM +0100, David Laight wrote:
> On Fri, 25 Sep 2026 12:02:22 -0700
> Stanislav Fomichev <[email protected]> wrote:
> 
> > On 09/25, Breno Leitao wrote:
> > > IPv4's do_ip_getsockopt() rejects a negative optlen right after reading
> > > it. do_ipv6_getsockopt() never has, and nothing downstream treats it as
> > > an error either: len is an int, but every consumer compares it unsigned,
> > > so -1 behaves as a huge value and each site clamps to its own reply
> > > size.
> > > 
> > >   len = min_t(unsigned int, sizeof(int), len);
> > > 
> > > So getsockopt(fd, SOL_IPV6, IPV6_TCLASS, buf, &len) with len set to -1
> > > answers 4 bytes and reports 4, rather than failing.
> > > 
> > > This is a bug ready to bite us in the near future, let's get this fixed.
> > > 
> > > I've found this because testing the rest of the patch was returning
> > > inconsistency when optlen = -1.  
> > 
> > If I can do getsockopt with len=-1 today and get 4 bytes back, isn't
> > that a uapi and we are gonna break someone?
> > 
> 
> Treating negative values as 4 goes way back into the pre-historic annals,
> And I agree that there could be code out there that fails to set a value
> so passes 'dirty stack' and it always works because it never passed 0..3.
> 
> I suspect all the per-protocol code ought to be passed an unsigned 'len'
> (and return back a possibly modified value for the wrapper code to give
> to the user).
> Then you have somewhere:
>       /* Historic bug compatibility */
>       ulen = len >= 0 ? len : 4;

Ack, I will respin it and add this approach rather than -EINVAL.

Thanks for the review and suggestions,
--breno

--
pw-bot: cr

Reply via email to