aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_limits.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2017-09-26 17:48:33 +0100
committerMatthew Wild <mwild1@gmail.com>2017-09-26 17:48:33 +0100
commit0cb33438d0b52dd39ce67107613bc18fb7c613c1 (patch)
tree7a93b438cbe3a27175d39542d59d50add8f9a47b /plugins/mod_limits.lua
parent63252575dfc7c74434c642beafd29e34e3c89c62 (diff)
downloadprosody-0cb33438d0b52dd39ce67107613bc18fb7c613c1.tar.gz
prosody-0cb33438d0b52dd39ce67107613bc18fb7c613c1.zip
mod_limits: Handle fractional outstanding balance values (caused by e3f7b6fa46ba)
Fractional values were passed to string.sub() when doing buffer manipulations, and caused random bytes to be skipped in the stream.
Diffstat (limited to 'plugins/mod_limits.lua')
-rw-r--r--plugins/mod_limits.lua2
1 files changed, 2 insertions, 0 deletions
diff --git a/plugins/mod_limits.lua b/plugins/mod_limits.lua
index 2a6ee8a2..66341618 100644
--- a/plugins/mod_limits.lua
+++ b/plugins/mod_limits.lua
@@ -4,6 +4,7 @@ module:set_global();
local filters = require "util.filters";
local throttle = require "util.throttle";
local timer = require "util.timer";
+local ceil = math.ceil;
local limits_cfg = module:get_option("limits", {});
local limits_resolution = module:get_option_number("limits_resolution", 1);
@@ -55,6 +56,7 @@ function default_filter_set.bytes_in(bytes, session)
local ok, balance, outstanding = throttle:poll(#bytes, true);
if not ok then
session.log("debug", "Session over rate limit (%d) with %d (by %d), pausing", throttle.max, #bytes, outstanding);
+ outstanding = ceil(outstanding);
session.conn:pause(); -- Read no more data from the connection until there is no outstanding data
local outstanding_data = bytes:sub(-outstanding);
bytes = bytes:sub(1, #bytes-outstanding);