[前][次][番号順一覧][スレッド一覧]

ruby-changes:69891

From: Alan <ko1@a...>
Date: Wed, 24 Nov 2021 16:56:44 +0900 (JST)
Subject: [ruby-changes:69891] 5bd0c0a014 (ruby_2_7): merge revision(s) c15cddd1d515c5bd8dfe8fb2725e3f723aec63b8: [Backport #16787]

https://git.ruby-lang.org/ruby.git/commit/?id=5bd0c0a014

From 5bd0c0a014d3cb1e07b355208dbfd2352f8dc08c Mon Sep 17 00:00:00 2001
From: "Alan D. Salewski" <salewski@a...>
Date: Sat, 4 Jul 2020 15:40:10 -0400
Subject: merge revision(s) c15cddd1d515c5bd8dfe8fb2725e3f723aec63b8: [Backport
 #16787]

        Allow Dir.home to work for non-login procs when $HOME not set

        Allow the 'Dir.home' method to reliably locate the user's home directory when
        all three of the following are true at the same time:

            1. Ruby is running on a Unix-like OS
            2. The $HOME environment variable is not set
            3. The process is not a descendant of login(1) (or a work-alike)

        The prior behavior was that the lookup could only work for login-descended
        processes.

        This is accomplished by looking up the user's record in the password database
        by uid (getpwuid_r(3)) as a fallback to the lookup by name (getpwname_r(3))
        which is still attempted first (based on the name, if any, returned by
        getlogin_r(3)).

        If getlogin_r(3), getpwnam_r(3), and/or getpwuid_r(3) is not available at
        compile time, will fallback on using their respective non-*_r() variants:
        getlogin(3), getpwnam(3), and/or getpwuid(3).

        The rationale for attempting to do the lookup by name prior to doing it by uid
        is to accommodate the possibility of multiple login names (each with its own
        record in the password database, so each with a potentially different home
        directory) being mapped to the same uid (as is explicitly allowed for by
        POSIX; see getlogin(3posix)).

        Preserves the existing behavior for login-descended processes, and adds the
        new capability of having Dir.home being able to find the user's home directory
        for non-login-descended processes.

        Fixes [Bug #16787]

        Related discussion:
            https://bugs.ruby-lang.org/issues/16787
            https://github.com/ruby/ruby/pull/3034
---
 internal.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/internal.h b/internal.h
index 47428da27f0..b6cc07d5b90 100644
--- a/internal.h
+++ b/internal.h
@@ -2086,6 +2086,12 @@ ARGVSTR2ARGC(VALUE argv_str) https://github.com/ruby/ruby/blob/trunk/internal.h#L2086
     return i - 1;
 }
 
+#ifdef HAVE_PWD_H
+VALUE rb_getlogin(void);
+VALUE rb_getpwdirnam_for_login(VALUE login);  /* read as: "get pwd db home dir by username for login" */
+VALUE rb_getpwdiruid(void);                   /* read as: "get pwd db home dir for getuid()" */
+#endif
+
 rb_pid_t rb_fork_ruby(int *status);
 void rb_last_status_clear(void);
 
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]