From 6639031e15b23d342efb87cc00fa51233d66b392 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Fri, 21 Feb 2025 10:32:09 -0700 Subject: libhw: Allow zero-length TCP reads and writes --- libhw/host_net.c | 6 ++++++ libhw/w5500.c | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'libhw') diff --git a/libhw/host_net.c b/libhw/host_net.c index 505c7dc..eee293e 100644 --- a/libhw/host_net.c +++ b/libhw/host_net.c @@ -229,6 +229,9 @@ static void *hostnet_pthread_read(void *_args) { static ssize_t hostnet_tcp_read(struct _hostnet_tcp_conn *conn, void *buf, size_t count) { assert(conn); + assert(count == 0 || buf); + if (count == 0) + return 0; ssize_t ret; struct hostnet_pthread_read_args args = { @@ -287,6 +290,9 @@ static void *hostnet_pthread_write(void *_args) { static ssize_t hostnet_tcp_write(struct _hostnet_tcp_conn *conn, void *buf, size_t count) { assert(conn); + assert(count == 0 || buf); + if (count == 0) + return 0; ssize_t ret; struct hostnet_pthread_write_args args = { diff --git a/libhw/w5500.c b/libhw/w5500.c index dfe169f..a8777db 100644 --- a/libhw/w5500.c +++ b/libhw/w5500.c @@ -589,8 +589,9 @@ static int w5500_tcplist_close(struct _w5500_socket *socket) { static ssize_t w5500_tcp_write(struct _w5500_socket *socket, void *buf, size_t count) { debugf("tcp_conn.write(%zu)", count); ASSERT_SELF(stream_conn, TCP); - assert(buf); - assert(count); + assert(count == 0 || buf); + if (count == 0) + return 0; /* What we really want is to pause until we receive an ACK for * some data we just queued, so that we can line up some new @@ -677,8 +678,9 @@ static void w5500_tcp_alarm_handler(void *_arg) { static ssize_t w5500_tcp_read(struct _w5500_socket *socket, void *buf, size_t count) { debugf("tcp_conn.read()"); ASSERT_SELF(stream_conn, TCP); - assert(buf); - assert(count); + assert(count == 0 || buf); + if (count == 0) + return 0; struct alarmclock_trigger trigger = {0}; if (socket->read_deadline_ns) -- cgit v1.2.3-2-g168b