Browse Source

uhttpd: clear script timeout as soon as data is received from the child

SVN-Revision: 20501
Jo-Philipp Wich 16 years ago
parent
commit
161325ac4f
3 changed files with 15 additions and 11 deletions
  1. 1 1
      package/uhttpd/Makefile
  2. 7 5
      package/uhttpd/src/uhttpd-cgi.c
  3. 7 5
      package/uhttpd/src/uhttpd-lua.c

+ 1 - 1
package/uhttpd/Makefile

@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=uhttpd
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 

+ 7 - 5
package/uhttpd/src/uhttpd-cgi.c

@@ -360,6 +360,9 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf
 
 			memset(hdr, 0, sizeof(hdr));
 
+			timeout.tv_sec = cl->server->conf->script_timeout;
+			timeout.tv_usec = 0;
+
 #define ensure(x) \
 	do { if( x < 0 ) goto out; } while(0)
 
@@ -372,12 +375,11 @@ void uh_cgi_request(struct client *cl, struct http_request *req, struct path_inf
 				FD_SET(rfd[0], &reader);
 				FD_SET(wfd[1], &writer);
 
-				timeout.tv_sec = cl->server->conf->script_timeout;
-				timeout.tv_usec = 0;
-
 				/* wait until we can read or write or both */
-				if( select(fd_max, &reader, (content_length > -1) ? &writer : NULL, NULL, &timeout) > 0 )
-				{
+				if( select(fd_max, &reader,
+					(content_length > -1) ? &writer : NULL, NULL,
+					(header_sent < 1) ? &timeout : NULL) > 0
+				) {
 					/* ready to write to cgi program */
 					if( FD_ISSET(wfd[1], &writer) )
 					{

+ 7 - 5
package/uhttpd/src/uhttpd-lua.c

@@ -439,6 +439,9 @@ void uh_lua_request(struct client *cl, struct http_request *req, lua_State *L)
 
 			data_sent = 0;
 
+			timeout.tv_sec = cl->server->conf->script_timeout;
+			timeout.tv_usec = 0;
+
 			/* I/O loop, watch our pipe ends and dispatch child reads/writes from/to socket */
 			while( 1 )
 			{
@@ -448,12 +451,11 @@ void uh_lua_request(struct client *cl, struct http_request *req, lua_State *L)
 				FD_SET(rfd[0], &reader);
 				FD_SET(wfd[1], &writer);
 
-				timeout.tv_sec = cl->server->conf->script_timeout;
-				timeout.tv_usec = 0;
-
 				/* wait until we can read or write or both */
-				if( select(fd_max, &reader, (content_length > -1) ? &writer : NULL, NULL, &timeout) > 0 )
-				{
+				if( select(fd_max, &reader,
+				    (content_length > -1) ? &writer : NULL, NULL,
+					(data_sent < 1) ? &timeout : NULL) > 0
+				) {
 					/* ready to write to Lua child */
 					if( FD_ISSET(wfd[1], &writer) )
 					{