dgaudet 98/03/24 18:57:29
Modified: src CHANGES
src/main buff.c http_main.c http_protocol.c
src/modules/proxy proxy_connect.c
Log:
Protect against various FD_SETSIZE restrictions. Note that I couldn't
really test this well -- because libc5 linux systems just don't let you
muck with FD_SETSIZE easily. Folks on BSD systems should be able to
-DFD_SETSIZE=16 or 20 and produce lots of interesting failures.
Clean up make_sock error messages a bit.
Revision Changes Path
1.730 +2 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.729
retrieving revision 1.730
diff -u -r1.729 -r1.730
--- CHANGES 1998/03/23 07:42:10 1.729
+++ CHANGES 1998/03/25 02:57:19 1.730
@@ -1,5 +1,7 @@
Changes with Apache 1.3b6
+ *) Protect against FD_SETSIZE mismatches. [Dean Gaudet]
+
*) Make the shared object compilation command more portable by avoiding
the direct combination of `-c' & `-o' which is not honored by some
compilers like UnixWare's cc. [Ralf S. Engelschall]
1.66 +1 -0 apache-1.3/src/main/buff.c
Index: buff.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/buff.c,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- buff.c 1998/02/23 00:05:37 1.65
+++ buff.c 1998/03/25 02:57:22 1.66
@@ -529,6 +529,7 @@
#endif
+/* note we assume the caller has ensured that fb->fd_in <= FD_SETSIZE */
API_EXPORT(void) bhalfduplex(BUFF *fb)
{
int rv;
1.310 +54 -19 apache-1.3/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.309
retrieving revision 1.310
diff -u -r1.309 -r1.310
--- http_main.c 1998/03/21 02:06:05 1.309
+++ http_main.c 1998/03/25 02:57:23 1.310
@@ -2567,12 +2567,19 @@
{
int s;
int one = 1;
+ char addr[512];
+
+ if (server->sin_addr.s_addr != htonl(INADDR_ANY))
+ ap_snprintf(addr, sizeof(addr), "address %s port %d",
+ inet_ntoa(server->sin_addr), ntohs(server->sin_port));
+ else
+ ap_snprintf(addr, sizeof(addr), "port %d", ntohs(server->sin_port));
/* note that because we're about to slack we don't use psocket */
block_alarms();
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
aplog_error(APLOG_MARK, APLOG_CRIT, server_conf,
- "socket: Failed to get a socket, exiting child");
+ "make_sock: failed to get a socket for %s", addr);
unblock_alarms();
exit(1);
}
@@ -2595,7 +2602,6 @@
s = ap_slack(s, AP_SLACK_HIGH);
note_cleanups_for_socket(p, s); /* arrange to close on exec or restart
*/
- unblock_alarms();
#endif
#ifndef MPE
@@ -2603,8 +2609,10 @@
#ifndef _OSD_POSIX
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(int))
< 0) {
aplog_error(APLOG_MARK, APLOG_CRIT, server_conf,
- "setsockopt: (SO_REUSEADDR)");
- exit(1);
+ "make_sock: for %s, setsockopt: (SO_REUSEADDR)", addr);
+ close(s);
+ unblock_alarms();
+ return -1;
}
#endif /*_OSD_POSIX*/
one = 1;
@@ -2612,8 +2620,10 @@
/* BeOS does not support SO_KEEPALIVE */
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *) &one, sizeof(int))
< 0) {
aplog_error(APLOG_MARK, APLOG_CRIT, server_conf,
- "setsockopt: (SO_KEEPALIVE)");
- exit(1);
+ "make_sock: for %s, setsockopt: (SO_KEEPALIVE)", addr);
+ close(s);
+ unblock_alarms();
+ return -1;
}
#endif
#endif
@@ -2645,7 +2655,8 @@
if (setsockopt(s, SOL_SOCKET, SO_SNDBUF,
(char *) &server_conf->send_buffer_size, sizeof(int)) < 0) {
aplog_error(APLOG_MARK, APLOG_WARNING, server_conf,
- "setsockopt: (SO_SNDBUF): Failed to set SendBufferSize,
using default");
+ "make_sock: failed to set SendBufferSize for %s, "
+ "using default", addr);
/* not a fatal error */
}
}
@@ -2657,17 +2668,14 @@
GETPRIVMODE();
#endif
if (bind(s, (struct sockaddr *) server, sizeof(struct sockaddr_in)) ==
-1) {
- perror("bind");
+ aplog_error(APLOG_MARK, APLOG_CRIT, server_conf,
+ "make_sock: could not bind to %s", addr);
#ifdef MPE
if (ntohs(server->sin_port) < 1024)
GETUSERMODE();
#endif
- if (server->sin_addr.s_addr != htonl(INADDR_ANY))
- fprintf(stderr, "httpd: could not bind to address %s port %d\n",
- inet_ntoa(server->sin_addr), ntohs(server->sin_port));
- else
- fprintf(stderr, "httpd: could not bind to port %d\n",
- ntohs(server->sin_port));
+ close(s);
+ unblock_alarms();
exit(1);
}
#ifdef MPE
@@ -2677,20 +2685,29 @@
if (listen(s, listenbacklog) == -1) {
aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
- "listen: unable to listen for connections");
+ "make_sock: unable to listen for connections on %s", addr);
close(s);
-#ifdef WORKAROUND_SOLARIS_BUG
unblock_alarms();
-#endif
- return -1;
+ exit(1);
}
#ifdef WORKAROUND_SOLARIS_BUG
s = ap_slack(s, AP_SLACK_HIGH);
note_cleanups_for_socket(p, s); /* arrange to close on exec or restart
*/
- unblock_alarms();
#endif
+ unblock_alarms();
+
+ /* protect various fd_sets */
+ if (s >= FD_SETSIZE) {
+ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
+ "make_sock: problem listening on %s, filedescriptor (%u) "
+ "larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+ "larger FD_SETSIZE", addr, s, FD_SETSIZE);
+ close(s);
+ return -1;
+ }
return s;
}
@@ -3273,6 +3290,15 @@
note_cleanups_for_fd(ptrans, csd);
+ /* protect various fd_sets */
+ if (csd >= FD_SETSIZE) {
+ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
+ "[csd] filedescriptor (%u) larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+ "larger FD_SETSIZE", csd, FD_SETSIZE);
+ continue;
+ }
+
/*
* We now have a connection, so set it up with the appropriate
* socket options, file descriptors, and read/write buffers.
@@ -3309,6 +3335,15 @@
dupped_csd = csd; /* Oh well... */
}
note_cleanups_for_fd(ptrans, dupped_csd);
+
+ /* protect various fd_sets */
+ if (dupped_csd >= FD_SETSIZE) {
+ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
+ "[dupped_csd] filedescriptor (%u) larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+ "larger FD_SETSIZE", dupped_csd, FD_SETSIZE);
+ continue;
+ }
#endif
bpushfd(conn_io, csd, dupped_csd);
1.202 +7 -0 apache-1.3/src/main/http_protocol.c
Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/http_protocol.c,v
retrieving revision 1.201
retrieving revision 1.202
diff -u -r1.201 -r1.202
--- http_protocol.c 1998/03/24 23:20:26 1.201
+++ http_protocol.c 1998/03/25 02:57:26 1.202
@@ -1663,6 +1663,13 @@
bsetflag(fb, B_RD, 0);
bnonblock(fb, B_RD);
fd = bfileno(fb, B_RD);
+ if (fd >= FD_SETSIZE) {
+ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
+ "send body: filedescriptor (%u) larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+ "larger FD_SETSIZE", fd, FD_SETSIZE);
+ return 0;
+ }
soft_timeout("send body", r);
1.23 +10 -0 apache-1.3/src/modules/proxy/proxy_connect.c
Index: proxy_connect.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/proxy_connect.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- proxy_connect.c 1998/03/04 02:28:22 1.22
+++ proxy_connect.c 1998/03/25 02:57:28 1.23
@@ -161,6 +161,16 @@
return SERVER_ERROR;
}
+ if (sock >= FD_SETSIZE) {
+ aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
+ "proxy_connect_handler: filedescriptor (%u) "
+ "larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+ "larger FD_SETSIZE", sock, FD_SETSIZE);
+ pclosesocket(r->pool, sock);
+ return SERVER_ERROR;
+ }
+
j = 0;
while (server_hp.h_addr_list[j] != NULL) {
memcpy(&server.sin_addr, server_hp.h_addr_list[j],