Index: include/http_log.h =================================================================== RCS file: /home/cvs/httpd-2.0/include/http_log.h,v retrieving revision 1.35 diff -u -r1.35 http_log.h --- include/http_log.h 22 Apr 2002 03:25:40 -0000 1.35 +++ include/http_log.h 9 Aug 2002 16:32:53 -0000 @@ -107,7 +107,7 @@ /* Use APLOG_TOCLIENT to cause ap_log_rerror() to send the message * to the client in addition to recording it to the error log. */ -#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.134 diff -u -r1.134 mod_cgi.c --- modules/generators/mod_cgi.c 22 Apr 2002 08:08:37 -0000 1.134 +++ modules/generators/mod_cgi.c 9 Aug 2002 16:32:56 -0000 @@ -477,8 +477,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)); } 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.128 diff -u -r1.128 mod_cgid.c --- modules/generators/mod_cgid.c 22 Apr 2002 08:08:38 -0000 1.128 +++ modules/generators/mod_cgid.c 9 Aug 2002 16:32:59 -0000 @@ -644,8 +644,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.101 diff -u -r1.101 mod_negotiation.c --- modules/mappers/mod_negotiation.c 29 Mar 2002 08:17:23 -0000 1.101 +++ modules/mappers/mod_negotiation.c 9 Aug 2002 16:33:05 -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.127 diff -u -r1.127 util.c --- server/util.c 29 Apr 2002 07:20:46 -0000 1.127 +++ server/util.c 9 Aug 2002 16:33:10 -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; } }