Skip to content

Commit 0921fda

Browse files
committed
Merge branch '3.4' into 4.4
* 3.4: [Filesystem] Check if failed unlink was caused by permission denied
2 parents dda52eb + a590972 commit 0921fda

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

Filesystem.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ public function remove($files)
180180
if (!self::box('rmdir', $file) && file_exists($file)) {
181181
throw new IOException(sprintf('Failed to remove directory "%s": ', $file).self::$lastError);
182182
}
183-
} elseif (!self::box('unlink', $file) && file_exists($file)) {
183+
} elseif (!self::box('unlink', $file) && (false !== strpos(self::$lastError, 'Permission denied') || file_exists($file))) {
184184
throw new IOException(sprintf('Failed to remove file "%s": ', $file).self::$lastError);
185185
}
186186
}

Tests/FilesystemTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Filesystem\Tests;
1313

14+
use Symfony\Component\Filesystem\Exception\IOException;
15+
1416
/**
1517
* Test class for Filesystem.
1618
*/
@@ -334,6 +336,28 @@ public function testRemoveIgnoresNonExistingFiles()
334336
$this->assertFileDoesNotExist($basePath.'dir');
335337
}
336338

339+
public function testRemoveThrowsExceptionOnPermissionDenied()
340+
{
341+
$this->markAsSkippedIfChmodIsMissing();
342+
343+
$basePath = $this->workspace.\DIRECTORY_SEPARATOR.'dir_permissions';
344+
mkdir($basePath);
345+
$file = $basePath.\DIRECTORY_SEPARATOR.'file';
346+
touch($file);
347+
chmod($basePath, 0400);
348+
349+
try {
350+
$this->filesystem->remove($file);
351+
$this->fail('Filesystem::remove() should throw an exception');
352+
} catch (IOException $e) {
353+
$this->assertStringContainsString('Failed to remove file "'.$file.'"', $e->getMessage());
354+
$this->assertStringContainsString('Permission denied', $e->getMessage());
355+
} finally {
356+
// Make sure we can clean up this file
357+
chmod($basePath, 0777);
358+
}
359+
}
360+
337361
public function testRemoveCleansInvalidLinks()
338362
{
339363
$this->markAsSkippedIfSymlinkIsMissing();

0 commit comments

Comments
 (0)