Skip to content

Commit 974050f

Browse files
committed
bug symfony#27250 [Session] limiting :key for GET_LOCK to 64 chars (oleg-andreyev)
This PR was merged into the 2.7 branch. Discussion ---------- [Session] limiting :key for GET_LOCK to 64 chars | Q | A | ------------- | --- | Branch? | 2.7 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT > MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced. Cases: - `session_id` is set by developers manually - `session.sid_length` is configured Ref.: - https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock - http://php.net/manual/en/session.configuration.php#ini.session.sid-length Other issues: - go-sql-driver/mysql#385 - stefangabos/Zebra_Session#16 Commits ------- 9cda96b symfony#27250 limiting GET_LOCK key up to 64 char due to changes in MySQL 5.7.5 and later
2 parents d7d4e41 + 9cda96b commit 974050f

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,14 +552,16 @@ private function doAdvisoryLock($sessionId)
552552
{
553553
switch ($this->driver) {
554554
case 'mysql':
555+
// MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced.
556+
$lockId = \substr($sessionId, 0, 64);
555557
// should we handle the return value? 0 on timeout, null on error
556558
// we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout
557559
$stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)');
558-
$stmt->bindValue(':key', $sessionId, \PDO::PARAM_STR);
560+
$stmt->bindValue(':key', $lockId, \PDO::PARAM_STR);
559561
$stmt->execute();
560562

561563
$releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)');
562-
$releaseStmt->bindValue(':key', $sessionId, \PDO::PARAM_STR);
564+
$releaseStmt->bindValue(':key', $lockId, \PDO::PARAM_STR);
563565

564566
return $releaseStmt;
565567
case 'pgsql':

0 commit comments

Comments
 (0)