From: Youngjae Cho Date: Tue, 30 Apr 2024 06:15:04 +0000 (+0900) Subject: halcc: Fix thread-unsafe function, getpwnam(), getgpnam() X-Git-Tag: accepted/tizen/unified/20240611.122614~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5f9ad8fb747446d7039ee34715fb8aa2cc7ab95b;p=platform%2Fhal%2Fapi%2Fcommon.git halcc: Fix thread-unsafe function, getpwnam(), getgpnam() Change them to getpwnam_r(), getgrnam_r(). Change-Id: I3841bd9018ac30b7adb0701b4cb439009ea74dc3 Signed-off-by: Youngjae Cho --- diff --git a/src/hal-api-compatibility-checker.c b/src/hal-api-compatibility-checker.c index ac154d3..3496017 100644 --- a/src/hal-api-compatibility-checker.c +++ b/src/hal-api-compatibility-checker.c @@ -222,19 +222,81 @@ static int set_owner(int fd) 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);