You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rp...@apache.org on 2008/01/07 11:15:28 UTC
svn commit: r609550 - /httpd/httpd/trunk/modules/http/http_filters.c
Author: rpluem
Date: Mon Jan 7 02:15:26 2008
New Revision: 609550
URL: http://svn.apache.org/viewvc?rev=609550&view=rev
Log:
* Optimize and unify detection of blank / corrupt chunk size lines.
Modified:
httpd/httpd/trunk/modules/http/http_filters.c
Modified: httpd/httpd/trunk/modules/http/http_filters.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http/http_filters.c?rev=609550&r1=609549&r2=609550&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http/http_filters.c (original)
+++ httpd/httpd/trunk/modules/http/http_filters.c Mon Jan 7 02:15:26 2008
@@ -55,6 +55,8 @@
#include <unistd.h>
#endif
+#define INVALID_CHAR -2
+
extern module AP_MODULE_DECLARE_DATA http_module;
static long get_chunk_size(char *);
@@ -202,6 +204,7 @@
http_ctx_t *ctx = f->ctx;
apr_status_t rv;
apr_off_t totalread;
+ apr_status_t http_error = HTTP_REQUEST_ENTITY_TOO_LARGE;
/* just get out of the way of things we don't want. */
if (mode != AP_MODE_READBYTES && mode != AP_MODE_GETLINE) {
@@ -347,6 +350,10 @@
}
if (rv == APR_SUCCESS) {
ctx->remaining = get_chunk_size(ctx->chunk_ln);
+ if (ctx->remaining == INVALID_CHAR) {
+ rv = APR_EGENERAL;
+ http_error = HTTP_SERVICE_UNAVAILABLE;
+ }
}
}
apr_brigade_cleanup(bb);
@@ -355,7 +362,7 @@
if (rv != APR_SUCCESS || ctx->remaining < 0) {
ctx->remaining = 0; /* Reset it in case we have to
* come back here later */
- return bail_out_on_error(ctx, f, HTTP_REQUEST_ENTITY_TOO_LARGE);
+ return bail_out_on_error(ctx, f, http_error);
}
if (!ctx->remaining) {
@@ -389,7 +396,6 @@
case BODY_CHUNK_PART:
{
apr_bucket_brigade *bb;
- apr_status_t http_error = HTTP_REQUEST_ENTITY_TOO_LARGE;
bb = ctx->bb;
apr_brigade_cleanup(bb);
@@ -439,17 +445,11 @@
return rv;
}
if (rv == APR_SUCCESS) {
- /*
- * Wait a sec, that's a blank line or it starts
- * with an invalid character! Oh no.
- */
- if (!apr_isxdigit(*(ctx->chunk_ln))) {
+ ctx->remaining = get_chunk_size(ctx->chunk_ln);
+ if (ctx->remaining == INVALID_CHAR) {
rv = APR_EGENERAL;
http_error = HTTP_SERVICE_UNAVAILABLE;
}
- else {
- ctx->remaining = get_chunk_size(ctx->chunk_ln);
- }
}
}
apr_brigade_cleanup(bb);
@@ -554,6 +554,13 @@
ap_xlate_proto_from_ascii(b, strlen(b));
+ if (!apr_isxdigit(*b)) {
+ /*
+ * Detect invalid character at beginning. This also works for empty
+ * chunk size lines.
+ */
+ return INVALID_CHAR;
+ }
/* Skip leading zeros */
while (*b == '0') {
++b;