Skip to content

Commit e0baa7e

Browse files
committed
tests: bound-check descriptors before FD_SET in bandwidth server
The benchmark server inserted the listen socket and every accepted client socket into a stack fd_set with FD_SET and no FD_SETSIZE check. With enough open descriptors, accept() returns a descriptor >= FD_SETSIZE and FD_SET then writes out of bounds of the fd_set (stack corruption). Refuse/close descriptors >= FD_SETSIZE before FD_SET. A real server should use poll()/epoll(). Project Vanessa L021/L022 (CWE-787). Reported-by: Aaron (NVIDIA)
1 parent a1edd13 commit e0baa7e

1 file changed

Lines changed: 20 additions & 1 deletion

File tree

tests/bandwidth-server-many-up.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,17 @@ int main(void)
7373

7474
/* Clear the reference set of socket */
7575
FD_ZERO(&refset);
76-
/* Add the server socket */
76+
/* Add the server socket (modbus_tcp_listen already guarantees the
77+
* descriptor is below FD_SETSIZE, but check defensively before FD_SET). */
78+
if (server_socket >= FD_SETSIZE) {
79+
fprintf(stderr,
80+
"Server socket %d exceeds FD_SETSIZE (%d)\n",
81+
server_socket,
82+
FD_SETSIZE);
83+
close(server_socket);
84+
modbus_free(ctx);
85+
return -1;
86+
}
7787
FD_SET(server_socket, &refset);
7888

7989
/* Keep track of the max file descriptor */
@@ -106,6 +116,15 @@ int main(void)
106116
newfd = accept(server_socket, (struct sockaddr *) &clientaddr, &addrlen);
107117
if (newfd == -1) {
108118
perror("Server accept() error");
119+
} else if (newfd >= FD_SETSIZE) {
120+
/* fd_set/FD_SET cannot represent a descriptor >= FD_SETSIZE;
121+
* setting it would corrupt the stack. Refuse the connection
122+
* instead. A real server should use poll()/epoll(). */
123+
fprintf(stderr,
124+
"Refusing socket %d: exceeds FD_SETSIZE (%d)\n",
125+
newfd,
126+
FD_SETSIZE);
127+
close(newfd);
109128
} else {
110129
FD_SET(newfd, &refset);
111130

0 commit comments

Comments
 (0)