components/subversion/patches/003-CVE-2013-4505.patch
author Gabriel Carrillo <gabriel.carrillo@oracle.com>
Fri, 20 Mar 2015 14:10:33 -0700
branchs11u2-sru
changeset 4000 3644abf7d157
permissions -rw-r--r--
backout 19476174/20673493 - needs more work
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4000
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     1
# CVE-2013-4505
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     2
# http://subversion.apache.org/security/CVE-2013-4505-advisory.txt
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     3
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     4
--- tools/server-side/mod_dontdothat/mod_dontdothat.c	2011-11-28 12:02:41.000000000 -0800
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     5
+++ tools/server-side/mod_dontdothat/mod_dontdothat.c	2014-01-29 06:58:46.573510739 -0800
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     6
@@ -30,12 +30,14 @@
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     7
 #include <util_filter.h>
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     8
 #include <ap_config.h>
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
     9
 #include <apr_strings.h>
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    10
+#include <apr_uri.h>
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    11
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    12
 #include <expat.h>
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    13
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    14
 #include "mod_dav_svn.h"
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    15
 #include "svn_string.h"
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    16
 #include "svn_config.h"
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    17
+#include "private/svn_fspath.h"
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    18
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    19
 module AP_MODULE_DECLARE_DATA dontdothat_module;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    20
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    21
@@ -161,26 +163,71 @@
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    22
     }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    23
 }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    24
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    25
+/* duplicate of dav_svn__log_err() from mod_dav_svn/util.c */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    26
+static void
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    27
+log_dav_err(request_rec *r,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    28
+                dav_error *err,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    29
+                int level)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    30
+{
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    31
+  dav_error *errscan;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    32
+
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    33
+  /* Log the errors */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    34
+  /* ### should have a directive to log the first or all */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    35
+  for (errscan = err; errscan != NULL; errscan = errscan->prev) {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    36
+    apr_status_t status;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    37
+
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    38
+    if (errscan->desc == NULL)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    39
+      continue;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    40
+
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    41
+#if AP_MODULE_MAGIC_AT_LEAST(20091119,0)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    42
+    status = errscan->aprerr;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    43
+#else
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    44
+    status = errscan->save_errno;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    45
+#endif
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    46
+
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    47
+    ap_log_rerror(APLOG_MARK, level, status, r,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    48
+        "%s  [%d, #%d]",
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    49
+        errscan->desc, errscan->status, errscan->error_id);
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    50
+  }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    51
+}
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    52
+
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    53
 static svn_boolean_t
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    54
 is_this_legal(dontdothat_filter_ctx *ctx, const char *uri)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    55
 {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    56
   const char *relative_path;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    57
   const char *cleaned_uri;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    58
   const char *repos_name;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    59
+  const char *uri_path;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    60
   int trailing_slash;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    61
   dav_error *derr;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    62
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    63
-  /* Ok, so we need to skip past the scheme, host, etc. */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    64
-  uri = ap_strstr_c(uri, "://");
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    65
-  if (uri)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    66
-    uri = ap_strchr_c(uri + 3, '/');
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    67
+  /* uri can be an absolute uri or just a path, we only want the path to match
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    68
+   * against */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    69
+  if (uri && svn_path_is_url(uri))
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    70
+  {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    71
+    apr_uri_t parsed_uri;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    72
+    apr_status_t rv = apr_uri_parse(ctx->r->pool, uri, &parsed_uri);
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    73
+    if (APR_SUCCESS != rv)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    74
+    {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    75
+      /* Error parsing the URI, log and reject request. */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    76
+      ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, ctx->r,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    77
+          "mod_dontdothat: blocked request after failing "
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    78
+          "to parse uri: '%s'", uri);
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    79
+      return FALSE;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    80
+    }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    81
+    uri_path = parsed_uri.path;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    82
+  }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    83
+  else
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    84
+  {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    85
+    uri_path = uri;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    86
+  }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    87
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    88
-  if (uri)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    89
+  if (uri_path)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    90
     {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    91
       const char *repos_path;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    92
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    93
       derr = dav_svn_split_uri(ctx->r,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    94
-                               uri,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    95
+                               uri_path,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    96
                                ctx->cfg->base_path,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    97
                                &cleaned_uri,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    98
                                &trailing_slash,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
    99
@@ -194,7 +241,7 @@
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   100
           if (! repos_path)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   101
             repos_path = "";
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   102
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   103
-          repos_path = apr_psprintf(ctx->r->pool, "/%s", repos_path);
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   104
+          repos_path = svn_fspath__canonicalize(repos_path, ctx->r->pool);
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   105
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   106
           /* First check the special cases that are always legal... */
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   107
           for (idx = 0; idx < ctx->allow_recursive_ops->nelts; ++idx)
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   108
@@ -228,6 +275,18 @@
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   109
                 }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   110
             }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   111
         }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   112
+      else
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   113
+      {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   114
+        log_dav_err(ctx->r, derr, APLOG_ERR);
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   115
+        return FALSE;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   116
+      }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   117
+    }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   118
+  else
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   119
+  {
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   120
+    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->r,
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   121
+        "mod_dontdothat: empty uri passed to is_this_legal(), "
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   122
+        "module bug?");
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   123
+    return FALSE;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   124
     }
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   125
 
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   126
   return TRUE;
3644abf7d157 backout 19476174/20673493 - needs more work
Gabriel Carrillo <gabriel.carrillo@oracle.com>
parents:
diff changeset
   127