[HttpFoundation] Break infinite loop in PdoSessionHandler when MySQL is in loose mode
This commit is contained in:
parent
84bba75ad1
commit
0cf874e23e
@ -494,6 +494,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
|
|||||||
$selectSql = $this->getSelectSql();
|
$selectSql = $this->getSelectSql();
|
||||||
$selectStmt = $this->pdo->prepare($selectSql);
|
$selectStmt = $this->pdo->prepare($selectSql);
|
||||||
$selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
|
$selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
|
||||||
|
$insertStmt = null;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
$selectStmt->execute();
|
$selectStmt->execute();
|
||||||
@ -509,6 +510,11 @@ class PdoSessionHandler implements \SessionHandlerInterface
|
|||||||
return is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];
|
return is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (null !== $insertStmt) {
|
||||||
|
$this->rollback();
|
||||||
|
throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.');
|
||||||
|
}
|
||||||
|
|
||||||
if (self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {
|
if (self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {
|
||||||
// Exclusive-reading of non-existent rows does not block, so we need to do an insert to block
|
// Exclusive-reading of non-existent rows does not block, so we need to do an insert to block
|
||||||
// until other connections to the session are committed.
|
// until other connections to the session are committed.
|
||||||
|
Reference in New Issue
Block a user