rse 99/10/27 02:03:00
Modified: src CHANGES src/modules/standard mod_rewrite.c Log: Overhauled mod_rewrite's general substitution function (expand_backref_inbuffer): 1. The `$0' backreference is now officially allowed and documented and references the while pattern space; 2. the ampersamp (&) backreference (which is equal to $0) is no longer expanded, because it was never documented and only leads to confusion with QUERY_STRINGS; 3. backslashes (\) are honored correctly, that is `\$N' now really forces the dollar to be an ordinary character and $N is not expanded. Submitted by: Ralf S. Engelschall PR: 4766 4161 Revision Changes Path 1.1442 +10 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1441 retrieving revision 1.1442 diff -u -r1.1441 -r1.1442 --- CHANGES 1999/10/27 08:10:06 1.1441 +++ CHANGES 1999/10/27 09:02:43 1.1442 @@ -1,5 +1,15 @@ Changes with Apache 1.3.10 + *) Overhauled mod_rewrite's general substitution function + (expand_backref_inbuffer): 1. The `$0' backreference is now officially + allowed and documented and references the while pattern space; 2. the + ampersamp (&) backreference (which is equal to $0) is no longer expanded, + because it was never documented and only leads to confusion with + QUERY_STRINGS; 3. backslashes (\) are honored correctly, that is `\$N' + now really forces the dollar to be an ordinary character and $N is + not expanded. + [Ralf S. Engelschall] PR#4766 PR#4161 + *) Make sure mod_rewrite escapes QUERY_STRINGS on redirects. [Klaus Johannes Rusch <[EMAIL PROTECTED]>] PR#4734 1.149 +24 -21 apache-1.3/src/modules/standard/mod_rewrite.c Index: mod_rewrite.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v retrieving revision 1.148 retrieving revision 1.149 diff -u -r1.148 -r1.149 --- mod_rewrite.c 1999/10/27 08:18:58 1.148 +++ mod_rewrite.c 1999/10/27 09:02:49 1.149 @@ -2493,34 +2493,37 @@ static void expand_backref_inbuffer(pool *p, char *buf, int nbuf, backrefinfo *bri, char c) { - int i; + register int i; - if (bri->nsub < 1) { - return; - } - - if (c != '$') { - /* safe existing $N backrefs and replace <c>N with $N backrefs */ - for (i = 0; buf[i] != '\0' && i < nbuf; i++) { - if (buf[i] == '$' && (buf[i+1] >= '0' && buf[i+1] <= '9')) { - buf[i++] = '\001'; - } - else if (buf[i] == c && (buf[i+1] >= '0' && buf[i+1] <= '9')) { - buf[i++] = '$'; - } + /* protect existing $N and & backrefs and replace <c>N with $N backrefs */ + for (i = 0; buf[i] != '\0' && i < nbuf; i++) { + if (buf[i] == '\\' && (buf[i+1] != '\0' && i < (nbuf-1))) { + i++; /* protect next */ + } + else if (buf[i] == '&') { + buf[i] = '\001'; } + else if (c != '$' && buf[i] == '$' && (buf[i+1] >= '0' && buf[i+1] <= '9')) { + buf[i] = '\002'; + i++; /* speedup */ + } + else if (buf[i] == c && (buf[i+1] >= '0' && buf[i+1] <= '9')) { + buf[i] = '$'; + i++; /* speedup */ + } } - /* now apply the pregsub() function */ + /* now apply the standard regex substitution function */ ap_cpystrn(buf, ap_pregsub(p, buf, bri->source, bri->nsub+0, bri->regmatch), nbuf); - if (c != '$') { - /* restore the original $N backrefs */ - for (i = 0; buf[i] != '\0' && i < nbuf; i++) { - if (buf[i] == '\001' && (buf[i+1] >= '0' && buf[i+1] <= '9')) { - buf[i++] = '$'; - } + /* restore the original $N and & backrefs */ + for (i = 0; buf[i] != '\0' && i < nbuf; i++) { + if (buf[i] == '\001') { + buf[i] = '&'; + } + else if (buf[i] == '\002') { + buf[i] = '$'; } } }