Commit 908ad5ff authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

sock/uring: check if socket was closed after sock_abort_requests()



It's possible that user closed the socket in response to a callback from
one of the aborted requests.  In that case, it'd be freed, so we need to
take care not to touch it anymore.

Fixes #3089.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I9707b26a6232a20b2a18d09e07dd91c6874aca13
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18993


Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKarol Latecki <karol.latecki@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent 3a52bbbe
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1341,10 +1341,10 @@ sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, int max
				_sock_prep_read(&sock->base);
			} else if (spdk_unlikely(status <= 0)) {
				sock->connection_status = status < 0 ? status : -ECONNRESET;
				spdk_sock_abort_requests(&sock->base);
				ret = spdk_sock_abort_requests(&sock->base);

				/* The user needs to be notified that this socket is dead. */
				if (sock->base.cb_fn != NULL &&
				if (ret == 0 && sock->base.cb_fn != NULL &&
				    sock->pending_recv == false) {
					sock->pending_recv = true;
					TAILQ_INSERT_TAIL(&group->pending_recv, sock, link);
@@ -1382,10 +1382,10 @@ sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, int max
				continue;
			} else if (spdk_unlikely(status) < 0) {
				sock->connection_status = status;
				spdk_sock_abort_requests(&sock->base);
				ret = spdk_sock_abort_requests(&sock->base);

				/* The user needs to be notified that this socket is dead. */
				if (sock->base.cb_fn != NULL &&
				if (ret == 0 && sock->base.cb_fn != NULL &&
				    sock->pending_recv == false) {
					sock->pending_recv = true;
					TAILQ_INSERT_TAIL(&group->pending_recv, sock, link);
@@ -1406,10 +1406,10 @@ sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, int max
			} else if (status == -ECANCELED) {
				continue;
			} else if (spdk_unlikely(status < 0)) {
				spdk_sock_abort_requests(&sock->base);
				ret = spdk_sock_abort_requests(&sock->base);

				/* The user needs to be notified that this socket is dead. */
				if (sock->base.cb_fn != NULL &&
				if (ret == 0 && sock->base.cb_fn != NULL &&
				    sock->pending_recv == false) {
					sock->pending_recv = true;
					TAILQ_INSERT_TAIL(&group->pending_recv, sock, link);