Skip to content

Commit 3c738db

Browse files
authored
only signal read (not write) readiness for listening sockets (#737)
This fixes the [reregister_different_interest_without_poll] test in mio. [reregister_different_interest_without_poll]: https://github.com/tokio-rs/mio/blob/66ac9fab79bf191218488c4f35c99d13935b7e12/tests/registering.rs#L118
1 parent 55cc34a commit 3c738db

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

libc-bottom-half/sources/wasip2_tcp.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,13 +1159,19 @@ int tcp_setsockopt(void *data, int level, int optname, const void *optval,
11591159
static int tcp_poll_register(void *data, poll_state_t *state, short events) {
11601160
tcp_socket_t *socket = (tcp_socket_t *)data;
11611161
switch (socket->state.tag) {
1162-
case TCP_SOCKET_STATE_CONNECTING:
1163-
case TCP_SOCKET_STATE_LISTENING: {
1162+
case TCP_SOCKET_STATE_CONNECTING: {
11641163
if ((events & (POLLRDNORM | POLLWRNORM)) != 0)
11651164
return __wasilibc_poll_add(state, events, tcp_pollable(socket));
11661165
break;
11671166
}
11681167

1168+
case TCP_SOCKET_STATE_LISTENING: {
1169+
// Listening sockets can only be ready to read, not write.
1170+
if ((events & POLLRDNORM) != 0)
1171+
return __wasilibc_poll_add(state, events, tcp_pollable(socket));
1172+
break;
1173+
}
1174+
11691175
case TCP_SOCKET_STATE_CONNECTED: {
11701176
if ((events & POLLRDNORM) != 0) {
11711177
if (__wasilibc_poll_add_input_stream(
@@ -1198,7 +1204,14 @@ static int tcp_poll_register(void *data, poll_state_t *state, short events) {
11981204
static int tcp_poll_finish(void *data, poll_state_t *state, short events) {
11991205
tcp_socket_t *socket = (tcp_socket_t *)data;
12001206

1201-
if (socket->state.tag != TCP_SOCKET_STATE_CONNECTING) {
1207+
switch (socket->state.tag) {
1208+
case TCP_SOCKET_STATE_CONNECTING:
1209+
break;
1210+
case TCP_SOCKET_STATE_LISTENING:
1211+
// Listening sockets can only be ready to read, not write.
1212+
__wasilibc_poll_ready(state, events & POLLRDNORM);
1213+
return 0;
1214+
default:
12021215
__wasilibc_poll_ready(state, events);
12031216
return 0;
12041217
}

test/src/poll-connect.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ int main() {
9999
}
100100

101101
if (server_client == -1 && fds[1].revents) {
102+
// A listening socket should be readable but not writable:
103+
ASSERT((fds[1].revents & POLLRDNORM) != 0);
104+
ASSERT((fds[1].revents & POLLWRNORM) == 0);
102105
errno = 0;
103106
server_client =
104107
accept(server, (struct sockaddr *)&client_address, &client_len);

0 commit comments

Comments
 (0)