From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202606 header.b=Tgbznz9o; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 16F8F5A0265 for ; Tue, 09 Jun 2026 04:32:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202606; t=1780972349; bh=SBxOr1h2Fs0lDkZJGcaXgyKKlAFZLkxWRTQm6qD76fQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Tgbznz9ogmkIBIVMGFQwIUbea4d4rH1ELGKwEdgTU+pGsg1RZRhDJIh1qbPvwFGhC 7Q6Peahnmwd8yc2EhAIr3TM37YzVJwQczfq8n6PtLlKaRece1JIAWo+7MEFMmyVM2M 7N1rhH5vo8TGBco5hLlywkIDCa0/TR2AwcCz/0xM/sQSwXWQNeTkD8CDhrby2E/Itv 5Tlz7yWYYiwfqFgsG8HdjVhLHx3tAseLhM926XmyaJ0l+vI7IF23jLeZT2I+ddVmux BdbZ5ZMmtNoIblsXFfUPv8S+eK3u/qqFIO1qalIn83jWpHXhV1lZGNd+uIY6AGm2Fi 35Yqc8uQc/3JA== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4gZCcF1F67z4whS; Tue, 09 Jun 2026 12:32:29 +1000 (AEST) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 3/4] flow: Safer errno handling in flowside_connect() callers Date: Tue, 9 Jun 2026 12:32:25 +1000 Message-ID: <20260609023226.86058-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260609023226.86058-1-david@gibson.dropbear.id.au> References: <20260609023226.86058-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: FT4HJL2NVRSKZORKYONT5W7N6KTTXDSL X-Message-ID-Hash: FT4HJL2NVRSKZORKYONT5W7N6KTTXDSL X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: flowside_connect() behaves much like connect(2) itself, returning -1 on error with errno set to the error code. One of the callers, in udp_flow_sock(), uses the errno code with flow_dbg_perror() *after* it's called epoll_del() and close() either of which could clobber errno. Change flowside_connect() to use the more regular convention for internal functions: return a negative errno code on error, rather than just -1. Save it in the callers and use that rather than raw errno to print the message. Signed-off-by: David Gibson --- flow.c | 6 ++++-- tcp.c | 4 ++-- udp_flow.c | 7 +++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/flow.c b/flow.c index dd92bad7..98828430 100644 --- a/flow.c +++ b/flow.c @@ -259,7 +259,7 @@ int flowside_sock_l4(const struct ctx *c, enum epoll_type type, uint8_t pif, * * Connect @s to the endpoint address and port from @tgt. * - * Return: 0 on success, negative on error + * Return: 0 on success, negative error code on error */ int flowside_connect(const struct ctx *c, int s, uint8_t pif, const struct flowside *tgt) @@ -267,7 +267,9 @@ int flowside_connect(const struct ctx *c, int s, union sockaddr_inany sa; pif_sockaddr(c, &sa, pif, &tgt->eaddr, tgt->eport); - return connect(s, &sa.sa, socklen_inany(&sa)); + if (connect(s, &sa.sa, socklen_inany(&sa)) < 0) + return -errno; + return 0; } /** flow_log__ - Log flow-related message, internal helper diff --git a/tcp.c b/tcp.c index 6fba865f..81813643 100644 --- a/tcp.c +++ b/tcp.c @@ -3744,8 +3744,8 @@ static int tcp_flow_repair_connect(const struct ctx *c, rc = flowside_connect(c, conn->sock, PIF_HOST, tgt); if (rc) { - rc = -errno; - flow_perror(conn, "Failed to connect migrated socket"); + flow_err(conn, "Failed to connect migrated socket: %s", + strerror_(-rc)); return rc; } diff --git a/udp_flow.c b/udp_flow.c index 35417bc4..6edfa65a 100644 --- a/udp_flow.c +++ b/udp_flow.c @@ -88,13 +88,12 @@ static int udp_flow_sock(const struct ctx *c, return rc; } - if (flowside_connect(c, s, pif, side) < 0) { - rc = -errno; - + if ((rc = flowside_connect(c, s, pif, side)) < 0) { epoll_del(flow_epollfd(&uflow->f), s); close(s); - flow_dbg_perror(uflow, "Couldn't connect flow socket"); + flow_dbg(uflow, "Couldn't connect flow socket: %s", + strerror_(-rc)); return rc; } uflow->s[sidei] = s; -- 2.54.0