Module Name: src
Committed By: shm
Date: Thu Jul 16 12:19:23 UTC 2015
Modified Files:
src/libexec/httpd: bozohttpd.c tilde-luzah-bozo.c
Log Message:
Fix handling path with multiple slashes at the beginning
Fix redirections escaping for user support
OK mrg@
To generate a diff of this commit:
cvs rdiff -u -r1.65 -r1.66 src/libexec/httpd/bozohttpd.c
cvs rdiff -u -r1.10 -r1.11 src/libexec/httpd/tilde-luzah-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.65 src/libexec/httpd/bozohttpd.c:1.66
--- src/libexec/httpd/bozohttpd.c:1.65 Thu Jul 9 12:32:16 2015
+++ src/libexec/httpd/bozohttpd.c Thu Jul 16 12:19:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bozohttpd.c,v 1.65 2015/07/09 12:32:16 shm Exp $ */
+/* $NetBSD: bozohttpd.c,v 1.66 2015/07/16 12:19:23 shm Exp $ */
/* $eterna: bozohttpd.c,v 1.178 2011/11/18 09:21:15 mrg Exp $ */
@@ -895,8 +895,12 @@ bozo_escape_rfc3986(bozohttpd_t *httpd,
case ';':
case '=':
case '%':
+ case '\n':
+ case '\r':
+ case ' ':
+ case '"':
encode_it:
- snprintf(d, 4, "%%%2X", *s++);
+ snprintf(d, 4, "%%%02X", *s++);
d += 3;
len += 3;
break;
@@ -1332,6 +1336,10 @@ transform_request(bozo_httpreq_t *reques
goto bad_done;
}
+ /* omit additional slashes at the beginning */
+ while (file[1] == '/')
+ file++;
+
switch(check_bzredirect(request)) {
case -1:
goto bad_done;
Index: src/libexec/httpd/tilde-luzah-bozo.c
diff -u src/libexec/httpd/tilde-luzah-bozo.c:1.10 src/libexec/httpd/tilde-luzah-bozo.c:1.11
--- src/libexec/httpd/tilde-luzah-bozo.c:1.10 Thu Jan 2 08:21:38 2014
+++ src/libexec/httpd/tilde-luzah-bozo.c Thu Jul 16 12:19:23 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: tilde-luzah-bozo.c,v 1.10 2014/01/02 08:21:38 mrg Exp $ */
+/* $NetBSD: tilde-luzah-bozo.c,v 1.11 2015/07/16 12:19:23 shm Exp $ */
/* $eterna: tilde-luzah-bozo.c,v 1.16 2011/11/18 09:21:15 mrg Exp $ */
@@ -36,6 +36,7 @@
#include <sys/param.h>
+#include <assert.h>
#include <errno.h>
#include <pwd.h>
#include <stdlib.h>
@@ -58,20 +59,28 @@ int
bozo_user_transform(bozo_httpreq_t *request, int *isindex)
{
bozohttpd_t *httpd = request->hr_httpd;
- char c, *s, *file = NULL;
+ char c, *s, *file = NULL, *user;
struct passwd *pw;
*isindex = 0;
- if ((s = strchr(request->hr_file + 2, '/')) != NULL) {
+ /* find username */
+ user = strchr(request->hr_file + 2, '~');
+
+ /* this shouldn't happen, but "better paranoid than sorry" */
+ assert(user != NULL);
+
+ user++;
+
+ if ((s = strchr(user, '/')) != NULL) {
*s++ = '\0';
c = s[strlen(s)-1];
*isindex = (c == '/' || c == '\0');
}
debug((httpd, DEBUG_OBESE, "looking for user %s",
- request->hr_file + 2));
- pw = getpwnam(request->hr_file + 2);
+ user));
+ pw = getpwnam(user);
/* fix this up immediately */
if (s)
s[-1] = '/';