From fb103180365f8bbac499ca452f5f86ae5a59aa79 Mon Sep 17 00:00:00 2001 From: Button99 Date: Fri, 21 Nov 2025 10:22:29 +0200 Subject: [PATCH 1/2] RateLimiter remaining to 0 to prevent negative values --- src/Illuminate/Cache/RateLimiter.php | 2 +- tests/Cache/CacheRateLimiterTest.php | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Cache/RateLimiter.php b/src/Illuminate/Cache/RateLimiter.php index f28c57a4d240..77d71a5afc3a 100644 --- a/src/Illuminate/Cache/RateLimiter.php +++ b/src/Illuminate/Cache/RateLimiter.php @@ -232,7 +232,7 @@ public function remaining($key, $maxAttempts) $attempts = $this->attempts($key); - return $maxAttempts - $attempts; + return max(0, $maxAttempts - $attempts); } /** diff --git a/tests/Cache/CacheRateLimiterTest.php b/tests/Cache/CacheRateLimiterTest.php index a4e7d5e2a099..73241e55ed56 100644 --- a/tests/Cache/CacheRateLimiterTest.php +++ b/tests/Cache/CacheRateLimiterTest.php @@ -4,6 +4,7 @@ use Illuminate\Cache\ArrayStore; use Illuminate\Cache\RateLimiter; +use Illuminate\Cache\Repository; use Illuminate\Contracts\Cache\Repository as Cache; use Mockery as m; use PHPUnit\Framework\TestCase; @@ -76,6 +77,18 @@ public function testHitHasNoMemoryLeak() $rateLimiter->hit('key', 1); } + public function testRemainingIsNotNegative(): void + { + $cache = m::mock(Cache::class); + $cache->shouldReceive('get')->with('key', 0)->andReturn(5); + $cache->shouldReceive('getStore')->andReturn(new ArrayStore); + + $rateLimiter = new RateLimiter($cache); + + $this->assertSame(0, $rateLimiter->remaining('key', 3)); + $this->assertSame(0, $rateLimiter->retriesLeft('key', 3)); + } + public function testRetriesLeftReturnsCorrectCount() { $cache = m::mock(Cache::class); From 408341bf2a77b92dbec8a9cd4a0590d7246fa486 Mon Sep 17 00:00:00 2001 From: Button99 Date: Fri, 21 Nov 2025 10:44:35 +0200 Subject: [PATCH 2/2] Remove unused Repository import from CacheRateLimiterTest --- tests/Cache/CacheRateLimiterTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Cache/CacheRateLimiterTest.php b/tests/Cache/CacheRateLimiterTest.php index 73241e55ed56..dc85daf3ea0b 100644 --- a/tests/Cache/CacheRateLimiterTest.php +++ b/tests/Cache/CacheRateLimiterTest.php @@ -4,7 +4,6 @@ use Illuminate\Cache\ArrayStore; use Illuminate\Cache\RateLimiter; -use Illuminate\Cache\Repository; use Illuminate\Contracts\Cache\Repository as Cache; use Mockery as m; use PHPUnit\Framework\TestCase;