Changeset 2001

Show
Ignore:
Timestamp:
10/05/2007 11:26:48 AM (11 months ago)
Author:
jan
Message:

fixed decoding of common headers in APJ13 (fixes #1399)

- added a bunch of debug code to make tracing easier and catching such

errors when they happen

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/NEWS

    r1990 r2001  
    44==== 
    55 
    6 - 1.5.0 - ... 
     6- 1.5.0 -  
     7  * fixed decoding of common headers in AJP13 (#1399) 
     8 
     9- 1.5.0-r19.. -  
    710  * -F option added for spawn-fcgi 
    811  * replaced mod_fastcgi, mod_scgi, mod_proxy with mod_proxy_core + backends 
     
    1215  * added dir-listing.set-footer in mod_dirlisting (#1277) 
    1316  * added logging of the PID and UID of the sending process for SIGTERM and SIGINT 
     17  * added support for AJP13 to mod_proxy_core 
    1418  * fixed the out-of-fd support  
    1519  * fixed crash in mod_expire if 'modification' is used and stat() failed (#1063) 
     
    2832    (reported by Stefan Esser) 
    2933  * fixed possible crash in Auth-Digest header parser on trailing WS in  
    30     mod_auth (reported by Stefan Esser)  
     34    mod_auth (reported by Stefan Esser) 
    3135 
    3236- 1.4.14 - ??? 
  • trunk/src/mod_proxy_backend_ajp13.c

    r1953 r2001  
    281281        /* string length */ 
    282282        len = ajp13_decode_int(data); 
    283         if ((ssize_t)len == -1) return len; 
     283        if ((ssize_t)len == -1) { 
     284                ERROR("ajp13_decode_int() returned invalid len: %d", len); 
     285                return len; 
     286        } 
     287#ifdef AJP13_DEBUG 
     288        TRACE("ajp13_decode_string() string-len: %d (is_header: %d, common-header: %d)", len, is_header, (len & AJP13_COMMON_HEADER_CODE)); 
     289#endif 
    284290 
    285291        /* if string is header, check for common header code. */ 
    286292        if (is_header && (len & AJP13_COMMON_HEADER_CODE)) { 
    287                 p = keyvalue_get_value(response_headers, len); 
    288                 if(p) len = strlen(p); 
     293                p = keyvalue_get_value(response_headers, len & ~AJP13_COMMON_HEADER_CODE); 
     294                if (p) { 
     295                        len = strlen(p); 
     296                } else { 
     297                        ERROR("ajp13_decode_string() can't resolve common-header: %d", len & ~AJP13_COMMON_HEADER_CODE); 
     298 
     299                        return -1; 
     300                } 
    289301        } 
    290302        /* copy string from buffer. */ 
    291303        if (p == NULL) { 
    292                 if ((data->buf->used - data->offset) <= (len + 1)) return -1; 
     304                if ((data->buf->used - data->offset) <= (len + 1)) { 
     305                        ERROR("we have %d bytes, but a partial-string wants %d. no way", (data->buf->used - data->offset), len); 
     306                        return -1; 
     307                } 
    293308                p = data->buf->ptr + data->offset; 
    294309                data->offset += len + 1; 
     
    309324        resp->protocol = HTTP_VERSION_UNSET; 
    310325        resp->status = ajp13_decode_int(data); 
    311         if (resp->status == -1) return -1; 
    312         if (ajp13_decode_string(resp->reason, data, 0) == -1) return -1; 
     326         
     327        if (resp->status == -1) { 
     328                ERROR("parsing AJP13 response-status failed, got %d", resp->status); 
     329                return -1; 
     330        } 
     331 
     332        if (ajp13_decode_string(resp->reason, data, 0) == -1) { 
     333                ERROR("parsing AJP13 response-reason failed: %s", "..."); 
     334                return -1; 
     335        } 
     336 
     337#ifdef AJP13_DEBUG 
     338        TRACE("ajp13: header-status: %d", resp->status); 
     339        TRACE("ajp13: header-reason: %s", resp->reason->ptr); 
     340#endif 
     341 
     342        /* leave if we have no headers to decode */ 
    313343        num = ajp13_decode_int(data); 
    314         if(num > 0) { 
    315                 key = buffer_init(); 
    316                 value = buffer_init(); 
    317                 for(i = 0; i < num; i++) { 
    318                         key_len = ajp13_decode_string(key, data, 1); 
    319                         value_len = ajp13_decode_string(value, data, 1); 
    320                         if (key_len > 0 && value_len >= 0) { 
    321                                 array_append_key_value(resp->headers, key->ptr, key_len, value->ptr, value_len); 
    322                         } 
    323                 } 
    324                 buffer_free(key); 
    325                 buffer_free(value); 
    326         } 
     344#ifdef AJP13_DEBUG 
     345        TRACE("ajp13: header-count: %d", num); 
     346#endif 
     347 
     348        if (0 == num) return 0; 
     349 
     350        key = buffer_init(); 
     351        value = buffer_init(); 
     352        for(i = 0; i < num; i++) { 
     353                key_len = ajp13_decode_string(key, data, 1); 
     354                value_len = ajp13_decode_string(value, data, 1); 
     355#ifdef AJP13_DEBUG 
     356                TRACE("ajp13: header[%d]: key-len: %d, value-len: %d", i, key_len, value_len); 
     357#endif 
     358 
     359                if (key_len > 0 && value_len >= 0) { 
     360                        array_append_key_value(resp->headers, key->ptr, key_len, value->ptr, value_len); 
     361#ifdef AJP13_DEBUG 
     362                        TRACE("ajp13: header[%d]: %s = %s", i, key->ptr, value->ptr); 
     363#endif 
     364                } else { 
     365                        ERROR("ajp13: response-headers skipped: key-len = %d, val-len = %d", key_len, value_len); 
     366                } 
     367        } 
     368        buffer_free(key); 
     369        buffer_free(value); 
     370 
    327371        return 0; 
    328372}