Index: include/http_log.h =================================================================== RCS file: /home/cvs/httpd-2.0/include/http_log.h,v retrieving revision 1.38 diff -u -r1.38 http_log.h --- include/http_log.h 4 Jun 2002 19:01:05 -0000 1.38 +++ include/http_log.h 9 Aug 2002 16:34:02 -0000 @@ -119,7 +119,7 @@ * Note: Client generated text streams sent back to the client MUST * be escaped to prevent CSS attacks. */ -#define APLOG_TOCLIENT (APLOG_LEVELMASK + 2) +#define APLOG_TOCLIENT ((APLOG_LEVELMASK + 1) * 2) /* normal but significant condition on startup, usually printed to stderr */ #define APLOG_STARTUP ((APLOG_LEVELMASK + 1) * 4) Index: modules/generators/mod_cgi.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgi.c,v retrieving revision 1.143 diff -u -r1.143 mod_cgi.c --- modules/generators/mod_cgi.c 13 Jun 2002 06:36:40 -0000 1.143 +++ modules/generators/mod_cgi.c 9 Aug 2002 16:34:06 -0000 @@ -480,9 +480,9 @@ if (rc != APR_SUCCESS) { /* Bad things happened. Everyone should have cleaned up. */ - ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rc, r, "couldn't create child process: %d: %s", rc, - r->filename); + apr_filename_of_pathname(r->filename)); } else { apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); Index: modules/generators/mod_cgid.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgid.c,v retrieving revision 1.137 diff -u -r1.137 mod_cgid.c --- modules/generators/mod_cgid.c 13 Jun 2002 19:41:17 -0000 1.137 +++ modules/generators/mod_cgid.c 9 Aug 2002 16:34:09 -0000 @@ -653,8 +653,9 @@ if (rc != APR_SUCCESS) { /* Bad things happened. Everyone should have cleaned up. */ - ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r, - "couldn't create child process: %d: %s", rc, r->filename); + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rc, r, + "couldn't create child process: %d: %s", rc, + apr_filename_of_pathname(r->filename)); } } } Index: modules/mappers/mod_negotiation.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/mappers/mod_negotiation.c,v retrieving revision 1.102 diff -u -r1.102 mod_negotiation.c --- modules/mappers/mod_negotiation.c 17 May 2002 11:24:16 -0000 1.102 +++ modules/mappers/mod_negotiation.c 9 Aug 2002 16:34:15 -0000 @@ -984,7 +984,7 @@ break; } mime_info.bytes = len; - mime_info.file_name = rr->filename; + mime_info.file_name = apr_filename_of_pathname(rr->filename); } } else { @@ -1048,15 +1048,15 @@ clean_var_rec(&mime_info); - if (!(filp = strrchr(r->filename, '/'))) { - return DECLINED; /* Weird... */ + if (r->proxyreq || !r->filename + || !ap_os_is_path_absolute(neg->pool, r->filename)) { + return DECLINED; } - /* XXX this should be more general, and quit using 'specials' */ - if (strncmp(r->filename, "proxy:", 6) == 0) { + /* Only absolute paths here */ + if (!(filp = strrchr(r->filename, '/'))) { return DECLINED; } - ++filp; prefix_len = strlen(filp); @@ -2685,8 +2685,15 @@ * non-neighboring variant. We can have a non-neighboring * variant when processing a type map. */ - if (ap_strchr_c(variant->file_name, '/')) + if (ap_strchr(variant->file_name, '/')) + neg->is_transparent = 0; + + /* We can't be transparent, because of the behavior + * of variant typemap bodies. + */ + if (variant->body) { neg->is_transparent = 0; + } } } @@ -2818,9 +2825,6 @@ apr_bucket *e; ap_allow_standard_methods(r, REPLACE_ALLOW, M_GET, M_OPTIONS, M_POST, -1); - if ((res = ap_discard_request_body(r)) != OK) { - return res; - } /*if (r->method_number == M_OPTIONS) { * return ap_send_http_options(r); *} @@ -2841,6 +2845,9 @@ return res; } + if ((res = ap_discard_request_body(r)) != OK) { + return res; + } bb = apr_brigade_create(r->pool, c->bucket_alloc); e = apr_bucket_file_create(map, best->body, (apr_size_t)best->bytes, r->pool, Index: server/util.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/util.c,v retrieving revision 1.128 diff -u -r1.128 util.c --- server/util.c 17 May 2002 11:11:37 -0000 1.128 +++ server/util.c 9 Aug 2002 16:34:19 -0000 @@ -115,6 +115,16 @@ */ #define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f)) +/* Win32/NetWare/OS2 need to check for both forward and back slashes + * in ap_getparents() and ap_escape_url. + */ +#ifdef CASE_BLIND_FILESYSTEM +#define IS_SLASH(s) ((s == '/') || (s == '\\')) +#else +#define IS_SLASH(s) (s == '/') +#endif + + /* * Examine a field value (such as a media-/content-type) string and return * it sans any parameters; e.g., strip off any ';charset=foo' and the like. @@ -485,7 +495,7 @@ } l = w = first_dot = next - name; while (name[l] != '\0') { - if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l - 1] == '/')) + if (name[l] == '.' && IS_SLASH(name[l + 1]) && (l == 0 || IS_SLASH(name[l - 1]))) l += 2; else name[w++] = name[l++]; @@ -494,7 +504,7 @@ /* b) remove trailing . path, segment */ if (w == 1 && name[0] == '.') w--; - else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/') + else if (w > 1 && name[w - 1] == '.' && IS_SLASH(name[w - 2])) w--; name[w] = '\0'; @@ -502,13 +512,13 @@ l = first_dot; while (name[l] != '\0') { - if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' && - (l == 0 || name[l - 1] == '/')) { + if (name[l] == '.' && name[l + 1] == '.' && IS_SLASH(name[l + 2]) && + (l == 0 || IS_SLASH(name[l - 1]))) { register int m = l + 3, n; l = l - 2; if (l >= 0) { - while (l >= 0 && name[l] != '/') + while (l >= 0 && !IS_SLASH(name[l])) l--; l++; } @@ -525,10 +535,10 @@ /* d) remove trailing xx/.. segment. */ if (l == 2 && name[0] == '.' && name[1] == '.') name[0] = '\0'; - else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') { + else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && IS_SLASH(name[l - 3])) { l = l - 4; if (l >= 0) { - while (l >= 0 && name[l] != '/') + while (l >= 0 && !IS_SLASH(name[l])) l--; l++; } @@ -1547,7 +1557,7 @@ else { *x = x2c(y + 1); y += 2; - if (*x == '/' || *x == '\0') + if (IS_SLASH(*x) || *x == '\0') badpath = 1; } }