From: Vignesh Viswanathan <quic_viswanat@xxxxxxxxxxx> 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@xxxxxxxxxxx> Signed-off-by: Vignesh Viswanathan <quic_viswanat@xxxxxxxxxxx> --- 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