halcc: Fix thread-unsafe function, getpwnam(), getgpnam() 11/310511/1
authorYoungjae Cho <y0.cho@samsung.com>
Tue, 30 Apr 2024 06:15:04 +0000 (15:15 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Tue, 30 Apr 2024 06:21:57 +0000 (15:21 +0900)
Change them to getpwnam_r(), getgrnam_r().

Change-Id: I3841bd9018ac30b7adb0701b4cb439009ea74dc3
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/hal-api-compatibility-checker.c

index ac154d3154c9cb681f47d248f1ae17640f2542f5..349601742f048726eff282b5f0dee9a17fd4bb50 100644 (file)
@@ -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);