aboutsummaryrefslogtreecommitdiffstats
path: root/package/uhttpd/src/uhttpd-utils.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2011-01-09 23:35:45 +0000
committerJo-Philipp Wich <jow@openwrt.org>2011-01-09 23:35:45 +0000
commitf38a320e693d951e6bcd0fb2ee4e81855d48a21c (patch)
tree35c5a85b50eb565c3b57409ea589d17e053ec2a1 /package/uhttpd/src/uhttpd-utils.c
parent8067116c10bdf7c34f292ae64c4b6ed6193d3182 (diff)
downloadupstream-f38a320e693d951e6bcd0fb2ee4e81855d48a21c.tar.gz
upstream-f38a320e693d951e6bcd0fb2ee4e81855d48a21c.tar.bz2
upstream-f38a320e693d951e6bcd0fb2ee4e81855d48a21c.zip
uhttpd: protect tcp receive operations with select, make tcp keep-alive optional (#8272)
SVN-Revision: 24952
Diffstat (limited to 'package/uhttpd/src/uhttpd-utils.c')
-rw-r--r--package/uhttpd/src/uhttpd-utils.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/package/uhttpd/src/uhttpd-utils.c b/package/uhttpd/src/uhttpd-utils.c
index c7bc867aab..ac00af824e 100644
--- a/package/uhttpd/src/uhttpd-utils.c
+++ b/package/uhttpd/src/uhttpd-utils.c
@@ -167,6 +167,9 @@ int uh_tcp_recv(struct client *cl, char *buf, int len)
int sz = 0;
int rsz = 0;
+ fd_set reader;
+ struct timeval timeout;
+
/* first serve data from peek buffer */
if( cl->peeklen > 0 )
{
@@ -180,15 +183,28 @@ int uh_tcp_recv(struct client *cl, char *buf, int len)
/* caller wants more */
if( len > 0 )
{
+ FD_ZERO(&reader);
+ FD_SET(cl->socket, &reader);
+
+ timeout.tv_sec = cl->server->conf->network_timeout;
+ timeout.tv_usec = 0;
+
+ if( select(cl->socket + 1, &reader, NULL, NULL, &timeout) > 0 )
+ {
#ifdef HAVE_TLS
- if( cl->tls )
- rsz = cl->server->conf->tls_recv(cl, (void *)&buf[sz], len);
- else
+ if( cl->tls )
+ rsz = cl->server->conf->tls_recv(cl, (void *)&buf[sz], len);
+ else
#endif
- rsz = recv(cl->socket, (void *)&buf[sz], len, 0);
+ rsz = recv(cl->socket, (void *)&buf[sz], len, 0);
- if( (sz == 0) || (rsz > 0) )
- sz += rsz;
+ if( (sz == 0) || (rsz > 0) )
+ sz += rsz;
+ }
+ else if( sz == 0 )
+ {
+ sz = -1;
+ }
}
return sz;
@@ -233,7 +249,7 @@ int uh_http_sendc(struct client *cl, const char *data, int len)
if( len > 0 )
{
- clen = snprintf(chunk, sizeof(chunk), "%X\r\n", len);
+ clen = snprintf(chunk, sizeof(chunk), "%X\r\n", len);
ensure_ret(uh_tcp_send(cl, chunk, clen));
ensure_ret(uh_tcp_send(cl, data, len));
ensure_ret(uh_tcp_send(cl, "\r\n", 2));