diff --git a/src/ReferenceContext.php b/src/ReferenceContext.php index 3d824a63..bde0a964 100644 --- a/src/ReferenceContext.php +++ b/src/ReferenceContext.php @@ -115,14 +115,16 @@ private function reduceDots($path) { $parts = explode('/', ltrim($path, '/')); $c = count($parts); + $parentOffset = 1; for ($i = 0; $i < $c; $i++) { if ($parts[$i] === '.') { unset($parts[$i]); continue; } - if ($i > 0 && $parts[$i] === '..' && $parts[$i-1] !== '..') { - unset($parts[$i-1]); + if ($i > 0 && $parts[$i] === '..' && $parts[$i - $parentOffset] !== '..') { + unset($parts[$i - $parentOffset]); unset($parts[$i]); + $parentOffset += 2; } } return '/'.implode('/', $parts); diff --git a/tests/ReferenceContextTest.php b/tests/ReferenceContextTest.php index 92d9d93e..b06eb5fc 100644 --- a/tests/ReferenceContextTest.php +++ b/tests/ReferenceContextTest.php @@ -183,6 +183,10 @@ public function normalizeUriProvider() '/var/www/api/../definitions.yaml#/components/Pet', 'file:///var/www/definitions.yaml#/components/Pet', ], + [ + '/var/www/api/foo/../../definitions.yaml#/components/Pet', + 'file:///var/www/definitions.yaml#/components/Pet', + ], ]; return $data;