Make zero reads/writes' behavior right

This commit is contained in:
Ruihan Li
2025-06-15 19:24:53 +08:00
committed by Jianfeng Jiang
parent 837f908690
commit 4a9977d9a7
11 changed files with 226 additions and 18 deletions

View File

@ -83,9 +83,15 @@ FN_TEST(send)
{
char buf[1] = { 'z' };
TEST_RES(send(sk_bound, buf, 1, 0), 1);
TEST_SUCC(send(sk_bound, buf, 1, 0));
TEST_ERRNO(send(sk_bound, buf, 0, 0), ENODATA);
TEST_SUCC(write(sk_bound, buf, 1));
TEST_ERRNO(write(sk_bound, buf, 0), ENODATA);
TEST_ERRNO(send(sk_connected, buf, 1, 0), ECONNREFUSED);
TEST_ERRNO(send(sk_connected, buf, 0, 0), ENODATA);
TEST_ERRNO(write(sk_connected, buf, 1), ECONNREFUSED);
TEST_ERRNO(write(sk_connected, buf, 0), ENODATA);
}
END_TEST()
@ -94,10 +100,19 @@ FN_TEST(recv)
char buf[1] = { 'z' };
TEST_ERRNO(recv(sk_unbound, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_unbound, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_unbound, buf, 1), EAGAIN);
TEST_SUCC(read(sk_unbound, buf, 0));
TEST_ERRNO(recv(sk_bound, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_bound, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_bound, buf, 1), EAGAIN);
TEST_SUCC(read(sk_bound, buf, 0));
TEST_ERRNO(recv(sk_connected, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_connected, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_connected, buf, 1), EAGAIN);
TEST_SUCC(read(sk_connected, buf, 0));
}
END_TEST()

View File

@ -148,10 +148,19 @@ FN_TEST(send)
char buf[1] = { 'z' };
TEST_ERRNO(send(sk_unbound, buf, 1, 0), EPIPE);
TEST_ERRNO(send(sk_unbound, buf, 0, 0), EPIPE);
TEST_ERRNO(write(sk_unbound, buf, 1), EPIPE);
TEST_ERRNO(write(sk_unbound, buf, 0), EPIPE);
TEST_ERRNO(send(sk_bound, buf, 1, 0), EPIPE);
TEST_ERRNO(send(sk_bound, buf, 0, 0), EPIPE);
TEST_ERRNO(write(sk_bound, buf, 1), EPIPE);
TEST_ERRNO(write(sk_bound, buf, 0), EPIPE);
TEST_ERRNO(send(sk_listen, buf, 1, 0), EPIPE);
TEST_ERRNO(send(sk_listen, buf, 0, 0), EPIPE);
TEST_ERRNO(write(sk_listen, buf, 1), EPIPE);
TEST_ERRNO(write(sk_listen, buf, 0), EPIPE);
}
END_TEST()
@ -160,10 +169,24 @@ FN_TEST(recv)
char buf[1] = { 'z' };
TEST_ERRNO(recv(sk_unbound, buf, 1, 0), ENOTCONN);
TEST_ERRNO(recv(sk_unbound, buf, 0, 0), ENOTCONN);
TEST_ERRNO(read(sk_unbound, buf, 1), ENOTCONN);
TEST_SUCC(read(sk_unbound, buf, 0));
TEST_ERRNO(recv(sk_bound, buf, 1, 0), ENOTCONN);
TEST_ERRNO(recv(sk_bound, buf, 0, 0), ENOTCONN);
TEST_ERRNO(read(sk_bound, buf, 1), ENOTCONN);
TEST_SUCC(read(sk_bound, buf, 0));
TEST_ERRNO(recv(sk_listen, buf, 1, 0), ENOTCONN);
TEST_ERRNO(recv(sk_listen, buf, 0, 0), ENOTCONN);
TEST_ERRNO(read(sk_listen, buf, 1), ENOTCONN);
TEST_SUCC(read(sk_listen, buf, 0));
TEST_ERRNO(recv(sk_connected, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_connected, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_connected, buf, 1), EAGAIN);
TEST_SUCC(read(sk_connected, buf, 0));
}
END_TEST()

View File

