1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-04-02 23:12:46 +02:00

Merge pull request #4741 from flash1452/ticket/11515

[ticket/11515] Extra check after acquiring locks.
This commit is contained in:
Marc Alexander 2017-06-11 16:40:48 +02:00
commit 70e30a0591
No known key found for this signature in database
GPG Key ID: 50E0D2423696F995
3 changed files with 30 additions and 1 deletions

View File

@ -147,6 +147,25 @@ class config implements \ArrayAccess, \IteratorAggregate, \Countable
return false;
}
/**
* Checks configuration option's value only if the new_value matches the
* current configuration value and the configuration value does exist.Called
* only after set_atomic has been called.
*
* @param string $key The configuration option's name
* @param string $new_value New configuration value
* @throws \phpbb\exception\http_exception when config value is set and not equal to new_value.
* @return bool True if the value was changed, false otherwise.
*/
public function ensure_lock($key, $new_value)
{
if (isset($this->config[$key]) && $this->config[$key] == $new_value)
{
return true;
}
throw new \phpbb\exception\http_exception(500, 'Failure while aqcuiring locks.');
}
/**
* Increments an integer configuration value.
*

View File

@ -110,6 +110,13 @@ class db
// process we failed to acquire the lock.
$this->locked = $this->config->set_atomic($this->config_name, $lock_value, $this->unique_id, false);
if ($this->locked == true)
{
if ($this->config->ensure_lock($this->config_name, $this->unique_id))
{
return true;
}
}
return $this->locked;
}

View File

@ -101,7 +101,10 @@ class flock
if ($this->lock_fp)
{
@flock($this->lock_fp, LOCK_EX);
if (!@flock($this->lock_fp, LOCK_EX))
{
throw new \phpbb\exception\http_exception(500, 'Failure while aqcuiring locks.');
}
}
return (bool) $this->lock_fp;