From b63926b24666798e8e20030b7c4f9b29ae7b7f09 Mon Sep 17 00:00:00 2001 From: Daniel Beyer Date: Sat, 20 Sep 2014 16:09:40 +0200 Subject: [PATCH] [Finder] Escape location for regex searches --- .../Finder/Adapter/AbstractFindAdapter.php | 4 +-- .../Component/Finder/Tests/FinderTest.php | 26 ++++++++++++++----- .../Fixtures/r+e.g?e*x[c]a(r)s/dir/bar.dat | 0 3 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 src/Symfony/Component/Finder/Tests/Fixtures/r+e.g?e*x[c]a(r)s/dir/bar.dat diff --git a/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php b/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php index 7f2a52fbcd..4d73b32c34 100644 --- a/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php +++ b/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php @@ -216,7 +216,7 @@ abstract class AbstractFindAdapter extends AbstractAdapter // Fixes 'not search' regex problems. if ($expr->isRegex()) { $regex = $expr->getRegex(); - $regex->prepend($regex->hasStartFlag() ? $dir.DIRECTORY_SEPARATOR : '.*')->setEndJoker(!$regex->hasEndFlag()); + $regex->prepend($regex->hasStartFlag() ? preg_quote($dir).DIRECTORY_SEPARATOR : '.*')->setEndJoker(!$regex->hasEndFlag()); } else { $expr->prepend('*')->append('*'); } @@ -247,7 +247,7 @@ abstract class AbstractFindAdapter extends AbstractAdapter $command->add('-size -'.($size->getTarget() + 1).'c'); break; case '>=': - $command->add('-size +'. ($size->getTarget() - 1).'c'); + $command->add('-size +'.($size->getTarget() - 1).'c'); break; case '>': $command->add('-size +'.$size->getTarget().'c'); diff --git a/src/Symfony/Component/Finder/Tests/FinderTest.php b/src/Symfony/Component/Finder/Tests/FinderTest.php index 598821d24f..924c67bd89 100644 --- a/src/Symfony/Component/Finder/Tests/FinderTest.php +++ b/src/Symfony/Component/Finder/Tests/FinderTest.php @@ -569,6 +569,20 @@ class FinderTest extends Iterator\RealIteratorTestCase } } + /** + * @dataProvider getAdaptersTestData + */ + public function testRegexSpecialCharsLocationWithPathRestrictionContainingStartFlag(Adapter\AdapterInterface $adapter) + { + $finder = $this->buildFinder($adapter); + $finder->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'r+e.g?e*x[c]a(r)s') + ->path('/^dir/'); + + $expected = array('r+e.g?e*x[c]a(r)s'.DIRECTORY_SEPARATOR.'dir', + 'r+e.g?e*x[c]a(r)s'.DIRECTORY_SEPARATOR.'dir'.DIRECTORY_SEPARATOR.'bar.dat',); + $this->assertIterator($this->toAbsoluteFixtures($expected), $finder); + } + public function testAdaptersOrdering() { $finder = Finder::create() @@ -673,7 +687,7 @@ class FinderTest extends Iterator\RealIteratorTestCase $tests = array( array('', '', array()), array('/^A\/B\/C/', '/C$/', - array('A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat') + array('A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat'), ), array('/^A\/B/', 'foobar', array( @@ -681,7 +695,7 @@ class FinderTest extends Iterator\RealIteratorTestCase 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C', 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat', 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat', - ) + ), ), array('A/B/C', 'foobar', array( @@ -689,7 +703,7 @@ class FinderTest extends Iterator\RealIteratorTestCase 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat', 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C', 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat.copy', - ) + ), ), array('A/B', 'foobar', array( @@ -703,12 +717,12 @@ class FinderTest extends Iterator\RealIteratorTestCase 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat', 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat.copy', 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat.copy', - ) + ), ), array('/^with space\//', 'foobar', array( 'with space'.DIRECTORY_SEPARATOR.'foo.txt', - ) + ), ), ); @@ -808,7 +822,7 @@ class FinderTest extends Iterator\RealIteratorTestCase array( new Adapter\BsdFindAdapter(), new Adapter\GnuFindAdapter(), - new Adapter\PhpAdapter() + new Adapter\PhpAdapter(), ), function (Adapter\AdapterInterface $adapter) { return $adapter->isSupported(); diff --git a/src/Symfony/Component/Finder/Tests/Fixtures/r+e.g?e*x[c]a(r)s/dir/bar.dat b/src/Symfony/Component/Finder/Tests/Fixtures/r+e.g?e*x[c]a(r)s/dir/bar.dat new file mode 100644 index 0000000000..e69de29bb2