summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-09-11 09:37:23 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-09-11 09:37:23 -0700
commitc9006f7963382ba4ff4a0b37271f1cfbaae583d7 (patch)
treec20968c854ab92cd975197d40c572f421fb96dbc
parent8335ac0f99cfe816afd5be341aae9a1c968deb2c (diff)
downloadtxr-c9006f7963382ba4ff4a0b37271f1cfbaae583d7.tar.gz
txr-c9006f7963382ba4ff4a0b37271f1cfbaae583d7.tar.bz2
txr-c9006f7963382ba4ff4a0b37271f1cfbaae583d7.zip
sockets: bug in clearing SOCK_* type flags.
Paul A. Patience reports a regression in 3d5d525eb525cfad8f643917c31e3d9fedce2874, whereby the code marked with #if SOCK_NONBLOCK || SOCK_CLOEXEC is being excluded by the preprocoessor, and so those flags are not being cleared from the socket type that we retain. This is because these preprocessor symbols are not necessarily integer constants. They may expand to C enum identifiers, in which case, in preprocessor expressions they appear to take on the value zero. * socket.c (open_socket, socketpair_wrap): Use the if statement to test for SOCK_NONBLOCK or SOCK_CLOEXEC being nonzero, rather than a preprocessor #if. This should still be optimized away as unreachable code if they are zero. * tests/014/socket-misc.tl: New file.
-rw-r--r--socket.c11
-rw-r--r--tests/014/socket-misc.tl4
2 files changed, 9 insertions, 6 deletions
diff --git a/socket.c b/socket.c
index b05d15e8..ea11a8c0 100644
--- a/socket.c
+++ b/socket.c
@@ -1107,9 +1107,9 @@ static val open_socket(val family, val type, val mode_str)
uw_ethrowf(socket_error_s, lit("~a failed: ~d/~s"),
self, num(errno), errno_to_str(errno), nao);
-#if SOCK_NONBLOCK || SOCK_CLOEXEC
- type = num_fast(c_num(type, self) & ~(SOCK_NONBLOCK | SOCK_CLOEXEC));
-#endif
+ if (SOCK_NONBLOCK || SOCK_CLOEXEC)
+ type = num_fast(c_num(type, self) & ~(SOCK_NONBLOCK | SOCK_CLOEXEC));
+
return open_sockfd(num(fd), family, type, mode_str, self);
}
@@ -1126,9 +1126,8 @@ static val socketpair_wrap(val family, val type, val mode_str)
uw_ethrowf(socket_error_s, lit("~a failed: ~d/~s"),
self, num(errno), errno_to_str(errno), nao);
-#if SOCK_NONBLOCK || SOCK_CLOEXEC
- type = num_fast(c_num(type, self) & ~(SOCK_NONBLOCK | SOCK_CLOEXEC));
-#endif
+ if (SOCK_NONBLOCK || SOCK_CLOEXEC)
+ type = num_fast(c_num(type, self) & ~(SOCK_NONBLOCK | SOCK_CLOEXEC));
{
val s0 = open_sockfd(num(sv[0]), family, type, mode_str, self);
diff --git a/tests/014/socket-misc.tl b/tests/014/socket-misc.tl
new file mode 100644
index 00000000..39045c1d
--- /dev/null
+++ b/tests/014/socket-misc.tl
@@ -0,0 +1,4 @@
+(load "../common")
+
+(with-stream (s (open-socket af-inet (logior sock-dgram sock-nonblock)))
+ (test (sock-listen s) t))