Skip to content

Commit f029567

Browse files
dhowellskuba-moo
authored andcommitted
rxrpc: Fix to use conn aborts for conn-wide failures
Fix rxrpc to use connection-level aborts for things that affect the whole connection, such as the service ID not matching a local service. Fixes: 57af281 ("rxrpc: Tidy up abort generation infrastructure") Reported-by: Jeffrey Altman <[email protected]> Signed-off-by: David Howells <[email protected]> Reviewed-by: Jeffrey Altman <[email protected]> cc: Marc Dionne <[email protected]> cc: Simon Horman <[email protected]> cc: [email protected] Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent e9c0b96 commit f029567

File tree

5 files changed

+37
-19
lines changed

5 files changed

+37
-19
lines changed

net/rxrpc/ar-internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ enum rxrpc_skb_mark {
4444
RXRPC_SKB_MARK_SERVICE_CONN_SECURED, /* Service connection response has been verified */
4545
RXRPC_SKB_MARK_REJECT_BUSY, /* Reject with BUSY */
4646
RXRPC_SKB_MARK_REJECT_ABORT, /* Reject with ABORT (code in skb->priority) */
47+
RXRPC_SKB_MARK_REJECT_CONN_ABORT, /* Reject with connection ABORT (code in skb->priority) */
4748
};
4849

