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
commit14304764d845ced9c9d500f2c805f1d80227e07b (patch)
tree7a93b438cbe3a27175d39542d59d50add8f9a47b /plugins/mod_limits.lua
parent86ee041be81ad313a24c87b6e38f92fe4400cf17 (diff)
downloadprosody-14304764d845ced9c9d500f2c805f1d80227e07b.tar.gz
prosody-14304764d845ced9c9d500f2c805f1d80227e07b.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);