[Filesystem] fix lock file permissions
This commit is contained in:
parent
309de6dd61
commit
ceecb502f8
@ -49,9 +49,7 @@ class LockHandler
|
|||||||
throw new IOException(sprintf('The directory "%s" is not writable.', $lockPath), 0, null, $lockPath);
|
throw new IOException(sprintf('The directory "%s" is not writable.', $lockPath), 0, null, $lockPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
$name = sprintf('%s-%s', preg_replace('/[^a-z0-9\._-]+/i', '-', $name), hash('sha256', $name));
|
$this->file = sprintf('%s/sf.%s.%s.lock', $lockPath, preg_replace('/[^a-z0-9\._-]+/i', '-', $name), hash('sha256', $name));
|
||||||
|
|
||||||
$this->file = sprintf('%s/%s', $lockPath, $name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,14 +65,24 @@ class LockHandler
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set an error handler to not trigger the registered error handler if
|
// Silence both userland and native PHP error handlers
|
||||||
// the file can not be opened.
|
$errorLevel = error_reporting(0);
|
||||||
set_error_handler('var_dump', 0);
|
set_error_handler('var_dump', 0);
|
||||||
$this->handle = @fopen($this->file, 'c');
|
|
||||||
|
if (!$this->handle = fopen($this->file, 'r')) {
|
||||||
|
if ($this->handle = fopen($this->file, 'x')) {
|
||||||
|
chmod($this->file, 0444);
|
||||||
|
} elseif (!$this->handle = fopen($this->file, 'r')) {
|
||||||
|
usleep(100); // Give some time for chmod() to complete
|
||||||
|
$this->handle = fopen($this->file, 'r');
|
||||||
|
}
|
||||||
|
}
|
||||||
restore_error_handler();
|
restore_error_handler();
|
||||||
|
error_reporting($errorLevel);
|
||||||
|
|
||||||
if (!$this->handle) {
|
if (!$this->handle) {
|
||||||
throw new IOException(sprintf('Unable to fopen "%s".', $this->file), 0, null, $this->file);
|
$error = error_get_last();
|
||||||
|
throw new IOException($error['message'], 0, null, $this->file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// On Windows, even if PHP doc says the contrary, LOCK_NB works, see
|
// On Windows, even if PHP doc says the contrary, LOCK_NB works, see
|
||||||
|
@ -28,7 +28,7 @@ class LockHandlerTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$lock = new LockHandler('<?php echo "% hello word ! %" ?>');
|
$lock = new LockHandler('<?php echo "% hello word ! %" ?>');
|
||||||
|
|
||||||
$file = sprintf('%s/-php-echo-hello-word--4b3d9d0d27ddef3a78a64685dda3a963e478659a9e5240feaf7b4173a8f28d5f', sys_get_temp_dir());
|
$file = sprintf('%s/sf.-php-echo-hello-word-.4b3d9d0d27ddef3a78a64685dda3a963e478659a9e5240feaf7b4173a8f28d5f.lock', sys_get_temp_dir());
|
||||||
// ensure the file does not exist before the lock
|
// ensure the file does not exist before the lock
|
||||||
@unlink($file);
|
@unlink($file);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user