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 коммит произвёл Nobuyoshi Nakada
Родитель 8999fd1ac8
Коммит ae886e0c83
1 изменённых файлов: 2 добавлений и 1 удалений

3
file.c
Просмотреть файл

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