return -EINVAL;
if (uid_system_fw == -1) {
- struct passwd *p = getpwnam("system_fw");
- if (!p)
- return -errno;
+ struct passwd pwd;
+ struct passwd *result;
+ char *buf = NULL;
+ size_t bufsize = 1024;
+ int ret;
+
+ buf = malloc(bufsize);
+ if (!buf)
+ return -ENOMEM;
+
+ errno = 0;
+
+ while ((ret = getpwnam_r("system_fw", &pwd, buf, bufsize, &result)) == ERANGE) {
+ char *tmp;
+
+ bufsize *= 2;
+ tmp = realloc(buf, bufsize);
+ if (!tmp) {
+ free(buf);
+ return -ENOMEM;
+ }
+
+ buf = tmp;
+ }
+
+ if (!result) {
+ free(buf);
+ if (ret == 0)
+ return -ENOENT;
+ else
+ return -errno;
+ }
+
+ uid_system_fw = pwd.pw_uid;
- uid_system_fw = p->pw_uid;
+ free(buf);
}
if (gid_system_fw == -1) {
- struct group *g = getgrnam("system_fw");
- if (!g)
- return -errno;
+ struct group grp;
+ struct group *result;
+ char *buf = NULL;
+ size_t bufsize = 1024;
+ int ret;
+
+ buf = malloc(bufsize);
+ if (!buf)
+ return -ENOMEM;
+
+ errno = 0;
+
+ while ((ret = getgrnam_r("system_fw", &grp, buf, bufsize, &result)) == ERANGE) {
+ char *tmp;
+
+ bufsize *= 2;
+ tmp = realloc(buf, bufsize);
+ if (!tmp) {
+ free(buf);
+ return -ENOMEM;
+ }
+
+ buf = tmp;
+ }
+
+ if (!result) {
+ free(buf);
+ if (ret == 0)
+ return -ENOENT;
+ else
+ return -errno;
+ }
+
+ gid_system_fw = grp.gr_gid;
- gid_system_fw = g->gr_gid;
+ free(buf);
}
return fchown(fd, uid_system_fw, gid_system_fw);