rxrpc, afs: Fix selection of abort codes
authorDavid Howells <dhowells@redhat.com>
Sat, 21 May 2022 07:45:48 +0000 (08:45 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 22 May 2022 20:03:02 +0000 (21:03 +0100)
The RX_USER_ABORT code should really only be used to indicate that the user
of the rxrpc service (ie. userspace) implicitly caused a call to be aborted
- for instance if the AF_RXRPC socket is closed whilst the call was in
progress.  (The user may also explicitly abort a call and specify the abort
code to use).

Change some of the points of generation to use other abort codes instead:

 (1) Abort the call with RXGEN_SS_UNMARSHAL or RXGEN_CC_UNMARSHAL if we see
     ENOMEM and EFAULT during received data delivery and abort with
     RX_CALL_DEAD in the default case.

 (2) Abort with RXGEN_SS_MARSHAL if we get ENOMEM whilst trying to send a
     reply.

 (3) Abort with RX_CALL_DEAD if we stop hearing from the peer if we had
     heard from the peer and abort with RX_CALL_TIMEOUT if we hadn't.

 (4) Abort with RX_CALL_DEAD if we try to disconnect a call that's not
     completed successfully or been aborted.

Reported-by: Jeffrey Altman <jaltman@auristor.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: David S. Miller <davem@davemloft.net>
fs/afs/rxrpc.c
net/rxrpc/call_event.c
net/rxrpc/conn_object.c

index 23a1a92d64bb5c4adfe4ce11ee34385917393e9e..a5434f3e57c689a792b23aa62386bc2e0372b8e4 100644 (file)
@@ -537,6 +537,8 @@ static void afs_deliver_to_call(struct afs_call *call)
                case -ENODATA:
                case -EBADMSG:
                case -EMSGSIZE:
+               case -ENOMEM:
+               case -EFAULT:
                        abort_code = RXGEN_CC_UNMARSHAL;
                        if (state != AFS_CALL_CL_AWAIT_REPLY)
                                abort_code = RXGEN_SS_UNMARSHAL;
@@ -544,7 +546,7 @@ static void afs_deliver_to_call(struct afs_call *call)
                                                abort_code, ret, "KUM");
                        goto local_abort;
                default:
-                       abort_code = RX_USER_ABORT;
+                       abort_code = RX_CALL_DEAD;
                        rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
                                                abort_code, ret, "KER");
                        goto local_abort;
@@ -836,7 +838,7 @@ void afs_send_empty_reply(struct afs_call *call)
        case -ENOMEM:
                _debug("oom");
                rxrpc_kernel_abort_call(net->socket, call->rxcall,
-                                       RX_USER_ABORT, -ENOMEM, "KOO");
+                                       RXGEN_SS_MARSHAL, -ENOMEM, "KOO");
                fallthrough;
        default:
                _leave(" [error]");
@@ -878,7 +880,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
        if (n == -ENOMEM) {
                _debug("oom");
                rxrpc_kernel_abort_call(net->socket, call->rxcall,
-                                       RX_USER_ABORT, -ENOMEM, "KOO");
+                                       RXGEN_SS_MARSHAL, -ENOMEM, "KOO");
        }
        _leave(" [error]");
 }
index 22e05de5d1ca96fccb667a0a287e0042fc5be6e9..e426f6831aab475246a1a9fb706901c55f31bf17 100644 (file)
@@ -377,9 +377,9 @@ recheck_state:
                if (test_bit(RXRPC_CALL_RX_HEARD, &call->flags) &&
                    (int)call->conn->hi_serial - (int)call->rx_serial > 0) {
                        trace_rxrpc_call_reset(call);
-                       rxrpc_abort_call("EXP", call, 0, RX_USER_ABORT, -ECONNRESET);
+                       rxrpc_abort_call("EXP", call, 0, RX_CALL_DEAD, -ECONNRESET);
                } else {
-                       rxrpc_abort_call("EXP", call, 0, RX_USER_ABORT, -ETIME);
+                       rxrpc_abort_call("EXP", call, 0, RX_CALL_TIMEOUT, -ETIME);
                }
                set_bit(RXRPC_CALL_EV_ABORT, &call->events);
                goto recheck_state;
index 03c7f22691510bfdb26236c07f5d5dc0a079f2e6..22089e37e97f0628f780855f9e219e5c33d4afa1 100644 (file)
@@ -183,7 +183,7 @@ void __rxrpc_disconnect_call(struct rxrpc_connection *conn,
                        chan->last_type = RXRPC_PACKET_TYPE_ABORT;
                        break;
                default:
-                       chan->last_abort = RX_USER_ABORT;
+                       chan->last_abort = RX_CALL_DEAD;
                        chan->last_type = RXRPC_PACKET_TYPE_ABORT;
                        break;
                }