4950
/*
@@ -1253,6 +1254,8 @@ int rxrpc_encap_rcv(struct sock *, struct sk_buff *);
12531254
void rxrpc_error_report(struct sock *);
12541255
bool rxrpc_direct_abort(struct sk_buff *skb, enum rxrpc_abort_reason why,
12551256
s32 abort_code, int err);
1257+
bool rxrpc_direct_conn_abort(struct sk_buff *skb, enum rxrpc_abort_reason why,
1258+
s32 abort_code, int err);
12561259
int rxrpc_io_thread(void *data);
12571260
void rxrpc_post_response(struct rxrpc_connection *conn, struct sk_buff *skb);
12581261
static inline void rxrpc_wake_up_io_thread(struct rxrpc_local *local)

net/rxrpc/call_accept.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,8 @@ bool rxrpc_new_incoming_call(struct rxrpc_local *local,
374374
spin_lock(&rx->incoming_lock);
375375
if (rx->sk.sk_state == RXRPC_SERVER_LISTEN_DISABLED ||
376376
rx->sk.sk_state == RXRPC_CLOSE) {
377-
rxrpc_direct_abort(skb, rxrpc_abort_shut_down,
378-
RX_INVALID_OPERATION, -ESHUTDOWN);
377+
rxrpc_direct_conn_abort(skb, rxrpc_abort_shut_down,
378+
RX_INVALID_OPERATION, -ESHUTDOWN);
379379
goto no_call;
380380
}
381381

@@ -422,12 +422,12 @@ bool rxrpc_new_incoming_call(struct rxrpc_local *local,
422422

423423
unsupported_service:
424424
read_unlock_irq(&local->services_lock);
425-
return rxrpc_direct_abort(skb, rxrpc_abort_service_not_offered,
426-
RX_INVALID_OPERATION, -EOPNOTSUPP);
425+
return rxrpc_direct_conn_abort(skb, rxrpc_abort_service_not_offered,
426+
RX_INVALID_OPERATION, -EOPNOTSUPP);
427427
unsupported_security:
428428
read_unlock_irq(&local->services_lock);
429-
return rxrpc_direct_abort(skb, rxrpc_abort_service_not_offered,
430-
RX_INVALID_OPERATION, -EKEYREJECTED);
429+
return rxrpc_direct_conn_abort(skb, rxrpc_abort_service_not_offered,
430+
RX_INVALID_OPERATION, -EKEYREJECTED);
431431
no_call:
432432
spin_unlock(&rx->incoming_lock);
433433
read_unlock_irq(&local->services_lock);

net/rxrpc/io_thread.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@ bool rxrpc_direct_abort(struct sk_buff *skb, enum rxrpc_abort_reason why,
9797
return false;
9898
}
9999

100+
/*
101+
* Directly produce a connection abort from a packet.
102+
*/
103+
bool rxrpc_direct_conn_abort(struct sk_buff *skb, enum rxrpc_abort_reason why,
104+
s32 abort_code, int err)
105+
{
106+
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
107+
108+
trace_rxrpc_abort(0, why, sp->hdr.cid, 0, sp->hdr.seq, abort_code, err);
109+
skb->mark = RXRPC_SKB_MARK_REJECT_CONN_ABORT;
110+
skb->priority = abort_code;
111+
return false;
112+
}
113+
100114
static bool rxrpc_bad_message(struct sk_buff *skb, enum rxrpc_abort_reason why)
101115
{
102116
return rxrpc_direct_abort(skb, why, RX_PROTOCOL_ERROR, -EBADMSG);

net/rxrpc/output.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -829,14 +829,23 @@ void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
829829
msg.msg_controllen = 0;
830830
msg.msg_flags = 0;
831831

832-
memset(&whdr, 0, sizeof(whdr));
832+
whdr = (struct rxrpc_wire_header) {
833+
.epoch = htonl(sp->hdr.epoch),
834+
.cid = htonl(sp->hdr.cid),
835+
.callNumber = htonl(sp->hdr.callNumber),
836+
.serviceId = htons(sp->hdr.serviceId),
837+
.flags = ~sp->hdr.flags & RXRPC_CLIENT_INITIATED,
838+
};
833839

834840
switch (skb->mark) {
835841
case RXRPC_SKB_MARK_REJECT_BUSY:
836842
whdr.type = RXRPC_PACKET_TYPE_BUSY;
837843
size = sizeof(whdr);
838844
ioc = 1;
839845
break;
846+
case RXRPC_SKB_MARK_REJECT_CONN_ABORT:
847+
whdr.callNumber = 0;
848+
fallthrough;
840849
case RXRPC_SKB_MARK_REJECT_ABORT:
841850
whdr.type = RXRPC_PACKET_TYPE_ABORT;
842851
code = htonl(skb->priority);
@@ -850,14 +859,6 @@ void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
850859
if (rxrpc_extract_addr_from_skb(&srx, skb) == 0) {
851860
msg.msg_namelen = srx.transport_len;
852861

853-
whdr.epoch = htonl(sp->hdr.epoch);
854-
whdr.cid = htonl(sp->hdr.cid);
855-
whdr.callNumber = htonl(sp->hdr.callNumber);
856-
whdr.serviceId = htons(sp->hdr.serviceId);
857-
whdr.flags = sp->hdr.flags;
858-
whdr.flags ^= RXRPC_CLIENT_INITIATED;
859-
whdr.flags &= RXRPC_CLIENT_INITIATED;
860-
861862
iov_iter_kvec(&msg.msg_iter, WRITE, iov, ioc, size);
862863
ret = do_udp_sendmsg(local->socket, &msg, size);
863864
if (ret < 0)

net/rxrpc/security.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,15 @@ const struct rxrpc_security *rxrpc_get_incoming_security(struct rxrpc_sock *rx,
140140

141141
sec = rxrpc_security_lookup(sp->hdr.securityIndex);
142142
if (!sec) {
143-
rxrpc_direct_abort(skb, rxrpc_abort_unsupported_security,
144-
RX_INVALID_OPERATION, -EKEYREJECTED);
143+
rxrpc_direct_conn_abort(skb, rxrpc_abort_unsupported_security,
144+
RX_INVALID_OPERATION, -EKEYREJECTED);
145145
return NULL;
146146
}
147147

148148
if (sp->hdr.securityIndex != RXRPC_SECURITY_NONE &&
149149
!rx->securities) {
150-
rxrpc_direct_abort(skb, rxrpc_abort_no_service_key,
151-
sec->no_key_abort, -EKEYREJECTED);
150+
rxrpc_direct_conn_abort(skb, rxrpc_abort_no_service_key,
151+
sec->no_key_abort, -EKEYREJECTED);
152152
return NULL;
153153
}
154154

0 commit comments

Comments
 (0)