From 755d41ca4ea3b31137ba00d27833699faefd153f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 2 Jun 2025 12:23:06 +0300 Subject: [PATCH] LibC: Add pw_passwd and pw_gecos to passwd structure This information is available in /etc/passwd either way so why not expose it to the user. Practically all UNIX-likes have these either way --- userspace/libraries/LibC/include/pwd.h | 12 +++++++----- userspace/libraries/LibC/pwd.cpp | 15 +++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/userspace/libraries/LibC/include/pwd.h b/userspace/libraries/LibC/include/pwd.h index 20e9105898..b2e54a0675 100644 --- a/userspace/libraries/LibC/include/pwd.h +++ b/userspace/libraries/LibC/include/pwd.h @@ -14,11 +14,13 @@ __BEGIN_DECLS struct passwd { - char* pw_name; /* User's login name. */ - uid_t pw_uid; /* Numerical user ID. */ - gid_t pw_gid; /* Numerical group ID. */ - char* pw_dir; /* Initial working directory. */ - char* pw_shell; /* Program to use as shell. */ + char* pw_name; /* User's login name. */ + char* pw_passwd; /* User's hashed password. */ + uid_t pw_uid; /* Numerical user ID. */ + gid_t pw_gid; /* Numerical group ID. */ + char* pw_gecos; /* User's information. */ + char* pw_dir; /* Initial working directory. */ + char* pw_shell; /* Program to use as shell. */ }; void endpwent(void); diff --git a/userspace/libraries/LibC/pwd.cpp b/userspace/libraries/LibC/pwd.cpp index dfb9eee000..3e363b934d 100644 --- a/userspace/libraries/LibC/pwd.cpp +++ b/userspace/libraries/LibC/pwd.cpp @@ -71,12 +71,14 @@ struct passwd* getpwent(void) switch (i) { case 0: - s_pwent_struct.pw_name = (char*)malloc(field_len + 1); + s_pwent_struct.pw_name = strndup(ptr, field_len + 1); if (!s_pwent_struct.pw_name) return nullptr; - strcpy(s_pwent_struct.pw_name, ptr); break; case 1: + s_pwent_struct.pw_passwd = strndup(ptr, field_len + 1); + if (!s_pwent_struct.pw_passwd) + return nullptr; break; case 2: ASSERT(1 <= field_len && field_len <= 9); @@ -91,18 +93,19 @@ struct passwd* getpwent(void) s_pwent_struct.pw_gid = atoi(ptr); break; case 4: + s_pwent_struct.pw_gecos = strndup(ptr, field_len + 1); + if (!s_pwent_struct.pw_gecos) + return nullptr; break; case 5: - s_pwent_struct.pw_dir = (char*)malloc(field_len + 1); + s_pwent_struct.pw_dir = strndup(ptr, field_len + 1); if (!s_pwent_struct.pw_dir) return nullptr; - strcpy(s_pwent_struct.pw_dir, ptr); break; case 6: - s_pwent_struct.pw_shell = (char*)malloc(field_len + 1); + s_pwent_struct.pw_shell = strndup(ptr, field_len + 1); if (!s_pwent_struct.pw_shell) return nullptr; - strcpy(s_pwent_struct.pw_shell, ptr); break; }