Author: rjung
Date: Fri Jun 22 08:45:10 2007
New Revision: 549851
URL: http://svn.apache.org/viewvc?view=rev&rev=549851
Log:
Revert r544137 (Mladen's unescape and normalization
patch for Apache).
We will enforce URL safety by reencoding using JFCs
copy from mod_proxy.
Apache and Netscape do decoding and normalization themselves,
so we don't need to do it a second time before matching
the forwarding rules.
We will use parts of this in a coming patch to optionally
reject URLs which might be malicious to bad backends.
Modified:
tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c?view=diff&rev=549851&r1=549850&r2=549851
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c Fri Jun 22
08:45:10 2007
@@ -36,8 +36,6 @@
#define JK_STRCMP strcmp
#define JK_STRNCMP strncmp
#endif
-#define BAD_REQUEST -1
-#define BAD_PATH -2
static const char *uri_worker_map_source_type[] = {
@@ -49,116 +47,6 @@
NULL
};
-#define JK_ISXDIGIT(x) isxdigit((int)(unsigned char)((x)))
-
-static char x2c(const char *what)
-{
- register char digit;
-
- digit = ((what[0] >= 'A') ?
- ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0'));
- digit *= 16;
- digit += ((what[1] >= 'A') ?
- ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0'));
- return (digit);
-}
-
-static int unescape_url(char *url)
-{
- register int x, y, badesc, badpath;
-
- badesc = 0;
- badpath = 0;
- for (x = 0, y = 0; url[y]; ++x, ++y) {
- if (url[y] != '%')
- url[x] = url[y];
- else {
- if (!JK_ISXDIGIT(url[y + 1]) || !JK_ISXDIGIT(url[y + 2])) {
- badesc = 1;
- url[x] = '%';
- }
- else {
- url[x] = x2c(&url[y + 1]);
- y += 2;
- if (url[x] == '/' || url[x] == '\0')
- badpath = 1;
- }
- }
- }
- url[x] = '\0';
- if (badesc)
- return BAD_REQUEST;
- else if (badpath)
- return BAD_PATH;
- else
- return 0;
-}
-
-static void normalize_url(char *name)
-{
- int l, w;
-
- /* Four paseses, as per RFC 1808 */
- /* 1. remove ./ path segments */
-
- for (l = 0, w = 0; name[l] != '\0';) {
- if (name[l] == '.' && name[l + 1] == '/'
- && (l == 0 || name[l - 1] == '/'))
- l += 2;
- else
- name[w++] = name[l++];
- }
-
- /* 2. remove trailing . path, segment */
- if (w == 1 && name[0] == '.')
- w--;
- else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/')
- w--;
- name[w] = '\0';
-
- /* 3. remove all xx/../ segments. (including leading ../ and /../) */
- l = 0;
-
- while (name[l] != '\0') {
- if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' &&
- (l == 0 || name[l - 1] == '/')) {
- register int m = l + 3, n;
-
- l = l - 2;
- if (l >= 0) {
- while (l >= 0 && name[l] != '/')
- l--;
- l++;
- }
- else
- l = 0;
- n = l;
- while ((name[n] = name[m]) != '\0') {
- n++;
- m++;
- }
- }
- else
- ++l;
- }
-
- /* 4. 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] == '/') {
- l = l - 4;
- if (l >= 0) {
- while (l >= 0 && name[l] != '/')
- l--;
- l++;
- }
- else
- l = 0;
- name[l] = '\0';
- }
-}
-
/* Return the string representation of the uwr source */
const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l)
@@ -647,7 +535,6 @@
const char *uri, jk_logger_t *l)
{
unsigned int i;
- int rc;
const char *rv = NULL;
char url[JK_MAX_URI_LEN+1];
@@ -691,22 +578,6 @@
url[i] = uri[i];
}
url[i] = '\0';
- if (JK_IS_DEBUG_LEVEL(l))
- jk_log(l, JK_LOG_DEBUG, "Attempting to map original URI '%s' from %d
maps",
- url, uw_map->size);
- rc = unescape_url(url);
- if (rc == BAD_REQUEST) {
- jk_log(l, JK_LOG_INFO, "Invalid request while unescaping original URI
'%s'", url);
- return NULL;
- }
- else if (rc == BAD_PATH) {
- jk_log(l, JK_LOG_INFO, "Invalid path while unescaping URI '%s'", url);
- return NULL;
- }
- normalize_url(url);
- if (JK_IS_DEBUG_LEVEL(l))
- jk_log(l, JK_LOG_DEBUG, "Attempting to map normalized URI '%s' from %d
maps",
- url, uw_map->size);
if (JK_IS_DEBUG_LEVEL(l)) {
char *url_rewrite = strstr(uri, JK_PATH_SESSION_IDENTIFIER);
@@ -714,6 +585,10 @@
jk_log(l, JK_LOG_DEBUG, "separating session identifier '%s' from
url '%s'",
url_rewrite, uri);
}
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "Attempting to map URI '%s' from %d maps",
+ url, uw_map->size);
+
for (i = 0; i < uw_map->size; i++) {
uri_worker_record_t *uwr = uw_map->maps[i];
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]