Squid-2.2.STABLE2: delay pools, large initial level It is a bit to easy to get a integer overflow when using delay pools for limiting daily download. This patch changes the initial calculation to use floating point math, allowing a initial pool size of up to 2^31-1. Index: squid/src/delay_pools.c diff -u squid/src/delay_pools.c:1.1.1.8.4.2 squid/src/delay_pools.c:1.1.1.8.4.3 --- squid/src/delay_pools.c:1.1.1.8.4.2 Wed May 5 11:33:50 1999 +++ squid/src/delay_pools.c Wed May 19 23:01:48 1999 @@ -211,18 +211,18 @@ */ 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', @@ -296,8 +296,8 @@ if (!delay_data[pool].class2->individual_255_used) { delay_data[pool].class2->individual_255_used = 1; delay_data[pool].class2->individual[255] = - (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); } @@ -308,8 +308,8 @@ delay_data[pool].class2->individual_map[i] = host; 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; } } @@ -324,8 +324,8 @@ 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++) { @@ -336,8 +336,8 @@ delay_data[pool].class3->individual_map[i][0] = 255; 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; } } @@ -348,8 +348,8 @@ if (!(delay_data[pool].class3->individual_255_used[i / 8] & (1 << (i % 8)))) { delay_data[pool].class3->individual_255_used[i / 8] |= (1 << (i % 8)); 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); } @@ -362,8 +362,8 @@ delay_data[pool].class3->individual_map[i][j] = host; delay_data[pool].class3->individual_map[i][j + 1] = 255; delay_data[pool].class3->individual[position |= j] = - (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; } }