@ -93,8 +93,14 @@ FN_TEST(send)
char buf[1] = { 'z' };
TEST_ERRNO(send(sk_unbound, buf, 1, 0), EDESTADDRREQ);
TEST_ERRNO(send(sk_unbound, buf, 0, 0), EDESTADDRREQ);
TEST_ERRNO(write(sk_unbound, buf, 1), EDESTADDRREQ);
TEST_ERRNO(write(sk_unbound, buf, 0), EDESTADDRREQ);
TEST_ERRNO(send(sk_bound, buf, 1, 0), EDESTADDRREQ);
TEST_ERRNO(send(sk_bound, buf, 0, 0), EDESTADDRREQ);
TEST_ERRNO(write(sk_bound, buf, 1), EDESTADDRREQ);
TEST_ERRNO(write(sk_bound, buf, 0), EDESTADDRREQ);
}
END_TEST()
@ -103,10 +109,19 @@ FN_TEST(recv)
char buf[1] = { 'z' };
TEST_ERRNO(recv(sk_unbound, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_unbound, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_unbound, buf, 1), EAGAIN);
TEST_SUCC(read(sk_unbound, buf, 0));
TEST_ERRNO(recv(sk_bound, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_bound, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_bound, buf, 1), EAGAIN);
TEST_SUCC(read(sk_bound, buf, 0));
TEST_ERRNO(recv(sk_connected, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_connected, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_connected, buf, 1), EAGAIN);
TEST_SUCC(read(sk_connected, buf, 0));
}
END_TEST()

View File

@ -84,9 +84,15 @@ FN_TEST(send)
{
char buf[1] = { 'z' };
TEST_RES(send(sk_bound, buf, 1, 0), 1);
TEST_SUCC(send(sk_bound, buf, 1, 0));
TEST_ERRNO(send(sk_bound, buf, 0, 0), ENODATA);
TEST_SUCC(write(sk_bound, buf, 1));
TEST_ERRNO(write(sk_bound, buf, 0), ENODATA);
TEST_ERRNO(send(sk_connected, buf, 1, 0), ECONNREFUSED);
TEST_ERRNO(send(sk_connected, buf, 0, 0), ENODATA);
TEST_ERRNO(write(sk_connected, buf, 1), ECONNREFUSED);
TEST_ERRNO(write(sk_connected, buf, 0), ENODATA);
}
END_TEST()
@ -95,10 +101,19 @@ FN_TEST(recv)
char buf[1] = { 'z' };
TEST_ERRNO(recv(sk_unbound, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_unbound, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_unbound, buf, 1), EAGAIN);
TEST_SUCC(read(sk_unbound, buf, 0));
TEST_ERRNO(recv(sk_bound, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_bound, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_bound, buf, 1), EAGAIN);
TEST_SUCC(read(sk_bound, buf, 0));
TEST_ERRNO(recv(sk_connected, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_connected, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_connected, buf, 1), EAGAIN);
TEST_SUCC(read(sk_connected, buf, 0));
}
END_TEST()

View File

