diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-06-07 11:55:24 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-06-07 20:44:44 +0200 |
commit | ec416fdcc4b607583e87bbdd35b48f6eb9dc633f (patch) | |
tree | 77a0d22977daa67534a4672804033bc4b923bc82 | |
parent | 3f63743a65bf3d987615774cdab0a9cb1006ae47 (diff) | |
download | passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.tar passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.tar.gz passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.tar.bz2 passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.tar.lz passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.tar.xz passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.tar.zst passt-ec416fdcc4b607583e87bbdd35b48f6eb9dc633f.zip |
tcp, flow: Fix some error paths which didn't clean up flows properly
Flow table entries need to be fully initialised before returning to the
main epoll loop. Commit 0060acd1 ("flow: Clarify and enforce flow state
transitions") now enforces that: once a flow is allocated we must either
cancel it, or activate it before returning to the main loop, or we will hit
an ASSERT().
Some error paths in tcp_conn_from_tap() weren't correctly updated for this
requirement - we can exit with a flow entry incompletely initialised.
Correct that by cancelling the flows in those situations.
I don't have enough information to be certain if this is the cause for
podman bug 22925, but it plausibly could be.
Fixes: 0060acd11b19 ("flow: Clarify and enforce flow state transitions")
Link: https://github.com/containers/podman/issues/22925
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | tcp.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -2067,7 +2067,7 @@ static void tcp_conn_from_tap(struct ctx *c, sa_family_t af, if (!bind(s, sa, sl)) { tcp_rst(c, conn); /* Nobody is listening then */ - return; + goto cancel; } if (errno != EADDRNOTAVAIL && errno != EACCES) conn_flag(c, conn, LOCAL); @@ -2080,7 +2080,7 @@ static void tcp_conn_from_tap(struct ctx *c, sa_family_t af, if (connect(s, sa, sl)) { if (errno != EINPROGRESS) { tcp_rst(c, conn); - return; + goto cancel; } tcp_get_sndbuf(conn); @@ -2088,7 +2088,7 @@ static void tcp_conn_from_tap(struct ctx *c, sa_family_t af, tcp_get_sndbuf(conn); if (tcp_send_flag(c, conn, SYN | ACK)) - return; + goto cancel; conn_event(c, conn, TAP_SYN_ACK_SENT); } |