Check getlogin return value before passing to strcasecmp

getlogin can return NULL, and this can avoid a segfault
in that case.

Mentioned as an issue in comment to bug 20586.
This commit is contained in:
Jeremy Evans 2024-08-21 14:32:42 -07:00 committed by Nobuyoshi Nakada
parent 8999fd1ac8
commit ae886e0c83
Notes: git 2024-08-22 02:21:06 +00:00

3
file.c
View File

@ -3706,6 +3706,7 @@ rb_home_dir_of(VALUE user, VALUE result)
#else #else
extern char *getlogin(void); extern char *getlogin(void);
const char *pwPtr = 0; const char *pwPtr = 0;
const char *login;
# define endpwent() ((void)0) # define endpwent() ((void)0)
#endif #endif
const char *dir, *username = RSTRING_PTR(user); const char *dir, *username = RSTRING_PTR(user);
@ -3722,7 +3723,7 @@ rb_home_dir_of(VALUE user, VALUE result)
#ifdef HAVE_PWD_H #ifdef HAVE_PWD_H
pwPtr = (struct passwd *)IO_WITHOUT_GVL(nogvl_getpwnam, (void *)username); pwPtr = (struct passwd *)IO_WITHOUT_GVL(nogvl_getpwnam, (void *)username);
#else #else
if (strcasecmp(username, getlogin()) == 0) if ((login = getlogin()) && strcasecmp(username, login) == 0)
dir = pwPtr = getenv("HOME"); dir = pwPtr = getenv("HOME");
#endif #endif
if (!pwPtr) { if (!pwPtr) {