Module Name:    src
Committed By:   martin
Date:           Thu Jun 27 10:01:31 UTC 2013

Modified Files:
        src/libexec/httpd: bozohttpd.c bozohttpd.h cgi-bozo.c

Log Message:
Redo previous (fixing a memory leak introduced), and while there rework
virtual server support - in daemonized mode mixed virtual and "main"
server usage would alter the virtual hostname depending on order of
requests.
To fix, move the effective virtual hostname into the request structure
and leave the httpd server description static.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/libexec/httpd/bozohttpd.c
cvs rdiff -u -r1.23 -r1.24 src/libexec/httpd/bozohttpd.h
cvs rdiff -u -r1.20 -r1.21 src/libexec/httpd/cgi-bozo.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/httpd/bozohttpd.c
diff -u src/libexec/httpd/bozohttpd.c:1.34 src/libexec/httpd/bozohttpd.c:1.35
--- src/libexec/httpd/bozohttpd.c:1.34	Sun Jun 23 20:32:55 2013
+++ src/libexec/httpd/bozohttpd.c	Thu Jun 27 10:01:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bozohttpd.c,v 1.34 2013/06/23 20:32:55 martin Exp $	*/
+/*	$NetBSD: bozohttpd.c,v 1.35 2013/06/27 10:01:31 martin Exp $	*/
 
 /*	$eterna: bozohttpd.c,v 1.178 2011/11/18 09:21:15 mrg Exp $	*/
 
