>Number: 5326 >Category: mod_speling >Synopsis: mod_speling does not escape URLs >Confidential: no >Severity: non-critical >Priority: medium >Responsible: apache >State: open >Class: sw-bug >Submitter-Id: apache >Arrival-Date: Wed Nov 17 04:10:00 PST 1999 >Last-Modified: >Originator: [EMAIL PROTECTED] >Organization: apache >Release: 1.3.9 >Environment: Linux gristle.office.niss.ac.uk 2.2.10 #2 Thu Jun 17 11:36:26 BST 1999 i686 unknown gcc version 2.7.2.3 -- SunOS synapse 5.6 Generic_105181-16 sun4u sparc SUNW,Ultra-5_10 gcc version 2.8.1 >Description: If you have url /file%20name.html or /dir%20name/file.html and spell it slightly wrong (as per how mod_speling works) then it doesn't re-escape the " " (space) back to "%20".
(PS. if you want the patch below e-mailed as an attachment, let me know. Also - I have nuke-trailing-whitespace on, so there are a few extra "bogus" lines in this diff.) >How-To-Repeat: >Fix: --- src/modules/standard/mod_speling.c.orig Wed Nov 17 09:26:56 1999 +++ src/modules/standard/mod_speling.c Wed Nov 17 09:52:00 1999 @@ -264,7 +264,7 @@ filoc = ap_rind(r->filename, '/'); /* * Don't do anything if the request doesn't contain a slash, or - * requests "/" + * requests "/" */ if (filoc == -1 || strcmp(r->uri, "/") == 0) { return DECLINED; @@ -397,9 +397,29 @@ qsort((void *) candidates->elts, candidates->nelts, sizeof(misspelled_file), sort_by_quality); + /* 16.11.1999 nic <[EMAIL PROTECTED]> + * This escapes the last element of the of the path. + */ + for ( i = 0 ; i < candidates->nelts ; ++i ) { + /* Partial needs to be set because these are filenames */ + variant[i].name = ap_os_escape_path(r->pool, + variant[i].name, + 1); + } + /* 17.11.1999 nic <[EMAIL PROTECTED]> + * This escapes the rest of the path. + */ + url = ap_os_escape_path(r->pool, + url, + 0); /* - * Conditions for immediate redirection: - * a) the first candidate was not found by stripping the suffix + * Conditions for immediate redirection: + * a) the first candidate was not found by stripping the suffix * AND b) there exists only one candidate OR the best match is not * ambiguous * then return a redirection right away. @@ -496,7 +516,7 @@ if (i > 0 && i < candidates->nelts - 1 && variant[i].quality != SP_VERYDIFFERENT && variant[i + 1].quality == SP_VERYDIFFERENT) { - *(const char **)ap_push_array(t) = + *(const char **)ap_push_array(t) = "</ul>\nFurthermore, the following related " "documents were found:\n<ul>\n"; } @@ -519,7 +539,7 @@ ap_table_mergen(r->subprocess_env, "VARIANTS", ap_array_pstrcat(p, v, ',')); - ap_destroy_pool(sub_pool); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r, >Audit-Trail: >Unformatted: [In order for any reply to be added to the PR database, you need] [to include <[EMAIL PROTECTED]> in the Cc line and make sure the] [subject line starts with the report component and number, with ] [or without any 'Re:' prefixes (such as "general/1098:" or ] ["Re: general/1098:"). If the subject doesn't match this ] [pattern, your message will be misfiled and ignored. The ] ["apbugs" address is not added to the Cc line of messages from ] [the database automatically because of the potential for mail ] [loops. If you do not include this Cc, your reply may be ig- ] [nored unless you are responding to an explicit request from a ] [developer. Reply only with text; DO NOT SEND ATTACHMENTS! ]