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:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user