Changeset 2001
- Timestamp:
- 10/05/2007 11:26:48 AM (11 months ago)
- Location:
- trunk
- Files:
-
- 2 modified
-
NEWS (modified) (3 diffs)
-
src/mod_proxy_backend_ajp13.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEWS
r1990 r2001 4 4 ==== 5 5 6 - 1.5.0 - ... 6 - 1.5.0 - 7 * fixed decoding of common headers in AJP13 (#1399) 8 9 - 1.5.0-r19.. - 7 10 * -F option added for spawn-fcgi 8 11 * replaced mod_fastcgi, mod_scgi, mod_proxy with mod_proxy_core + backends … … 12 15 * added dir-listing.set-footer in mod_dirlisting (#1277) 13 16 * added logging of the PID and UID of the sending process for SIGTERM and SIGINT 17 * added support for AJP13 to mod_proxy_core 14 18 * fixed the out-of-fd support 15 19 * fixed crash in mod_expire if 'modification' is used and stat() failed (#1063) … … 28 32 (reported by Stefan Esser) 29 33 * 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) 31 35 32 36 - 1.4.14 - ??? -
trunk/src/mod_proxy_backend_ajp13.c
r1953 r2001 281 281 /* string length */ 282 282 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 284 290 285 291 /* if string is header, check for common header code. */ 286 292 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 } 289 301 } 290 302 /* copy string from buffer. */ 291 303 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 } 293 308 p = data->buf->ptr + data->offset; 294 309 data->offset += len + 1; … … 309 324 resp->protocol = HTTP_VERSION_UNSET; 310 325 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 */ 313 343 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 327 371 return 0; 328 372 }

