summaryrefslogtreecommitdiffstats
path: root/net/rxrpc
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-08-24 13:06:14 +0100
committerDavid Howells <dhowells@redhat.com>2016-08-24 13:06:14 +0100
commit2266ffdef5737fdfa96005204fc5606dbd559956 (patch)
treed56e7e0fecb29ebd45772460e3e248084cb58eab /net/rxrpc
parent5d77dca82839ef016a93ad7acd7058b14d967752 (diff)
downloadlinux-stable-2266ffdef5737fdfa96005204fc5606dbd559956.tar.gz
linux-stable-2266ffdef5737fdfa96005204fc5606dbd559956.tar.bz2
linux-stable-2266ffdef5737fdfa96005204fc5606dbd559956.zip
rxrpc: Fix conn-based retransmit
If a duplicate packet comes in for a call that has just completed on a connection's channel then there will be an oops in the data_ready handler because it tries to examine the connection struct via a call struct (which we don't have - the pointer is unset). Since the connection struct pointer is available to us, go direct instead. Also, the ACK packet to be retransmitted needs three octets of padding between the soft ack list and the ackinfo. Fixes: 18bfeba50dfd0c8ee420396f2570f16a0bdbd7de ("rxrpc: Perform terminal call ACK/ABORT retransmission from conn processor") Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'net/rxrpc')
-rw-r--r--net/rxrpc/conn_event.c1
-rw-r--r--net/rxrpc/input.c2
2 files changed, 2 insertions, 1 deletions
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c
index c1c6b7f305d1..6296374df840 100644
--- a/net/rxrpc/conn_event.c
+++ b/net/rxrpc/conn_event.c
@@ -42,6 +42,7 @@ static void rxrpc_conn_retransmit(struct rxrpc_connection *conn,
} abort;
struct {
struct rxrpc_ackpacket ack;
+ u8 padding[3];
struct rxrpc_ackinfo info;
};
};
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
index 66cdeb56f44f..5e683dd21ab9 100644
--- a/net/rxrpc/input.c
+++ b/net/rxrpc/input.c
@@ -732,7 +732,7 @@ void rxrpc_data_ready(struct sock *sk)
/* For the previous service call, if completed
* successfully, we discard all further packets.
*/
- if (rxrpc_conn_is_service(call->conn) &&
+ if (rxrpc_conn_is_service(conn) &&
(chan->last_type == RXRPC_PACKET_TYPE_ACK ||
sp->hdr.type == RXRPC_PACKET_TYPE_ABORT))
goto discard_unlock;