src/Utility/Path.php
protected static function examine($part, array &$array, $path_relative, $allow_escape = false)
  {
    if($part === '.')
    {
      return;
    }

    if($part !== '..')
    {
      $array[] = $part;
      return;
    }

    // $part == '..', handle escaping.
    $last = end($array);
    if($last === '..')
    { // Escaping is allowed and we're already on the run.
      $array[] = $part;
      return;
    }

    if($last !== false)
    { // $last element exists - move up the stack.
      array_pop($array);
      return;
    }

    if(!$path_relative)
    { // Path is not relative - skip updir.
      return;
    }

    if(!$allow_escape)
      throw new \UnexpectedValueException('Attempt to traverse outside the root directory.');

    $array[] = $part;
  }
protected static function examine($part, array &$array, $path_relative, $allow_escape = false)
  {
    if($part === '.')
    {
      return;
    }

    if($part !== '..')
    {
      $array[] = $part;
      return;
    }

    // $part == '..', handle escaping.
    $last = end($array);
    if($last === '..')
    { // Escaping is allowed and we're already on the run.
      $array[] = $part;
      return;
    }

    if($last !== false)
    { // $last element exists - move up the stack.
      array_pop($array);
      return;
    }

    if(!$path_relative)
    { // Path is not relative - skip updir.
      return;
    }

    if(!$allow_escape)
      throw new \UnexpectedValueException('Attempt to traverse outside the root directory.');

    $array[] = $part;
  }
Path normalizer part examinator.
@internal
@throws \UnexpectedValueException if relative path is trying to escape above current directory, unless explicitly allowed.