Skip to content

Commit 4c4313c

Browse files
vlakofftaylorotwell
authored andcommitted
Fix possible key overlap in cache of Str::snake (#13943)
1 parent bb59455 commit 4c4313c

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

src/Illuminate/Support/Str.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,10 @@ public static function slug($title, $separator = '-')
365365
*/
366366
public static function snake($value, $delimiter = '_')
367367
{
368-
$key = $value.$delimiter;
368+
$key = $value;
369369

370-
if (isset(static::$snakeCache[$key])) {
371-
return static::$snakeCache[$key];
370+
if (isset(static::$snakeCache[$key][$delimiter])) {
371+
return static::$snakeCache[$key][$delimiter];
372372
}
373373

374374
if (! ctype_lower($value)) {
@@ -377,7 +377,7 @@ public static function snake($value, $delimiter = '_')
377377
$value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value));
378378
}
379379

380-
return static::$snakeCache[$key] = $value;
380+
return static::$snakeCache[$key][$delimiter] = $value;
381381
}
382382

383383
/**

tests/Support/SupportStrTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ public function testSnake()
147147
$this->assertEquals('laravel php framework', Str::snake('LaravelPhpFramework', ' '));
148148
$this->assertEquals('laravel_php_framework', Str::snake('Laravel Php Framework'));
149149
$this->assertEquals('laravel_php_framework', Str::snake('Laravel Php Framework '));
150+
// ensure cache keys don't overlap
151+
$this->assertEquals('laravel__php__framework', Str::snake('LaravelPhpFramework', '__'));
152+
$this->assertEquals('laravel_php_framework_', Str::snake('LaravelPhpFramework_', '_'));
150153
}
151154

152155
public function testStudly()

0 commit comments

Comments
 (0)