Skip to content
  • Jeremy Evans's avatar
    11c311e3
    Use realpath(3) instead of custom realpath implementation if available · 11c311e3
    Jeremy Evans authored
    This approach is simpler than the previous approach which tries to
    emulate realpath(3).  It also performs much better on both Linux and
    OpenBSD on the included benchmarks.
    
    By using realpath(3), we can better integrate with system security
    features such as OpenBSD's unveil(2) system call.
    
    This does not use realpath(3) on Windows even if it exists, as the
    approach for checking for absolute paths does not work for drive
    letters.  This can be fixed without too much difficultly, though until
    Windows defines realpath(3), there is no need to do so.
    
    For File.realdirpath, where the last element of the path is not
    required to exist, fallback to the previous approach, as realpath(3)
    on most operating systems requires the whole path be valid (per POSIX),
    and the operating systems where this isn't true either plan to conform
    to POSIX or may change to conform to POSIX in the future.
    
    glibc realpath(3) does not handle /path/to/file.rb/../other_file.rb
    paths, returning ENOTDIR in that case.  Fallback to the previous code
    if realpath(3) returns ENOTDIR.
    
    glibc doesn't like realpath(3) usage for paths like /dev/fd/5,
    returning ENOENT even though the path may appear to exist in the
    filesystem.  If ENOENT is returned and the path exists, then fall
    back to the default approach.
    11c311e3
    Use realpath(3) instead of custom realpath implementation if available
    Jeremy Evans authored
    This approach is simpler than the previous approach which tries to
    emulate realpath(3).  It also performs much better on both Linux and
    OpenBSD on the included benchmarks.
    
    By using realpath(3), we can better integrate with system security
    features such as OpenBSD's unveil(2) system call.
    
    This does not use realpath(3) on Windows even if it exists, as the
    approach for checking for absolute paths does not work for drive
    letters.  This can be fixed without too much difficultly, though until
    Windows defines realpath(3), there is no need to do so.
    
    For File.realdirpath, where the last element of the path is not
    required to exist, fallback to the previous approach, as realpath(3)
    on most operating systems requires the whole path be valid (per POSIX),
    and the operating systems where this isn't true either plan to conform
    to POSIX or may change to conform to POSIX in the future.
    
    glibc realpath(3) does not handle /path/to/file.rb/../other_file.rb
    paths, returning ENOTDIR in that case.  Fallback to the previous code
    if realpath(3) returns ENOTDIR.
    
    glibc doesn't like realpath(3) usage for paths like /dev/fd/5,
    returning ENOENT even though the path may appear to exist in the
    filesystem.  If ENOENT is returned and the path exists, then fall
    back to the default approach.
Loading