From: "jeremyevans0 (Jeremy Evans) via ruby-core" <ruby-core@...>
Date: 2023-02-09T23:10:31+00:00
Subject: [ruby-core:112314] [Ruby master Feature#19347] Add Dir.fchdir

Issue #19347 has been updated by jeremyevans0 (Jeremy Evans).


matz (Yukihiro Matsumoto) wrote in #note-6:
> I agree with having `Dir.for_fd` and `Dir#chdir` as well. If the assumed use-case is handling a file descriptor sent via UNIX domain socket, allowing `chdir` only is not sufficient. We should allow other directory-related operations via `Dir` class.

I've updated https://github.com/ruby/ruby/pull/7135 to add `Dir.for_fd` and `Dir#chdir`.  I'm not sure if it is an issue, but `Dir.for_fd(fd).path` returns `nil`, because there is no path associated with such a directory.  Hopefully that is acceptable.  I think it is possible to generate a path by walking upwards in the directory tree to the root of the file system, scanning each directory visited to find the name pointing to the previous directory, and using that to build a path.  However, I'm not sure that is worth doing.

----------------------------------------
Feature #19347: Add Dir.fchdir
https://bugs.ruby-lang.org/issues/19347#change-101755

* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
* Priority: Normal
----------------------------------------
Recently, I was working on a program that passes file descriptors over UNIX sockets (using `send_io`/`recv_io`).  For file/socket/device descriptors, this works fine using `File#reopen`.  However, I found that while Ruby supports `Dir#fileno` to return a directory file descriptor, it cannot use that file descriptor when changing directories.

I worked around this in my program by writing the directory path over the UNIX socket, but this results in a TOCTOU vulnerability in certain cases.  Passing the directory file descriptor would be simpler and avoid the vulnerability.

I've submitted a pull request to implement this method: https://github.com/ruby/ruby/pull/7135



-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/