aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2025-02-27 16:55:15 +1100
committerStefano Brivio <sbrivio@redhat.com>2025-02-28 01:32:35 +0100
commit56ce03ed0acf2a41c67d44e353c00a018604ccb7 (patch)
treea08a54dc2dcfe026e8f21b9357c685a0e53d24b7
parent39f85bce1a3b9da3bd11458c521e589f674e587a (diff)
downloadpasst-56ce03ed0acf2a41c67d44e353c00a018604ccb7.tar
passt-56ce03ed0acf2a41c67d44e353c00a018604ccb7.tar.gz
passt-56ce03ed0acf2a41c67d44e353c00a018604ccb7.tar.bz2
passt-56ce03ed0acf2a41c67d44e353c00a018604ccb7.tar.lz
passt-56ce03ed0acf2a41c67d44e353c00a018604ccb7.tar.xz
passt-56ce03ed0acf2a41c67d44e353c00a018604ccb7.tar.zst
passt-56ce03ed0acf2a41c67d44e353c00a018604ccb7.zip
tcp: Correct error code handling from tcp_flow_repair_socket()
There are two small bugs in error returns from tcp_low_repair_socket(), which is supposed to return a negative errno code: 1) On bind() failures, wedirectly pass on the return code from bind(), which is just 0 or -1, instead of an error code. 2) In the caller, tcp_flow_migrate_target() we call strerror_() directly on the negative error code, but strerror() requires a positive error code. Correct both of these. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--tcp.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/tcp.c b/tcp.c
index e3c0a53..8528ee3 100644
--- a/tcp.c
+++ b/tcp.c
@@ -3280,7 +3280,8 @@ int tcp_flow_repair_socket(struct ctx *c, struct tcp_tap_conn *conn)
tcp_sock_set_nodelay(s);
- if ((rc = bind(s, &a.sa, sizeof(a)))) {
+ if (bind(s, &a.sa, sizeof(a))) {
+ rc = -errno;
err_perror("Failed to bind socket for migrated flow");
goto err;
}
@@ -3375,7 +3376,7 @@ int tcp_flow_migrate_target(struct ctx *c, int fd)
conn->seq_init_from_tap = ntohl(t.seq_init_from_tap);
if ((rc = tcp_flow_repair_socket(c, conn))) {
- flow_err(flow, "Can't set up socket: %s, drop", strerror_(rc));
+ flow_err(flow, "Can't set up socket: %s, drop", strerror_(-rc));
flow_alloc_cancel(flow);
return 0;
}