diff options
author | Robin Appelman <icewind@owncloud.com> | 2015-06-03 16:23:43 +0200 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2015-06-03 17:18:50 +0200 |
commit | 6b0874203d3dc77bf4ff274add5a7d7844e791b8 (patch) | |
tree | aa5fda0a3cffb904a419f6e010430d8282038830 /lib/private/files | |
parent | 8d860e564af1e8a5255e6c1ab1d075e2dc1e0e57 (diff) | |
download | nextcloud-server-6b0874203d3dc77bf4ff274add5a7d7844e791b8.tar.gz nextcloud-server-6b0874203d3dc77bf4ff274add5a7d7844e791b8.zip |
add proper locking to file_put_contents when using streams
Diffstat (limited to 'lib/private/files')
-rw-r--r-- | lib/private/files/view.php | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/private/files/view.php b/lib/private/files/view.php index b98842f5eb7..1b492213053 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -535,25 +535,37 @@ class View { ) { $path = $this->getRelativePath($absolutePath); + $this->lockFile($path, ILockingProvider::LOCK_SHARED); + $exists = $this->file_exists($path); $run = true; if ($this->shouldEmitHooks($path)) { $this->emit_file_hooks_pre($exists, $path, $run); } if (!$run) { + $this->unlockFile($path, ILockingProvider::LOCK_SHARED); return false; } - $target = $this->fopen($path, 'w'); + + $this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE); + + /** @var \OC\Files\Storage\Storage $storage */ + list($storage, $internalPath) = $this->resolvePath($path); + $target = $storage->fopen($internalPath, 'w'); if ($target) { - list ($count, $result) = \OC_Helper::streamCopy($data, $target); + list (, $result) = \OC_Helper::streamCopy($data, $target); fclose($target); fclose($data); $this->updater->update($path); + + $this->unlockFile($path, ILockingProvider::LOCK_EXCLUSIVE); + if ($this->shouldEmitHooks($path) && $result !== false) { $this->emit_file_hooks_post($exists, $path); } return $result; } else { + $this->unlockFile($path, ILockingProvider::LOCK_EXCLUSIVE); return false; } } else { |