From: hno <> Date: Wed, 3 May 2000 00:55:10 +0000 (+0000) Subject: hno squid-2.2.STABLE2.delay_pools_initial_level_overflow.patch X-Git-Tag: SQUID_3_0_PRE1~2026 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c8b408033dd196ce8d731def948171558c813f78;p=thirdparty%2Fsquid.git hno squid-2.2.STABLE2.delay_pools_initial_level_overflow.patch Squid-2.2.STABLE2: delay pools, large initial level It was a bit to easy to get a integer overflow when using delay pools for limiting daily download. Changes the initial calculation to use floating point math, allowing a initial pool size of up to 2^31-1. --- diff --git a/ChangeLog b/ChangeLog index 48e3d3c721..656dd1f27a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,7 @@ Changes to Squid-2.4.DEVEL3 (): the maximum allowed size. - allow-miss cache_peer option disabling the use of "only-if-cached". Meant to be used in conjunction with icp_hit_stale. + - Delay pools tuned to allow large initial pool values Changes to Squid-2.4.DEVEL2 (): diff --git a/src/delay_pools.cc b/src/delay_pools.cc index eadb75695e..38be59aa55 100644 --- a/src/delay_pools.cc +++ b/src/delay_pools.cc @@ -1,6 +1,6 @@ /* - * $Id: delay_pools.cc,v 1.13 2000/03/06 16:23:30 wessels Exp $ + * $Id: delay_pools.cc,v 1.14 2000/05/02 18:55:11 hno Exp $ * * DEBUG: section 77 Delay Pools * AUTHOR: David Luyer @@ -222,18 +222,18 @@ delayInitDelayPool(unsigned short pool, u_char class, delaySpecSet * rates) */ switch (class) { case 1: - delay_data[pool].class1->aggregate = (rates->aggregate.max_bytes * - Config.Delay.initial) / 100; + delay_data[pool].class1->aggregate = (int)(((double)rates->aggregate.max_bytes * + Config.Delay.initial) / 100); break; case 2: - delay_data[pool].class2->aggregate = (rates->aggregate.max_bytes * - Config.Delay.initial) / 100; + delay_data[pool].class2->aggregate = (int)(((double)rates->aggregate.max_bytes * + Config.Delay.initial) / 100); delay_data[pool].class2->individual_map[0] = 255; delay_data[pool].class2->individual_255_used = 0; break; case 3: - delay_data[pool].class3->aggregate = (rates->aggregate.max_bytes * - Config.Delay.initial) / 100; + delay_data[pool].class3->aggregate = (int)(((double)rates->aggregate.max_bytes * + Config.Delay.initial) / 100); delay_data[pool].class3->network_map[0] = 255; delay_data[pool].class3->network_255_used = 0; memset(&delay_data[pool].class3->individual_255_used, '\0', @@ -307,8 +307,8 @@ delayClient(request_t * r) if (!delay_data[pool].class2->individual_255_used) { delay_data[pool].class2->individual_255_used = 1; delay_data[pool].class2->individual[IND_MAP_SZ - 1] = - (Config.Delay.rates[pool]->individual.max_bytes * - Config.Delay.initial) / 100; + (int)(((double)Config.Delay.rates[pool]->individual.max_bytes * + Config.Delay.initial) / 100); } return delayId(pool + 1, 255); } @@ -320,8 +320,8 @@ delayClient(request_t * r) assert(i < (IND_MAP_SZ - 1)); delay_data[pool].class2->individual_map[i + 1] = 255; delay_data[pool].class2->individual[i] = - (Config.Delay.rates[pool]->individual.max_bytes * - Config.Delay.initial) / 100; + (int)(((double)Config.Delay.rates[pool]->individual.max_bytes * + Config.Delay.initial) / 100); break; } } @@ -336,8 +336,8 @@ delayClient(request_t * r) if (!delay_data[pool].class3->network_255_used) { delay_data[pool].class3->network_255_used = 1; delay_data[pool].class3->network[255] = - (Config.Delay.rates[pool]->network.max_bytes * - Config.Delay.initial) / 100; + (int)(((double)Config.Delay.rates[pool]->network.max_bytes * + Config.Delay.initial) / 100); } } else { for (i = 0; i < NET_MAP_SZ; i++) { @@ -349,8 +349,8 @@ delayClient(request_t * r) assert(i < (NET_MAP_SZ - 1)); delay_data[pool].class3->network_map[i + 1] = 255; delay_data[pool].class3->network[i] = - (Config.Delay.rates[pool]->network.max_bytes * - Config.Delay.initial) / 100; + (int)(((double)Config.Delay.rates[pool]->network.max_bytes * + Config.Delay.initial) / 100); break; } } @@ -362,8 +362,8 @@ delayClient(request_t * r) delay_data[pool].class3->individual_255_used[i / 8] |= (1 << (i % 8)); assert(position < C3_IND_SZ); delay_data[pool].class3->individual[position] = - (Config.Delay.rates[pool]->individual.max_bytes * - Config.Delay.initial) / 100; + (int)(((double)Config.Delay.rates[pool]->individual.max_bytes * + Config.Delay.initial) / 100); } return delayId(pool + 1, position); } @@ -380,8 +380,8 @@ delayClient(request_t * r) position |= j; assert(position < C3_IND_SZ); delay_data[pool].class3->individual[position] = - (Config.Delay.rates[pool]->individual.max_bytes * - Config.Delay.initial) / 100; + (int)(((double)Config.Delay.rates[pool]->individual.max_bytes * + Config.Delay.initial) / 100); break; } }