This patch breaks the proxy. Specifically, anyone who uses ap_proxy_make_fake_req().
Get
a seg fault in ap_get_limit_req_body because r->per_dir_config is NULL. I'll spend
some
time on this tomorrow unless someone wants to jump on it tonight.
Bill
----- Original Message -----
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, January 02, 2002 2:56 AM
Subject: cvs commit: httpd-2.0/server core.c
> jerenkrantz 02/01/01 23:56:25
>
> Modified: . CHANGES
> include http_core.h
> modules/http http_protocol.c
> server core.c
> Log:
> Fix LimitRequestBody directive by moving the relevant code from
> ap_*_client_block to ap_http_filter (aka HTTP_IN). This is the
> only appropriate place for limit checking to occur (otherwise,
> chunked input is not correctly limited).
>
> Also changed the type of limit_req_body to apr_off_t to match the
> other types inside of HTTP_IN. Also made the strtol call for
> limit_req_body a bit more robust.
>
> Revision Changes Path
> 1.499 +4 -0 httpd-2.0/CHANGES
>
> Index: CHANGES
> ===================================================================
> RCS file: /home/cvs/httpd-2.0/CHANGES,v
> retrieving revision 1.498
> retrieving revision 1.499
> diff -u -r1.498 -r1.499
> --- CHANGES 31 Dec 2001 21:03:12 -0000 1.498
> +++ CHANGES 2 Jan 2002 07:56:24 -0000 1.499
> @@ -1,4 +1,8 @@
> Changes with Apache 2.0.30-dev
> +
> + *) Fix LimitRequestBody directive by placing it in the HTTP
> + filter. [Justin Erenkrantz]
> +
> *) Fix mod_proxy seg fault when the proxied server returns
> an HTTP/0.9 response or a bogus status line.
> [Adam Sussman]
>
>
>
> 1.58 +3 -3 httpd-2.0/include/http_core.h
>
> Index: http_core.h
> ===================================================================
> RCS file: /home/cvs/httpd-2.0/include/http_core.h,v
> retrieving revision 1.57
> retrieving revision 1.58
> diff -u -r1.57 -r1.58
> --- http_core.h 1 Jan 2002 20:36:18 -0000 1.57
> +++ http_core.h 2 Jan 2002 07:56:24 -0000 1.58
> @@ -234,9 +234,9 @@
> * Return the limit on bytes in request msg body
> * @param r The current request
> * @return the maximum number of bytes in the request msg body
> - * @deffunc unsigned long ap_get_limit_req_body(const request_rec *r)
> + * @deffunc apr_off_t ap_get_limit_req_body(const request_rec *r)
> */
> -AP_DECLARE(unsigned long) ap_get_limit_req_body(const request_rec *r);
> +AP_DECLARE(apr_off_t) ap_get_limit_req_body(const request_rec *r);
>
> /**
> * Return the limit on bytes in XML request msg body
> @@ -471,7 +471,7 @@
> #ifdef RLIMIT_NPROC
> struct rlimit *limit_nproc;
> #endif
> - unsigned long limit_req_body; /* limit on bytes in request msg body */
> + apr_off_t limit_req_body; /* limit on bytes in request msg body */
> long limit_xml_body; /* limit on bytes in XML request msg body */
>
> /* logging options */
>
>
>
> 1.383 +33 -11 httpd-2.0/modules/http/http_protocol.c
>
> Index: http_protocol.c
> ===================================================================
> RCS file: /home/cvs/httpd-2.0/modules/http/http_protocol.c,v
> retrieving revision 1.382
> retrieving revision 1.383
> diff -u -r1.382 -r1.383
> --- http_protocol.c 6 Dec 2001 02:57:19 -0000 1.382
> +++ http_protocol.c 2 Jan 2002 07:56:24 -0000 1.383
> @@ -510,6 +510,8 @@
>
> typedef struct http_filter_ctx {
> apr_off_t remaining;
> + apr_off_t limit;
> + apr_off_t limit_used;
> enum {
> BODY_NONE,
> BODY_LENGTH,
> @@ -536,6 +538,9 @@
> const char *tenc, *lenp;
> f->ctx = ctx = apr_palloc(f->r->pool, sizeof(*ctx));
> ctx->state = BODY_NONE;
> + ctx->remaining = 0;
> + ctx->limit_used = 0;
> + ctx->limit = ap_get_limit_req_body(f->r);
>
> tenc = apr_table_get(f->r->headers_in, "Transfer-Encoding");
> lenp = apr_table_get(f->r->headers_in, "Content-Length");
> @@ -562,6 +567,18 @@
> ctx->state = BODY_LENGTH;
> ctx->remaining = atol(lenp);
> }
> +
> + /* If we have a limit in effect and we know the C-L ahead of
> + * time, stop it here if it is invalid.
> + */
> + if (ctx->limit && ctx->limit < ctx->remaining) {
> + ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r,
> + "Requested content-length of %" APR_OFF_T_FMT
> + " is larger than the configured limit"
> + " of %" APR_OFF_T_FMT, ctx->remaining, ctx->limit);
> + ap_die(HTTP_REQUEST_ENTITY_TOO_LARGE, f->r);
> + return APR_EGENERAL;
> + }
> }
> }
>
> @@ -620,6 +637,22 @@
> ctx->remaining -= *readbytes;
> }
>
> + /* We have a limit in effect. */
> + if (ctx->limit) {
> + /* FIXME: Note that we might get slightly confused on chunked inputs
> + * as we'd need to compensate for the chunk lengths which may not
> + * really count. This seems to be up for interpretation. */
> + ctx->limit_used += *readbytes;
> + if (ctx->limit < ctx->limit_used) {
> + ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r,
> + "Read content-length of %" APR_OFF_T_FMT
> + " is larger than the configured limit"
> + " of %" APR_OFF_T_FMT, ctx->limit_used, ctx->limit);
> + ap_die(HTTP_REQUEST_ENTITY_TOO_LARGE, f->r);
> + return APR_EGENERAL;
> + }
> + }
> +
> return APR_SUCCESS;
> }
>
> @@ -1283,7 +1316,6 @@
> {
> const char *tenc = apr_table_get(r->headers_in, "Transfer-Encoding");
> const char *lenp = apr_table_get(r->headers_in, "Content-Length");
> - apr_off_t max_body;
>
> r->read_body = read_policy;
> r->read_chunked = 0;
> @@ -1322,16 +1354,6 @@
> && (r->read_chunked || (r->remaining > 0))) {
> ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
> "%s with body is not allowed for %s", r->method, r->uri);
> - return HTTP_REQUEST_ENTITY_TOO_LARGE;
> - }
> -
> - max_body = ap_get_limit_req_body(r);
> - if (max_body && (r->remaining > max_body)) {
> - /* XXX shouldn't we enforce this for chunked encoding too? */
> - ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
> - "Request content-length of %s is larger than "
> - "the configured limit of %" APR_OFF_T_FMT, lenp,
> - max_body);
> return HTTP_REQUEST_ENTITY_TOO_LARGE;
> }
>
>
>
>
> 1.126 +6 -2 httpd-2.0/server/core.c
>
> Index: core.c
> ===================================================================
> RCS file: /home/cvs/httpd-2.0/server/core.c,v
> retrieving revision 1.125
> retrieving revision 1.126
> diff -u -r1.125 -r1.126
> --- core.c 2 Jan 2002 05:29:08 -0000 1.125
> +++ core.c 2 Jan 2002 07:56:25 -0000 1.126
> @@ -778,7 +778,7 @@
> return apr_psprintf(p, "%s://%s:%u%s", ap_http_method(r), host, port, uri);
> }
>
> -AP_DECLARE(unsigned long) ap_get_limit_req_body(const request_rec *r)
> +AP_DECLARE(apr_off_t) ap_get_limit_req_body(const request_rec *r)
> {
> core_dir_config *d =
> (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
> @@ -2093,6 +2093,7 @@
> {
> core_dir_config *conf=conf_;
> const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
> + char *errp;
> if (err != NULL) {
> return err;
> }
> @@ -2101,7 +2102,10 @@
> * Instead we have an idiotic define in httpd.h that prevents
> * it from being used even when it is available. Sheesh.
> */
> - conf->limit_req_body = (unsigned long)strtol(arg, (char **)NULL, 10);
> + conf->limit_req_body = (apr_off_t)strtol(arg, &errp, 10);
> + if (*errp != '\0') {
> + return "LimitRequestBody requires a non-negative integer.";
> + }
> return NULL;
> }
>
>
>
>
>