@ -13,6 +13,12 @@
#include "test.h"
FN_SETUP(general)
{
signal(SIGPIPE, SIG_IGN);
}
END_SETUP()
#define PATH_OFFSET offsetof(struct sockaddr_un, sun_path)
FN_TEST(socket_addresses)
@ -114,13 +120,13 @@ static int sk_accepted;
FN_SETUP(unbound)
{
sk_unbound = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
sk_unbound = CHECK(socket(PF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0));
}
END_SETUP()
FN_SETUP(bound)
{
sk_bound = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
sk_bound = CHECK(socket(PF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0));
CHECK(bind(sk_bound, (struct sockaddr *)&BOUND_ADDR, BOUND_ADDRLEN));
}
@ -128,7 +134,7 @@ END_SETUP()
FN_SETUP(listen)
{
sk_listen = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
sk_listen = CHECK(socket(PF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0));
CHECK(bind(sk_listen, (struct sockaddr *)&LISTEN_ADDR, LISTEN_ADDRLEN));
@ -138,7 +144,7 @@ END_SETUP()
FN_SETUP(connected)
{
sk_connected = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
sk_connected = CHECK(socket(PF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0));
CHECK(connect(sk_connected, (struct sockaddr *)&LISTEN_ADDR2,
LISTEN_ADDRLEN2));
@ -321,10 +327,19 @@ FN_TEST(send)
char buf[1] = { 'z' };
TEST_ERRNO(send(sk_unbound, buf, 1, 0), ENOTCONN);
TEST_ERRNO(send(sk_unbound, buf, 0, 0), ENOTCONN);
TEST_ERRNO(write(sk_unbound, buf, 1), ENOTCONN);
TEST_ERRNO(write(sk_unbound, buf, 0), ENOTCONN);
TEST_ERRNO(send(sk_bound, buf, 1, 0), ENOTCONN);
TEST_ERRNO(send(sk_bound, buf, 0, 0), ENOTCONN);
TEST_ERRNO(write(sk_bound, buf, 1), ENOTCONN);
TEST_ERRNO(write(sk_bound, buf, 0), ENOTCONN);
TEST_ERRNO(send(sk_listen, buf, 1, 0), ENOTCONN);
TEST_ERRNO(send(sk_listen, buf, 0, 0), ENOTCONN);
TEST_ERRNO(write(sk_listen, buf, 1), ENOTCONN);
TEST_ERRNO(write(sk_listen, buf, 0), ENOTCONN);
}
END_TEST()
@ -333,10 +348,24 @@ FN_TEST(recv)
char buf[1] = { 'z' };
TEST_ERRNO(recv(sk_unbound, buf, 1, 0), EINVAL);
TEST_ERRNO(recv(sk_unbound, buf, 0, 0), EINVAL);
TEST_ERRNO(read(sk_unbound, buf, 1), EINVAL);
TEST_SUCC(read(sk_unbound, buf, 0));
TEST_ERRNO(recv(sk_bound, buf, 1, 0), EINVAL);
TEST_ERRNO(recv(sk_bound, buf, 0, 0), EINVAL);
TEST_ERRNO(read(sk_bound, buf, 1), EINVAL);
TEST_SUCC(read(sk_bound, buf, 0));
TEST_ERRNO(recv(sk_listen, buf, 1, 0), EINVAL);
TEST_ERRNO(recv(sk_listen, buf, 0, 0), EINVAL);
TEST_ERRNO(read(sk_listen, buf, 1), EINVAL);
TEST_SUCC(read(sk_listen, buf, 0));
TEST_ERRNO(recv(sk_connected, buf, 1, 0), EAGAIN);
TEST_ERRNO(recv(sk_connected, buf, 0, 0), EAGAIN);
TEST_ERRNO(read(sk_connected, buf, 1), EAGAIN);
TEST_SUCC(read(sk_connected, buf, 0));
}
END_TEST()
@ -655,3 +684,38 @@ FN_SETUP(cleanup)
CHECK(unlink(LISTEN_ADDR.sun_path));
}
END_SETUP()
// See also `zero_reads_always_succeed` in `pipe_err.c`
FN_TEST(zero_recvs_may_fail)
{
int fildes[2];
char buf[1] = { 'z' };
TEST_SUCC(socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0, fildes));
TEST_ERRNO(recv(fildes[0], buf, 0, 0), EAGAIN);
TEST_RES(send(fildes[1], buf, 1, 0), _ret == 1);
TEST_SUCC(recv(fildes[0], buf, 0, 0));
TEST_SUCC(close(fildes[0]));
TEST_SUCC(close(fildes[1]));
}
END_TEST()
// See also `zero_writes_always_succeed` in `pipe_err.c`
FN_TEST(zero_sends_may_fail)
{
int fildes[2];
char buf[1] = { 'z' };
TEST_SUCC(socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0, fildes));
TEST_SUCC(send(fildes[1], buf, 0, 0));
TEST_SUCC(close(fildes[0]));
TEST_ERRNO(send(fildes[1], buf, 0, 0), EPIPE);
TEST_SUCC(close(fildes[1]));
}
END_TEST()

View File

@ -176,3 +176,37 @@ FN_TEST(close_second_then_poll)
TEST_SUCC(close(fildes[0]));
}
END_TEST()
// See also `zero_recvs_may_fail` in `unix_err.c`
FN_TEST(zero_reads_always_succeed)
{
int fildes[2];
char buf[1] = { 'z' };
CHECK(pipe(fildes));
TEST_SUCC(read(fildes[0], buf, 0));
TEST_RES(write(fildes[1], buf, 1), _ret == 1);
TEST_SUCC(read(fildes[0], buf, 0));
TEST_SUCC(close(fildes[0]));
}
END_TEST()
// See also `zero_sends_may_fail` in `unix_err.c`
FN_TEST(zero_writes_always_succeed)
{
int fildes[2];
char buf[1] = { 'z' };
CHECK(pipe(fildes));
TEST_SUCC(write(fildes[1], buf, 0));
TEST_SUCC(close(fildes[0]));
TEST_SUCC(write(fildes[1], buf, 0));
TEST_SUCC(close(fildes[1]));
}
END_TEST()