aboutgitcodebugslistschat
path: root/tcp.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-02-16 16:43:11 +1100
committerStefano Brivio <sbrivio@redhat.com>2023-02-16 18:56:37 +0100
commit89e0fbfaa777ef28b5269421cc6770589145d4e6 (patch)
tree401cb169e219c72683a6d05d408868120934528d /tcp.c
parent83b2061ae7c7f0b3f3c85fa88a195c84fd9404c6 (diff)
downloadpasst-89e0fbfaa777ef28b5269421cc6770589145d4e6.tar
passt-89e0fbfaa777ef28b5269421cc6770589145d4e6.tar.gz
passt-89e0fbfaa777ef28b5269421cc6770589145d4e6.tar.bz2
passt-89e0fbfaa777ef28b5269421cc6770589145d4e6.tar.lz
passt-89e0fbfaa777ef28b5269421cc6770589145d4e6.tar.xz
passt-89e0fbfaa777ef28b5269421cc6770589145d4e6.tar.zst
passt-89e0fbfaa777ef28b5269421cc6770589145d4e6.zip
tcp: Remove 'zero_len' goto from tcp_data_from_sock
This goto exists purely to move this exception case out of line. Although that does make the "normal" path a little clearer, it comes at the cost of not knowing how where control will flow after jumping to the zero_len label. The exceptional case isn't that long, so just put it inline. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp.c')
-rw-r--r--tcp.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/tcp.c b/tcp.c
index d289f10..81468d9 100644
--- a/tcp.c
+++ b/tcp.c
@@ -2193,8 +2193,18 @@ static int tcp_data_from_sock(struct ctx *c, struct tcp_tap_conn *conn)
if (len < 0)
goto err;
- if (!len)
- goto zero_len;
+ if (!len) {
+ if ((conn->events & (SOCK_FIN_RCVD | TAP_FIN_SENT)) == SOCK_FIN_RCVD) {
+ if ((ret = tcp_send_flag(c, conn, FIN | ACK))) {
+ tcp_rst(c, conn);
+ return ret;
+ }
+
+ conn_event(c, conn, TAP_FIN_SENT);
+ }
+
+ return 0;
+ }
sendlen = len - already_sent;
if (sendlen <= 0) {
@@ -2233,18 +2243,6 @@ err:
}
return ret;
-
-zero_len:
- if ((conn->events & (SOCK_FIN_RCVD | TAP_FIN_SENT)) == SOCK_FIN_RCVD) {
- if ((ret = tcp_send_flag(c, conn, FIN | ACK))) {
- tcp_rst(c, conn);
- return ret;
- }
-
- conn_event(c, conn, TAP_FIN_SENT);
- }
-
- return 0;
}
/**