From: Sidraya Jayagond <sidraya@linux.ibm.com>
To: hexlabsecurity@proton.me, Dust Li <dust.li@linux.alibaba.com>,
Paolo Abeni <pabeni@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
Wenjia Zhang <wenjia@linux.ibm.com>,
"D. Wythe" <alibuda@linux.alibaba.com>,
Mahanta Jambigi <mjambigi@linux.ibm.com>,
Tony Lu <tonylu@linux.alibaba.com>,
Wen Gu <guwen@linux.alibaba.com>,
Eric Dumazet <edumazet@google.com>
Cc: linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org,
netdev@vger.kernel.org, Simon Horman <horms@kernel.org>,
linux-s390@vger.kernel.org
Subject: Re: [PATCH net v2 2/2] net/smc: do not dereference an unset send buffer on the SMC-D teardown path
Date: Thu, 13 Aug 2026 11:17:23 +0530 [thread overview]
Message-ID: <d5a0c244-5dae-4cab-a583-554916f3a827@linux.ibm.com> (raw)
In-Reply-To: <20260808-b4-disp-22f119e6-v2-2-61647601a6f3@proton.me>
On 08/08/26 12:51 pm, Bryam Vargas via B4 Relay wrote:
> From: Bryam Vargas <hexlabsecurity@proton.me>
>
> smc_close_stream_wait() calls smc_tx_prepared_sends() from inside its
> sk_wait_event() condition, and sk_wait_event() evaluates that condition
> once with the socket lock released. smcd_buf_detach() clears
> conn->sndbuf_desc from smc_conn_kill() under lock_sock(), so a link group
> terminating while a socket waits there leaves the helper dereferencing
> NULL, faulting out of close(). SIOCOUTQ reads the field by hand, and
> smc_close_cancel_work() drops the lock across two cancel_*_sync() calls.
>
> Sample the pointer once in the helper, report nothing prepared while it is
> unset, and bound the ioctl the same way. The receive tasklet dereferences
> the field directly in smc_cdc_msg_recv_action(), not through this helper;
> 1/2 is what keeps it from running that late.
>
> Fixes: ae2be35cbed2 ("net/smc: {at|de}tach sndbuf to peer DMB if supported")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
> ---
> net/smc/af_smc.c | 3 ++-
> net/smc/smc_tx.h | 6 +++++-
> 2 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
> index 00403175b740..cff910cedbfc 100644
> --- a/net/smc/af_smc.c
> +++ b/net/smc/af_smc.c
> @@ -3233,7 +3233,8 @@ int smc_ioctl(struct socket *sock, unsigned int cmd,
> return -EINVAL;
> }
> if (smc->sk.sk_state == SMC_INIT ||
> - smc->sk.sk_state == SMC_CLOSED)
> + smc->sk.sk_state == SMC_CLOSED ||
> + !READ_ONCE(smc->conn.sndbuf_desc))
> answ = 0;
> else
> answ = smc->conn.sndbuf_desc->len -
> diff --git a/net/smc/smc_tx.h b/net/smc/smc_tx.h
> index a59f370b8b43..610a945aefd6 100644
> --- a/net/smc/smc_tx.h
> +++ b/net/smc/smc_tx.h
> @@ -20,11 +20,15 @@
>
> static inline int smc_tx_prepared_sends(struct smc_connection *conn)
> {
> + struct smc_buf_desc *sndbuf_desc = READ_ONCE(conn->sndbuf_desc);
> union smc_host_cursor sent, prep;
>
> + if (!sndbuf_desc)
> + return 0;
> +
> smc_curs_copy(&sent, &conn->tx_curs_sent, conn);
> smc_curs_copy(&prep, &conn->tx_curs_prep, conn);
> - return smc_curs_diff(conn->sndbuf_desc->len, &sent, &prep);
> + return smc_curs_diff(sndbuf_desc->len, &sent, &prep);
> }
>
> void smc_tx_pending(struct smc_connection *conn);
>
Reviewed-by: Sidraya Jayagond <sidraya@linux.ibm.com>
next prev parent reply other threads:[~2026-08-13 5:47 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-08 7:21 [PATCH net v2 0/2] net/smc: close the SMC-D teardown window around the ghost send buffer Bryam Vargas via B4 Relay
2026-08-08 7:21 ` [PATCH net v2 1/2] net/smc: unregister the connection before draining the rx tasklet Bryam Vargas via B4 Relay
2026-08-13 5:47 ` Sidraya Jayagond
2026-08-13 7:29 ` Tony Lu
2026-08-08 7:21 ` [PATCH net v2 2/2] net/smc: do not dereference an unset send buffer on the SMC-D teardown path Bryam Vargas via B4 Relay
2026-08-13 5:47 ` Sidraya Jayagond [this message]
2026-08-13 7:29 ` Tony Lu
2026-08-13 0:10 ` [PATCH net v2 0/2] net/smc: close the SMC-D teardown window around the ghost send buffer Jakub Kicinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d5a0c244-5dae-4cab-a583-554916f3a827@linux.ibm.com \
--to=sidraya@linux.ibm.com \
--cc=alibuda@linux.alibaba.com \
--cc=davem@davemloft.net \
--cc=dust.li@linux.alibaba.com \
--cc=edumazet@google.com \
--cc=guwen@linux.alibaba.com \
--cc=hexlabsecurity@proton.me \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mjambigi@linux.ibm.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=tonylu@linux.alibaba.com \
--cc=wenjia@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox