Messages in this thread Patch in this message | | | From | Sricharan Ramabadhran <> | Subject | [PATCH net-next 1/2] net: qrtr: Prevent stale ports from sending | Date | Fri, 1 Sep 2023 15:50:20 +0530 |
| |
From: Vignesh Viswanathan <quic_viswanat@quicinc.com>
If qrtr and some other process try to bind to the QMI Control port at the same time, NEW_SERVER might come before ENETRESET is given to the socket. This might cause a socket down/up when ENETRESET is received as per the protocol and this triggers a DEL_SERVER and a second NEW_SERVER.
In order to prevent such messages from stale sockets being sent, check if ENETRESET has been set on the socket and drop the packet.
Signed-off-by: Chris Lew <quic_clew@quicinc.com> Signed-off-by: Vignesh Viswanathan <quic_viswanat@quicinc.com> --- net/qrtr/af_qrtr.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 41ece61..26197a0 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -851,6 +851,7 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, { struct qrtr_sock *ipc; struct qrtr_cb *cb; + struct sock *sk = skb->sk; ipc = qrtr_port_lookup(to->sq_port); if (!ipc || &ipc->sk == skb->sk) { /* do not send to self */ @@ -860,6 +861,15 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, return -ENODEV; } + /* Keep resetting NETRESET until socket is closed */ + if (sk && sk->sk_err == ENETRESET) { + sk->sk_err = ENETRESET; + sk_error_report(sk); + qrtr_port_put(ipc); + kfree_skb(skb); + return 0; + } + cb = (struct qrtr_cb *)skb->cb; cb->src_node = from->sq_node; cb->src_port = from->sq_port; -- 2.7.4
| |