Module Name: src
Committed By: shm
Date: Tue Jul 1 13:41:21 UTC 2014
Modified Files:
src/libexec/httpd: bozohttpd.c
Log Message:
* bozo_clean_request free(3) clean up (removed needless checks)
* HEAD method no longer returns response body on error
* fixed bug with multiple bozo_http_error calls caused by fix_url_percent
OK @mrg
To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/libexec/httpd/bozohttpd.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.50 src/libexec/httpd/bozohttpd.c:1.51
--- src/libexec/httpd/bozohttpd.c:1.50 Sat May 17 05:50:46 2014
+++ src/libexec/httpd/bozohttpd.c Tue Jul 1 13:41:21 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: bozohttpd.c,v 1.50 2014/05/17 05:50:46 mrg Exp $ */
+/* $NetBSD: bozohttpd.c,v 1.51 2014/07/01 13:41:21 shm Exp $ */
/* $eterna: bozohttpd.c,v 1.178 2011/11/18 09:21:15 mrg Exp $ */
@@ -333,16 +333,14 @@ bozo_clean_request(bozo_httpreq_t *reque
bozo_ssl_destroy(request->hr_httpd);
/* clean up request */
-#define MF(x) if (request->x) free(request->x)
- MF(hr_remotehost);
- MF(hr_remoteaddr);
- MF(hr_serverport);
- MF(hr_virthostname);
- MF(hr_file);
- MF(hr_oldfile);
- MF(hr_query);
- MF(hr_host);
-#undef MF
+ free(request->hr_remotehost);
+ free(request->hr_remoteaddr);
+ free(request->hr_serverport);
+ free(request->hr_virthostname);
+ free(request->hr_file);
+ free(request->hr_oldfile);
+ free(request->hr_query);
+ free(request->hr_host);
bozo_auth_cleanup(request);
for (hdr = SIMPLEQ_FIRST(&request->hr_headers); hdr;
hdr = SIMPLEQ_NEXT(hdr, h_next)) {
@@ -1199,7 +1197,7 @@ check_bzredirect(bozo_httpreq_t *request
}
/* this fixes the %HH hack that RFC2396 requires. */
-static void
+static int
fix_url_percent(bozo_httpreq_t *request)
{
bozohttpd_t *httpd = request->hr_httpd;
@@ -1212,7 +1210,7 @@ fix_url_percent(bozo_httpreq_t *request)
/* fast forward to the first % */
if ((s = strchr(url, '%')) == NULL)
- return;
+ return 0;
t = s;
do {
@@ -1229,17 +1227,17 @@ fix_url_percent(bozo_httpreq_t *request)
if (s[1] == '\0' || s[2] == '\0') {
(void)bozo_http_error(httpd, 400, request,
"percent hack missing two chars afterwards");
- goto copy_rest;
+ return 1;
}
if (s[1] == '0' && s[2] == '0') {
(void)bozo_http_error(httpd, 404, request,
"percent hack was %00");
- goto copy_rest;
+ return 1;
}
if (s[1] == '2' && s[2] == 'f') {
(void)bozo_http_error(httpd, 404, request,
"percent hack was %2f (/)");
- goto copy_rest;
+ return 1;
}
buf[0] = *++s;
@@ -1252,7 +1250,7 @@ fix_url_percent(bozo_httpreq_t *request)
if (*t++ == '\0') {
(void)bozo_http_error(httpd, 400, request,
"percent hack got a 0 back");
- goto copy_rest;
+ return 1;
}
while (*s && *s != '%') {
@@ -1261,15 +1259,12 @@ fix_url_percent(bozo_httpreq_t *request)
*t++ = *s++;
}
} while (*s);
-copy_rest:
- while (*s) {
- if (s >= end)
- break;
- *t++ = *s++;
- }
*t = '\0';
+
debug((httpd, DEBUG_FAT, "fix_url_percent returns %s in url",
request->hr_file));
+
+ return 0;
}
/*
@@ -1299,7 +1294,9 @@ transform_request(bozo_httpreq_t *reques
file = NULL;
*isindex = 0;
debug((httpd, DEBUG_FAT, "tf_req: file %s", request->hr_file));
- fix_url_percent(request);
+ if (fix_url_percent(request)) {
+ goto bad_done;
+ }
if (check_virtual(request)) {
goto bad_done;
}
@@ -1918,7 +1915,9 @@ bozo_http_error(bozohttpd_t *httpd, int
if (request && request->hr_allow)
bozo_printf(httpd, "Allow: %s\r\n", request->hr_allow);
bozo_printf(httpd, "\r\n");
- if (size)
+ /* According to the RFC 2616 sec. 9.4 HEAD method MUST NOT return a
+ * message-body in the response */
+ if (size && request && request->hr_method != HTTP_HEAD)
bozo_printf(httpd, "%s", httpd->errorbuf);
bozo_flush(httpd, stdout);