diff --git a/libc/bionic/stubs.cpp b/libc/bionic/stubs.cpp index 2c2b74b7d..41ecd0990 100644 --- a/libc/bionic/stubs.cpp +++ b/libc/bionic/stubs.cpp @@ -89,9 +89,11 @@ static int do_getpw_r(int by_name, const char* name, uid_t uid, // Copy the strings. snprintf(buf, byte_count, "%s%c%s%c%s", src->pw_name, 0, src->pw_dir, 0, src->pw_shell); - // pw_passwd is non-POSIX and unused (always NULL) in bionic. - // pw_gecos is non-POSIX and missing in bionic. + // pw_passwd and pw_gecos are non-POSIX and unused (always NULL) in bionic. dst->pw_passwd = NULL; +#ifdef __LP64__ + dst->pw_gecos = NULL; +#endif // Copy the integral fields. dst->pw_gid = src->pw_gid; diff --git a/libc/include/pwd.h b/libc/include/pwd.h index 6f3fad594..6d483c03f 100644 --- a/libc/include/pwd.h +++ b/libc/include/pwd.h @@ -100,12 +100,15 @@ struct passwd { - char* pw_name; - char* pw_passwd; - uid_t pw_uid; - gid_t pw_gid; - char* pw_dir; - char* pw_shell; + char* pw_name; + char* pw_passwd; + uid_t pw_uid; + gid_t pw_gid; +#ifdef __LP64__ + char* pw_gecos; +#endif + char* pw_dir; + char* pw_shell; }; __BEGIN_DECLS diff --git a/tests/stubs_test.cpp b/tests/stubs_test.cpp index 7d70aa61f..9b0c2317d 100644 --- a/tests/stubs_test.cpp +++ b/tests/stubs_test.cpp @@ -41,6 +41,10 @@ static void check_getpwnam(const char* username, uid_t uid, uid_type_t uid_type) EXPECT_STREQ(username, pwd->pw_name); EXPECT_EQ(uid, pwd->pw_uid); EXPECT_EQ(uid, pwd->pw_gid); + ASSERT_EQ(NULL, pwd->pw_passwd); +#ifdef __LP64__ + ASSERT_EQ(NULL, pwd->pw_gecos); +#endif if (uid_type == TYPE_SYSTEM) { EXPECT_STREQ("/", pwd->pw_dir);