Re: [PATCH v4 net 0/4] dccp/tcp: Fix bhash2 issues related to WARN_ON() in inet_csk_get_port().
Eric Dumazet <[email protected]>
| Newsgroups | org.kernel.vger.dccp,org.kernel.vger.netdev |
|---|---|
| Message-ID | <CANn89iLTh6OPb0LLcAnfzZPt8jDtfyUo5xDA4c0gL4534xmiOg@mail.gmail.com> |
On Fri, Nov 18, 2022 at 5:49 PM Kuniyuki Iwashima <[email protected]> wrote: > > syzkaller was hitting a WARN_ON() in inet_csk_get_port() in the 4th patch, > which was because we forgot to fix up bhash2 bucket when connect() for a > socket bound to a wildcard address fails in __inet_stream_connect(). > > There was a similar report [0], but its repro does not fire the WARN_ON() due > to inconsistent error handling. > > When connect() for a socket bound to a wildcard address fails, saddr may or > may not be reset depending on where the failure happens. When we fail in > __inet_stream_connect(), sk->sk_prot->disconnect() resets saddr. OTOH, in > (dccp|tcp)_v[46]_connect(), if we fail after inet_hash6?_connect(), we > forget to reset saddr. > > We fix this inconsistent error handling in the 1st patch, and then we'll > fix the bhash2 WARN_ON() issue. > > Note that there is still an issue in that we reset saddr without checking > if there are conflicting sockets in bhash and bhash2, but this should be > another series. > > See [1][2] for the previous discussion. > > [0]: https://lore.kernel.org/netdev/[email protected]/ > [1]: https://lore.kernel.org/netdev/[email protected]/ > [2]: https://lore.kernel.org/netdev/[email protected]/ > [3]: https://lore.kernel.org/netdev/[email protected]/T/#m00aafedb29ff0b55d5e67aef0252ef1baaf4b6ee > > > Changes: > v4: > * Patch 3 > * Narrow down the bhash lock section (Joanne Koong) > > v3: https://lore.kernel.org/netdev/[email protected]/ > * Patch 3 > * Update saddr under the bhash's lock > * Correct Fixes tag > * Change #ifdef in inet_update_saddr() along the recent > discussion [3] > > v2: https://lore.kernel.org/netdev/[email protected]/ > * Add patch 2-4 > > v1: [2] > > > Kuniyuki Iwashima (4): > dccp/tcp: Reset saddr on failure after inet6?_hash_connect(). > dccp/tcp: Remove NULL check for prev_saddr in > inet_bhash2_update_saddr(). > dccp/tcp: Update saddr under bhash's lock. > dccp/tcp: Fixup bhash2 bucket when connect() fails. SGTM, thanks ! Reviewed-by: Eric Dumazet <[email protected]>