From 1b972d4e197054ee43004116af69132fefdec408 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Mon, 11 Mar 2013 16:32:28 +0000 Subject: [PATCH] Merge r1439623 from trunk: Fix error because of negative rate-limit PR : 52964 Submitted by: Tianyin Xu Submitted by: jailletc36 Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1455219 13f79535-47bb-0310-9956-ffa450edef68 --- STATUS | 6 ------ modules/filters/mod_ratelimit.c | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/STATUS b/STATUS index 3bfbd8ad89..2944a5322e 100644 --- a/STATUS +++ b/STATUS @@ -91,12 +91,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_rate_limit: Fix error because of negative rate-limit - PR 52964 [ianyin Xu ] - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1439623 - 2.4.x patch: trunk patch applies. - +1: jailletc36, fuankg, jim - * Set of easy patches to keep 2.4.x in line with trunk 1442865: Change bzero/bcopy into memset/memcpy (PR 54346) 1442759: Can't figure out why we allocate len+2 bytes here. Len+1 should be enough. diff --git a/modules/filters/mod_ratelimit.c b/modules/filters/mod_ratelimit.c index 028de361ab..611017875e 100644 --- a/modules/filters/mod_ratelimit.c +++ b/modules/filters/mod_ratelimit.c @@ -74,6 +74,7 @@ rate_limit_filter(ap_filter_t *f, apr_bucket_brigade *input_bb) if (ctx == NULL) { const char *rl = NULL; + int ratelimit; /* no subrequests. */ if (f->r->main != NULL) { @@ -87,22 +88,21 @@ rate_limit_filter(ap_filter_t *f, apr_bucket_brigade *input_bb) ap_remove_output_filter(f); return ap_pass_brigade(f->next, bb); } - - /* first run, init stuff */ - ctx = apr_palloc(f->r->pool, sizeof(rl_ctx_t)); - f->ctx = ctx; - ctx->speed = 0; - ctx->state = RATE_LIMIT; - + /* rl is in kilo bytes / second */ - ctx->speed = atoi(rl) * 1024; - - if (ctx->speed == 0) { + ratelimit = atoi(rl) * 1024; + if (ratelimit <= 0) { /* remove ourselves */ ap_remove_output_filter(f); return ap_pass_brigade(f->next, bb); } + /* first run, init stuff */ + ctx = apr_palloc(f->r->pool, sizeof(rl_ctx_t)); + f->ctx = ctx; + ctx->state = RATE_LIMIT; + ctx->speed = ratelimit; + /* calculate how many bytes / interval we want to send */ /* speed is bytes / second, so, how many (speed / 1000 % interval) */ ctx->chunk_size = (ctx->speed / (1000 / RATE_INTERVAL_MS)); -- 2.50.1