@@ -337,6 +337,7 @@ bozo_clean_request(bozo_httpreq_t *reque
 	MF(hr_remotehost);
 	MF(hr_remoteaddr);
 	MF(hr_serverport);
+	MF(hr_virthostname);
 	MF(hr_file);
 	MF(hr_oldfile);
 	MF(hr_query);
@@ -539,6 +540,7 @@ bozo_read_request(bozohttpd_t *httpd)
 	request->hr_range = NULL;
 	request->hr_last_byte_pos = -1;
 	request->hr_if_modified_since = NULL;
+	request->hr_virthostname = NULL;
 	request->hr_file = NULL;
 	request->hr_oldfile = NULL;
 
@@ -954,6 +956,7 @@ handle_redirect(bozo_httpreq_t *request,
 	bozohttpd_t *httpd = request->hr_httpd;
 	char *urlbuf;
 	char portbuf[20];
+	const char *hostname = BOZOHOST(httpd, request);
 	int query = 0;
 	
 	if (url == NULL) {
@@ -972,7 +975,7 @@ handle_redirect(bozo_httpreq_t *request,
 		    request->hr_serverport);
 	else
 		portbuf[0] = '\0';
-	bozo_warn(httpd, "redirecting %s%s%s", httpd->virthostname, portbuf, url);
+	bozo_warn(httpd, "redirecting %s%s%s", hostname, portbuf, url);
 	debug((httpd, DEBUG_FAT, "redirecting %s", url));
 	bozo_printf(httpd, "%s 301 Document Moved\r\n", request->hr_proto);
 	if (request->hr_proto != httpd->consts.http_09) 
@@ -980,7 +983,7 @@ handle_redirect(bozo_httpreq_t *request,
 	if (request->hr_proto != httpd->consts.http_09) {
 		bozo_printf(httpd, "Location: http://";);
 		if (absolute == 0)
-			bozo_printf(httpd, "%s%s", httpd->virthostname, portbuf);
+			bozo_printf(httpd, "%s%s", hostname, portbuf);
 		if (query) {
 			bozo_printf(httpd, "%s?%s\r\n", url, request->hr_query);
 		} else {
@@ -997,13 +1000,13 @@ handle_redirect(bozo_httpreq_t *request,
 		if (absolute)
 			bozo_printf(httpd, "%s?%s", url, request->hr_query);
 		else
-			bozo_printf(httpd, "%s%s%s?%s", httpd->virthostname,
+			bozo_printf(httpd, "%s%s%s?%s", hostname,
 				    portbuf, url, request->hr_query);
 	} else {
 		if (absolute)
 			bozo_printf(httpd, "%s", url);
 		else
-			bozo_printf(httpd, "%s%s%s", httpd->virthostname,
+			bozo_printf(httpd, "%s%s%s", hostname,
 				    portbuf, url);
 	}
 	bozo_printf(httpd, "\">here</a>\n");
@@ -1076,9 +1079,10 @@ check_virtual(bozo_httpreq_t *request)
 				    len) == 0) {
 					/* found it, punch it */
 					debug((httpd, DEBUG_OBESE, "found it punch it"));
-					httpd->virthostname = strdup(d->d_name);
+					request->hr_virthostname =
+					    bozostrdup(httpd,d->d_name);
 					if (asprintf(&s, "%s/%s", httpd->virtbase,
-					    httpd->virthostname) < 0)
+					    request->hr_virthostname) < 0)
 						bozo_err(httpd, 1, "asprintf");
 					break;
 				}
@@ -1268,6 +1272,7 @@ transform_request(bozo_httpreq_t *reques
 	bozohttpd_t *httpd = request->hr_httpd;
 	char	*file, *newfile = NULL;
 	size_t	len;
+	const char *hostname = BOZOHOST(httpd, request);
 
 	file = NULL;
 	*isindex = 0;
@@ -1306,10 +1311,10 @@ transform_request(bozo_httpreq_t *reques
 
 			debug((httpd, DEBUG_FAT,
 				"checking referrer \"%s\" vs virthostname %s",
-				r, httpd->virthostname));
+				r, hostname));
 			if (strncmp(r, "http://";, 7) != 0 ||
-			    (strncasecmp(r + 7, httpd->virthostname,
-			    		 strlen(httpd->virthostname)) != 0 &&
+			    (strncasecmp(r + 7, hostname,
+			    		 strlen(hostname)) != 0 &&
 			     !TOP_PAGE(file)))
 				to_indexhtml = 1;
 		} else {
@@ -1318,8 +1323,8 @@ transform_request(bozo_httpreq_t *reques
 			debug((httpd, DEBUG_FAT, "url has no referrer at all"));
 			/* if there's no referrer, let / or /index.html past */
 			if (!TOP_PAGE(file) ||
-			    (h && strncasecmp(h, httpd->virthostname,
-			    		strlen(httpd->virthostname)) != 0))
+			    (h && strncasecmp(h, hostname,
+			    		strlen(hostname)) != 0))
 				to_indexhtml = 1;
 		}
 
@@ -1829,6 +1834,7 @@ bozo_http_error(bozohttpd_t *httpd, int 
 	const char *reason = http_errors_long(code);
 	const char *proto = (request && request->hr_proto) ?
 				request->hr_proto : httpd->consts.http_11;
+	const char *hostname = BOZOHOST(httpd, request);
 	int	size;
 
 	debug((httpd, DEBUG_FAT, "bozo_http_error %d: %s", code, msg));
@@ -1855,7 +1861,7 @@ bozo_http_error(bozohttpd_t *httpd, int 
  		    "<hr><address><a href=\"http://%s%s/\";>%s%s</a></address>\n"
 		    "</body></html>\n",
 		    header, header, request->hr_file, reason,
-		    httpd->virthostname, portbuf, httpd->virthostname, portbuf);
+		    hostname, portbuf, hostname, portbuf);
 		if (size >= (int)BUFSIZ) {
 			bozo_warn(httpd,
 				"bozo_http_error buffer too small, truncated");

Index: src/libexec/httpd/bozohttpd.h
diff -u src/libexec/httpd/bozohttpd.h:1.23 src/libexec/httpd/bozohttpd.h:1.24
--- src/libexec/httpd/bozohttpd.h:1.23	Thu Jul 19 09:53:06 2012
+++ src/libexec/httpd/bozohttpd.h	Thu Jun 27 10:01:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: bozohttpd.h,v 1.23 2012/07/19 09:53:06 mrg Exp $	*/
+/*	$NetBSD: bozohttpd.h,v 1.24 2013/06/27 10:01:31 martin Exp $	*/
 
 /*	$eterna: bozohttpd.h,v 1.39 2011/11/18 09:21:15 mrg Exp $	*/
 
@@ -117,6 +117,8 @@ typedef struct bozo_httpreq_t {
 #define HTTP_TRACE	0x07	/* not supported */
 #define HTTP_CONNECT	0x08	/* not supported */
 	const char *hr_methodstr;
+	char	*hr_virthostname;	/* server name (if not identical
+					   to hr_httpd->virthostname) */
 	char	*hr_file;
 	char	*hr_oldfile;	/* if we added an index_html */
 	char	*hr_query;  
@@ -144,6 +146,11 @@ typedef struct bozo_httpreq_t {
 	int	hr_nheaders;
 } bozo_httpreq_t;
 
+/* helper to access the "active" host name from a httpd/request pair */
+#define	BOZOHOST(HTTPD,REQUEST)	((REQUEST)->hr_virthostname ?		\
+					(REQUEST)->hr_virthostname :	\
+					(HTTPD)->virthostname)
+
 /* structure to hold string based (name, value) pairs with preferences */
 typedef struct bozoprefs_t {
 	unsigned	  size;		/* size of the two arrays */

Index: src/libexec/httpd/cgi-bozo.c
diff -u src/libexec/httpd/cgi-bozo.c:1.20 src/libexec/httpd/cgi-bozo.c:1.21
--- src/libexec/httpd/cgi-bozo.c:1.20	Fri Nov 18 09:51:31 2011
+++ src/libexec/httpd/cgi-bozo.c	Thu Jun 27 10:01:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cgi-bozo.c,v 1.20 2011/11/18 09:51:31 mrg Exp $	*/
+/*	$NetBSD: cgi-bozo.c,v 1.21 2013/06/27 10:01:31 martin Exp $	*/
 
 /*	$eterna: cgi-bozo.c,v 1.40 2011/11/18 09:21:15 mrg Exp $	*/
 
@@ -380,7 +380,7 @@ bozo_process_cgi(bozo_httpreq_t *request
 
 	bozo_setenv(httpd, "PATH", _PATH_DEFPATH, curenvp++);
 	bozo_setenv(httpd, "IFS", " \t\n", curenvp++);
-	bozo_setenv(httpd, "SERVER_NAME", httpd->virthostname, curenvp++);
+	bozo_setenv(httpd, "SERVER_NAME", BOZOHOST(httpd,request), curenvp++);
 	bozo_setenv(httpd, "GATEWAY_INTERFACE", "CGI/1.1", curenvp++);
 	bozo_setenv(httpd, "SERVER_PROTOCOL", request->hr_proto, curenvp++);
 	bozo_setenv(httpd, "REQUEST_METHOD", request->hr_methodstr, curenvp++);

Reply via email to