8000 [Filesystem] fix cleaning up tmp files when dumpFile() fails · symfony/symfony@33fce73 · GitHub
[go: up one dir, main page]

Skip to content

Commit 33fce73

Browse files
[Filesystem] fix cleaning up tmp files when dumpFile() fails
1 parent cdfa9c2 commit 33fce73

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

src/Symfony/Component/Filesystem/Filesystem.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -686,13 +686,17 @@ public function dumpFile($filename, $content)
686686
// when the filesystem supports chmod.
687687
$tmpFile = $this->tempnam($dir, basename($filename));
688688

689-
if (false === @file_put_contents($tmpFile, $content)) {
690-
throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
691-
}
689+
try {
690+
if (false === @file_put_contents($tmpFile, $content)) {
691+
throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
692+
}
692693

693-
@chmod($tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask());
694+
@chmod($tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask());
694695

695-
$this->rename($tmpFile, $filename, true);
696+
$this->rename($tmpFile, $filename, true);
697+
} finally {
698+
@unlink($tmpFile);
699+
}
696700
}
697701

698702
/**

src/Symfony/Component/Filesystem/Tests/FilesystemTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1710,6 +1710,18 @@ public function testAppendToFileCreateTheFileIfNotExists()
17101710
$this->assertStringEqualsFile($filename, 'bar');
17111711
}
17121712

1713+
public function testDumpRemovesTmpFilesOnFailure()
1714+
{
1715+
$expected = scandir(__DIR__, \SCANDIR_SORT_ASCENDING);
1716+
1717+
try {
1718+
$this->filesystem->dumpFile(__DIR__.'/Fixtures', 'bar');
1719+
$this->fail('IOException expected.');
1720+
} catch (IOException $e) {
1721+
$this->assertSame($expected, scandir(__DIR__, \SCANDIR_SORT_ASCENDING));
1722+
}
1723+
}
1724+
17131725
public function testDumpKeepsExistingPermissionsWhenOverwritingAnExistingFile()
17141726
{
17151727
$this->markAsSkippedIfChmodIsMissing();

0 commit comments

Comments
 (0)
0