Skip to content

Commit

Permalink
bug #29260 [Lock] Fixed PdoStore::putOffExpiration(), PdoStore::getHa…
Browse files Browse the repository at this point in the history
…shedKey() (PavelPrischepa)

This PR was merged into the 4.2-dev branch.

Discussion
----------

[Lock] Fixed PdoStore::putOffExpiration(), PdoStore::getHashedKey()

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | It seems no
| Fixed tickets |
| License       | MIT
| Doc PR        |

1. Fixed PDO Statement exception in PdoStore::putOffExpiration():

```
 An exception occurred while executing 'UPDATE lock_keys SET key_expiration = UNIX_TIMESTAMP() + 10, key_token = :token WHERE key_id = :id AND (key_token = :token OR key_expiration <= UNIX_TIMESTAMP())' with params ["dcfc5ff369bc1896563
  325c2e90478154eb670f6b6ebad3617e946ecb1f81517", "FRJOnftxRwPIgIRVb4EpOIVFwNjTmx0fwkBSTVJdViI="]:

  SQLSTATE[HY093]: Invalid parameter number
```

2. Added explicit casting `Key` to `string` in getHashedKey() to avoid error with `strict_types` enabled.

Commits
-------

a639301 [Lock] Fixed PDOStatement exception "Invalid parameter number" in putOffExpiration()
  • Loading branch information
nicolas-grekas committed Nov 24, 2018
2 parents 4c1e8bd + a639301 commit f9414a8
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/Symfony/Component/Lock/Store/PdoStore.php
Expand Up @@ -164,11 +164,13 @@ public function putOffExpiration(Key $key, $ttl)

$key->reduceLifetime($ttl);

$sql = "UPDATE $this->table SET $this->expirationCol = {$this->getCurrentTimestampStatement()} + $ttl, $this->tokenCol = :token WHERE $this->idCol = :id AND ($this->tokenCol = :token OR $this->expirationCol <= {$this->getCurrentTimestampStatement()})";
$sql = "UPDATE $this->table SET $this->expirationCol = {$this->getCurrentTimestampStatement()} + $ttl, $this->tokenCol = :token1 WHERE $this->idCol = :id AND ($this->tokenCol = :token2 OR $this->expirationCol <= {$this->getCurrentTimestampStatement()})";
$stmt = $this->getConnection()->prepare($sql);

$uniqueToken = $this->getUniqueToken($key);
$stmt->bindValue(':id', $this->getHashedKey($key));
$stmt->bindValue(':token', $this->getUniqueToken($key));
$stmt->bindValue(':token1', $uniqueToken);
$stmt->bindValue(':token2', $uniqueToken);
$stmt->execute();

// If this method is called twice in the same second, the row wouldn't be updated. We have to call exists to know if we are the owner
Expand Down Expand Up @@ -214,7 +216,7 @@ public function exists(Key $key)
*/
private function getHashedKey(Key $key): string
{
return hash('sha256', $key);
return hash('sha256', (string) $key);
}

private function getUniqueToken(Key $key): string
Expand Down

0 comments on commit f9414a8

Please sign in to comment.