lposix: Use reentrant passwd and group lookup functions

The implementation of chown() in the posix module handles user and group
names as well as numeric IDs.  When resolving names, be sure to use
reentrant lookup functions rather than assuming it's safe to clobber the
internal buffers used by getpwnam() and getgrnam().

Fix some style nits while here.

Reviewed by:	imp, bapt
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D46555
This commit is contained in:
Mark Johnston
2025-07-04 19:06:10 +00:00
parent 3b1c4cb1bf
commit 88d94ead7f
+19 -10
View File
@@ -88,18 +88,23 @@ static int
lua_chown(lua_State *L)
{
const char *path;
uid_t owner = (uid_t) -1;
gid_t group = (gid_t) -1;
uid_t owner = (uid_t)-1;
gid_t group = (gid_t)-1;
int error;
enforce_max_args(L, 3);
path = luaL_checkstring(L, 1);
if (lua_isinteger(L, 2))
owner = (uid_t) lua_tointeger(L, 2);
owner = (uid_t)lua_tointeger(L, 2);
else if (lua_isstring(L, 2)) {
struct passwd *p = getpwnam(lua_tostring(L, 2));
if (p != NULL)
owner = p->pw_uid;
char buf[4096];
struct passwd passwd, *pwd;
error = getpwnam_r(lua_tostring(L, 2), &passwd,
buf, sizeof(buf), &pwd);
if (error == 0)
owner = pwd->pw_uid;
else
return (luaL_argerror(L, 2,
lua_pushfstring(L, "unknown user %s",
@@ -112,11 +117,15 @@ lua_chown(lua_State *L)
}
if (lua_isinteger(L, 3))
group = (gid_t) lua_tointeger(L, 3);
group = (gid_t)lua_tointeger(L, 3);
else if (lua_isstring(L, 3)) {
struct group *g = getgrnam(lua_tostring(L, 3));
if (g != NULL)
group = g->gr_gid;
char buf[4096];
struct group gr, *grp;
error = getgrnam_r(lua_tostring(L, 3), &gr, buf, sizeof(buf),
&grp);
if (error == 0)
group = grp->gr_gid;
else
return (luaL_argerror(L, 3,
lua_pushfstring(L, "unknown group %s",