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:
parent
8999fd1ac8
commit
ae886e0c83
Notes:
git
2024-08-22 02:21:06 +00:00
3
file.c
3
file.c
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user