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;
 	    }
 	}

