Commit 64058b00 authored by William A. Rowe Jr's avatar William A. Rowe Jr
Browse files

List discussion resulted in rejecting all but SP characters in the request

line, but in the strict mode prioritize excessive space testing over bad
space testing (which is captured later) and make both more efficient
(at this test ll[0] is already a SP or NULL char). Also correct a comment.

Backports: r1770867
Submitted by: wrowe


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x-merge-http-strict@1770868 13f79535-47bb-0310-9956-ffa450edef68
parent 073dd215
Loading
Loading
Loading
Loading
+7 −9
Original line number Diff line number Diff line
@@ -680,7 +680,7 @@ static int read_request_line(request_rec *r, apr_bucket_brigade *bb)
        len = 0;
        goto rrl_done;
    }
    else if (strict && ll[0] && (ll[0] != ' ' || apr_isspace(ll[1]))
    else if (strict && ll[0] && apr_isspace(ll[1])
             && deferred_error == rrl_none) {
        deferred_error = rrl_excesswhitespace; 
    }
@@ -689,8 +689,7 @@ static int read_request_line(request_rec *r, apr_bucket_brigade *bb)
     * If non-SP whitespace is encountered, mark as specific error
     */
    for (uri = ll; apr_isspace(*uri); ++uri) 
        if (ap_strchr_c("\t\n\v\f\r", *uri)
                && deferred_error == rrl_none)
        if (*uri != ' ' && deferred_error == rrl_none)
            deferred_error = rrl_badwhitespace; 
    *ll = '\0';

@@ -706,13 +705,13 @@ static int read_request_line(request_rec *r, apr_bucket_brigade *bb)
        ll = strpbrk(ll, "\t\n\v\f\r ");
    }

    /* Verify method terminated with a single SP, or mark as specific error */
    /* Verify URI terminated with a single SP, or mark as specific error */
    if (!ll) {
        r->protocol = "";
        len = 0;
        goto rrl_done;
    }
    else if (strict && ll[0] && (ll[0] != ' ' || apr_isspace(ll[1]))
    else if (strict && ll[0] && apr_isspace(ll[1])
             && deferred_error == rrl_none) {
        deferred_error = rrl_excesswhitespace; 
    }
@@ -721,8 +720,7 @@ static int read_request_line(request_rec *r, apr_bucket_brigade *bb)
     * If non-SP whitespace is encountered, mark as specific error
     */
    for (r->protocol = ll; apr_isspace(*r->protocol); ++r->protocol) 
        if (ap_strchr_c("\t\n\v\f\r", *r->protocol)
                && deferred_error == rrl_none)
        if (*r->protocol != ' ' && deferred_error == rrl_none)
            deferred_error = rrl_badwhitespace; 
    *ll = '\0';