svn commit: trunk/busybox/networking

vda at busybox.net vda at busybox.net
Wed Jan 3 15:02:18 PST 2007


Author: vda
Date: 2007-01-03 15:02:18 -0800 (Wed, 03 Jan 2007)
New Revision: 17151

Log:
httpd: read cgi output with full_read, not safe_read
(avoids mangling of HTTP headers)


Modified:
   trunk/busybox/networking/httpd.c


Changeset:
Modified: trunk/busybox/networking/httpd.c
===================================================================
--- trunk/busybox/networking/httpd.c	2007-01-03 22:53:41 UTC (rev 17150)
+++ trunk/busybox/networking/httpd.c	2007-01-03 23:02:18 UTC (rev 17151)
@@ -91,10 +91,8 @@
  *
 */
 
-
 #include "busybox.h"
 
-
 static const char httpdVersion[] = "busybox httpd/1.35 6-Oct-2004";
 static const char default_path_httpd_conf[] = "/etc";
 static const char httpd_conf[] = "httpd.conf";
@@ -1065,7 +1063,7 @@
 		 * It should not be decoded in any fashion. This variable
 		 * should always be set when there is query information,
 		 * regardless of command line decoding. */
-		/* (Older versions of bbox seemed to do some decoding) */
+		/* (Older versions of bbox seem to do some decoding) */
 		setenv1("QUERY_STRING", config->query);
 		setenv1("SERVER_SOFTWARE", httpdVersion);
 		putenv("SERVER_PROTOCOL=HTTP/1.0");
@@ -1097,7 +1095,7 @@
 			goto error_execing_cgi;
 		*script = '\0';
 		if (chdir(realpath_buff) == 0) {
-			// now run the program.  If it fails,
+			// Now run the program.  If it fails,
 			// use _exit() so no destructors
 			// get called and make a mess.
 #if ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR
@@ -1210,21 +1208,22 @@
 #endif
 
 			/* There is something to read */
-			count = safe_read(inFd, rbuf, PIPESIZE);
+			/* NB: was safe_read. If it *has to be* safe_read, */
+			/* please explain why in this comment... */
+			count = full_read(inFd, rbuf, PIPESIZE);
 			if (count == 0)
 				break;  /* closed */
 			if (count > 0) {
 				if (firstLine) {
+					/* full_read (above) avoids
+					 * "chopped up into small chunks" syndrome here */
 					rbuf[count] = 0;
 					/* check to see if the user script added headers */
 					if (strncmp(rbuf, "HTTP/1.0 200 OK\r\n", 4) != 0) {
+						/* there is no "HTTP", do it ourself */
 						full_write(s, "HTTP/1.0 200 OK\r\n", 17);
-					}
-					/* Sometimes CGI is writing to pipe in small chunks
-					 * and we don't see Content-type (because the read
-					 * is too short) and we emit bogus "text/plain"!
-					 * Is it a bug or CGI *has to* write it in one piece? */
-					if (strstr(rbuf, "ontent-") == 0) {
+					} /* hmm, maybe 'else if'? */
+					if (!strstr(rbuf, "ontent-")) {
 						full_write(s, "Content-type: text/plain\r\n\r\n", 28);
 					}
 					firstLine = 0;



More information about the busybox-cvs mailing list