]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Leak from bucket before checking the burst
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 9 Apr 2018 09:17:48 +0000 (10:17 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 9 Apr 2018 09:17:48 +0000 (10:17 +0100)
src/plugins/lua/ratelimit.lua

index 329bc9095e594507c608655c713351f155945233..2b6989e1a9c188f6d708898ebe528aa775ba0ac1 100644 (file)
@@ -74,11 +74,13 @@ local bucket_check_script = [[
     local rate = tonumber(KEYS[3])
     local dyn = tonumber(redis.call('HGET', KEYS[1], 'dr')) / 10000.0
     rate = rate * dyn
-    redis.call('HINCRBYFLOAT', KEYS[1], 'b', -((now - last) * rate))
+    local leaked = ((now - last) * rate)
+    burst = burst - leaked
+    redis.call('HINCRBYFLOAT', KEYS[1], 'b', -(leaked))
    end
    local dyn = tonumber(redis.call('HGET', KEYS[1], 'db')) / 10000.0
 
-   if tonumber(burst) * tonumber(dyn) > tonumber(KEYS[4]) then
+   if burst * dyn > tonumber(KEYS[4]) then
     return 1
    end
   else