httpd: add support for directory indexer (cgi-bin/index.cgi)
This commit is contained in:
		| @@ -893,9 +893,8 @@ static int sendHeaders(HttpResponseNum responseNum) | ||||
| 				responseNum, responseString, | ||||
| 				responseNum, responseString, infoString); | ||||
| 	} | ||||
| #if DEBUG | ||||
| 	fprintf(stderr, "headers: '%s'\n", buf); | ||||
| #endif | ||||
| 	if (DEBUG) | ||||
| 		fprintf(stderr, "headers: '%s'\n", buf); | ||||
| 	return full_write(config->accepted_socket, buf, len); | ||||
| } | ||||
|  | ||||
| @@ -984,7 +983,7 @@ static int sendCgi(const char *url, | ||||
| 		if (purl == NULL) | ||||
| 			_exit(242); | ||||
|  | ||||
| 		inFd  = toCgi[0]; | ||||
| 		inFd = toCgi[0]; | ||||
| 		outFd = fromCgi[1]; | ||||
|  | ||||
| 		dup2(inFd, 0);  // replace stdin with the pipe | ||||
| @@ -1028,7 +1027,7 @@ static int sendCgi(const char *url, | ||||
| 			setenv1("REQUEST_URI", purl); | ||||
| 		} | ||||
| 		if (script != NULL) | ||||
| 			*script = '\0';         /* reduce /PATH_INFO */ | ||||
| 			*script = '\0';         /* cut off /PATH_INFO */ | ||||
| 		 /* SCRIPT_FILENAME required by PHP in CGI mode */ | ||||
| 		if (!realpath(purl + 1, realpath_buff)) | ||||
| 			goto error_execing_cgi; | ||||
| @@ -1546,7 +1545,7 @@ static void handleIncoming(void) | ||||
| 			*test = '/'; | ||||
| 		} | ||||
| 		if (blank >= 0) { | ||||
| 			// read until blank line for HTTP version specified, else parse immediate | ||||
| 			/* read until blank line for HTTP version specified, else parse immediate */ | ||||
| 			while (1) { | ||||
| 				alarm(TIMEOUT); | ||||
| 				count = getLine(); | ||||
| @@ -1568,7 +1567,7 @@ static void handleIncoming(void) | ||||
| 						length = strtol(test, &test, 10); | ||||
| 						/* length is "ulong", but we need to pass it to int later */ | ||||
| 						/* so we check for negative or too large values in one go: */ | ||||
| 						/* (long -> ulong conv will cause negatives to be seen as > INT_MAX) */ | ||||
| 						/* (long -> ulong conv caused negatives to be seen as > INT_MAX) */ | ||||
| 						if (test[0] || errno || length > INT_MAX) | ||||
| 							goto bail_out; | ||||
| 					} | ||||
| @@ -1599,14 +1598,14 @@ static void handleIncoming(void) | ||||
|  | ||||
| 			} /* while extra header reading */ | ||||
| 		} | ||||
| 		(void) alarm(0); | ||||
| 		alarm(0); | ||||
| 		if (config->alarm_signaled) | ||||
| 			break; | ||||
|  | ||||
| 		if (strcmp(strrchr(url, '/') + 1, httpd_conf) == 0 || ip_allowed == 0) { | ||||
| 			/* protect listing [/path]/httpd_conf or IP deny */ | ||||
| #if ENABLE_FEATURE_HTTPD_CGI | ||||
| FORBIDDEN:		/* protect listing /cgi-bin */ | ||||
|  FORBIDDEN:		/* protect listing /cgi-bin */ | ||||
| #endif | ||||
| 			sendHeaders(HTTP_FORBIDDEN); | ||||
| 			break; | ||||
| @@ -1631,25 +1630,30 @@ FORBIDDEN:		/* protect listing /cgi-bin */ | ||||
| #if ENABLE_FEATURE_HTTPD_CGI | ||||
| 		if (strncmp(test, "cgi-bin", 7) == 0) { | ||||
| 			if (test[7] == '/' && test[8] == 0) | ||||
| 				goto FORBIDDEN;     // protect listing cgi-bin/ | ||||
| 				goto FORBIDDEN;     /* protect listing cgi-bin/ */ | ||||
| 			sendCgi(url, prequest, length, cookie, content_type); | ||||
| 		} else { | ||||
| 			if (prequest != request_GET) | ||||
| 				sendHeaders(HTTP_NOT_IMPLEMENTED); | ||||
| 			else { | ||||
| #endif  /* FEATURE_HTTPD_CGI */ | ||||
| 				if (purl[-1] == '/') | ||||
| 					strcpy(purl, "index.html"); | ||||
| 				if (stat(test, &sb) == 0) { | ||||
| 					config->ContentLength = sb.st_size; | ||||
| 					config->last_mod = sb.st_mtime; | ||||
| 				} | ||||
| 				sendFile(test); | ||||
| 				config->ContentLength = -1; | ||||
| #if ENABLE_FEATURE_HTTPD_CGI | ||||
| 			break; | ||||
| 		} | ||||
| 		if (prequest != request_GET) { | ||||
| 			sendHeaders(HTTP_NOT_IMPLEMENTED); | ||||
| 			break; | ||||
| 		} | ||||
| 		if (purl[-1] == '/') { | ||||
| 			if (access("cgi-bin/index.cgi", X_OK) == 0) { | ||||
| 				config->query = url; | ||||
| 				sendCgi("/cgi-bin/index.cgi", prequest, length, cookie, content_type); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| #endif | ||||
| #endif  /* FEATURE_HTTPD_CGI */ | ||||
| 		if (purl[-1] == '/') | ||||
| 			strcpy(purl, "index.html"); | ||||
| 		if (stat(test, &sb) == 0) { | ||||
| 			config->ContentLength = sb.st_size; | ||||
| 			config->last_mod = sb.st_mtime; | ||||
| 		} | ||||
| 		sendFile(test); | ||||
| 		config->ContentLength = -1; | ||||
| 	} while (0); | ||||
|  | ||||
|  bail_out: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user