From 8faee23e840eceecadd129e73817ef9e6aea1af8 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Fri, 13 Jul 2012 16:08:17 +0000 Subject: [PATCH] Merge r1309602 from trunk: mod_rewrite: Fix RewriteCond integer checks to be parsed correctly. PR: 53023 Submitted by: Axel Reinhold Reviewed/Updated by: nd Submitted by: nd Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1361281 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 ++ STATUS | 5 --- modules/mappers/mod_rewrite.c | 84 ++++++++++++++++++++++------------- 3 files changed, 56 insertions(+), 36 deletions(-) diff --git a/CHANGES b/CHANGES index 7ac818f790..51770d244f 100644 --- a/CHANGES +++ b/CHANGES @@ -59,6 +59,9 @@ Changes with Apache 2.4.2 *) mod_ssl: Fix crash with threaded MPMs due to race condition when initializing EC temporary keys. [Stefan Fritsch] + *) mod_rewrite: Fix RewriteCond integer checks to be parsed correctly. + PR 53023. [Axel Reinhold , André Malo] + *) mod_proxy: Add the forcerecovery balancer parameter that determines if recovery for balancer workers is enforced. [Ruediger Pluem] diff --git a/STATUS b/STATUS index dcd2bccc70..87abe7ba9f 100644 --- a/STATUS +++ b/STATUS @@ -88,11 +88,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_rewrite: Fix RewriteCond integer checks to be parsed correctly. - (PR 53023) - Patch: http://svn.apache.org/viewvc?view=revision&revision=1309602 - (applies cleanly to 2.4.x) - +1: nd, sf, jim PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 10aec8f3af..1bd6b31bfb 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -3247,37 +3247,59 @@ static const char *cmd_rewritecond(cmd_parms *cmd, void *in_dconf, newcond->ptype = CONDPAT_AP_EXPR; } else if (*a2 && a2[1]) { - if (!a2[2] && *a2 == '-') { - switch (a2[1]) { - case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break; - case 's': newcond->ptype = CONDPAT_FILE_SIZE; break; - case 'd': newcond->ptype = CONDPAT_FILE_DIR; break; - case 'x': newcond->ptype = CONDPAT_FILE_XBIT; break; - case 'h': newcond->ptype = CONDPAT_FILE_LINK; break; - case 'L': newcond->ptype = CONDPAT_FILE_LINK; break; - case 'U': newcond->ptype = CONDPAT_LU_URL; break; - case 'F': newcond->ptype = CONDPAT_LU_FILE; break; - case 'l': if (a2[2] == 't') - a2 += 3, newcond->ptype = CONDPAT_INT_LT; - else if (a2[2] == 'e') - a2 += 3, newcond->ptype = CONDPAT_INT_LE; - else /* Historical; prefer -L or -h instead */ - newcond->ptype = CONDPAT_FILE_LINK; - break; - case 'g': if (a2[2] == 't') - a2 += 3, newcond->ptype = CONDPAT_INT_GT; - else if (a2[2] == 'e') - a2 += 3, newcond->ptype = CONDPAT_INT_GE; - break; - case 'e': if (a2[2] == 'q') - a2 += 3, newcond->ptype = CONDPAT_INT_EQ; - break; - case 'n': if (a2[2] == 'e') { - /* Inversion, ensure !-ne == -eq */ - a2 += 3, newcond->ptype = CONDPAT_INT_EQ; - newcond->flags ^= CONDFLAG_NOTMATCH; - } - break; + if (*a2 == '-') { + if (!a2[2]) { + switch (a2[1]) { + case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break; + case 's': newcond->ptype = CONDPAT_FILE_SIZE; break; + case 'd': newcond->ptype = CONDPAT_FILE_DIR; break; + case 'x': newcond->ptype = CONDPAT_FILE_XBIT; break; + case 'h': newcond->ptype = CONDPAT_FILE_LINK; break; + case 'L': newcond->ptype = CONDPAT_FILE_LINK; break; + case 'l': newcond->ptype = CONDPAT_FILE_LINK; break; + case 'U': newcond->ptype = CONDPAT_LU_URL; break; + case 'F': newcond->ptype = CONDPAT_LU_FILE; break; + } + } + else if (a2[3]) { + switch (a2[1]) { + case 'l': + if (a2[2] == 't') { + a2 += 3; + newcond->ptype = CONDPAT_INT_LT; + } + else if (a2[2] == 'e') { + a2 += 3; + newcond->ptype = CONDPAT_INT_LE; + } + break; + + case 'g': + if (a2[2] == 't') { + a2 += 3; newcond->ptype = CONDPAT_INT_GT; + } + else if (a2[2] == 'e') { + a2 += 3; + newcond->ptype = CONDPAT_INT_GE; + } + break; + + case 'e': + if (a2[2] == 'q') { + a2 += 3; + newcond->ptype = CONDPAT_INT_EQ; + } + break; + + case 'n': + if (a2[2] == 'e') { + /* Inversion, ensure !-ne == -eq */ + a2 += 3; + newcond->ptype = CONDPAT_INT_EQ; + newcond->flags ^= CONDFLAG_NOTMATCH; + } + break; + } } } else { -- 2.40.0