libc isn't that strict, but it's a good idea if we are, to not create
confusion around invalid user ids.
if (!p)
return errno > 0 ? -errno : -ESRCH;
- if (uid)
+ if (uid) {
+ if (!uid_is_valid(p->pw_uid))
+ return -EBADMSG;
+
*uid = p->pw_uid;
+ }
+
+ if (gid) {
+ if (!gid_is_valid(p->pw_gid))
+ return -EBADMSG;
- if (gid)
*gid = p->pw_gid;
+ }
if (home)
*home = p->pw_dir;
if (!g)
return errno > 0 ? -errno : -ESRCH;
- if (gid)
+ if (gid) {
+ if (!gid_is_valid(g->gr_gid))
+ return -EBADMSG;
+
*gid = g->gr_gid;
+ }
return 0;
}
if (getegid() == gid)
return 1;
+ if (!gid_is_valid(gid))
+ return -EINVAL;
+
ngroups_max = sysconf(_SC_NGROUPS_MAX);
assert(ngroups_max > 0);