aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
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
commit89e3528e802593b5719be0dd7aafdb85eba5e00f (patch)
tree7a93b438cbe3a27175d39542d59d50add8f9a47b /plugins
parent5ea45343f9adad70bcc1efc059beec2eae77b96b (diff)
downloadprosody-89e3528e802593b5719be0dd7aafdb85eba5e00f.tar.gz
prosody-89e3528e802593b5719be0dd7aafdb85eba5e00f.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')
-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);