1. fix memory leak from previos change 43/95643/2
authorYong Yeon Kim <yy9875.kim@samsung.com>
Fri, 4 Nov 2016 06:07:40 +0000 (15:07 +0900)
committerYong Yeon Kim <yy9875.kim@samsung.com>
Fri, 4 Nov 2016 06:11:18 +0000 (15:11 +0900)
2. change thread unsafe fuctions
    getgrnam -> getgrnam_r
    getpwuid -> getpwuid_r

Change-Id: Ib7345aae7bf4b5ddea32dc35cd7f0c6914152327

lib/media-util-register.c
src/common/media-common-utils.c

index c36b625..c0577e3 100755 (executable)
@@ -77,33 +77,73 @@ bool media_util_is_support_senior_mode()
 
 static char* __media_get_path(uid_t uid)
 {
+       int ret = -1;
+       char *grpbuf = NULL;
        char *result_passwd = NULL;
-       struct group *grpinfo = NULL;
+       struct group grpinfo;
+       struct group *grpresult = NULL;
+       size_t grpbufsize;
+
+       grpbufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
+       if (grpbufsize == -1)           /* Value was indeterminate */
+               grpbufsize = 16384;             /* Should be more than enough (16*1024) */
+
+       grpbuf = malloc(grpbufsize);
+       if (grpbuf == NULL) {
+               MSAPI_DBG_ERR("malloc grpbuf grpbufsize[%d] failed", grpbufsize);
+               goto END;
+       }
 
-       grpinfo = getgrnam("users");
-       if (grpinfo == NULL) {
-               MSAPI_DBG_ERR("getgrnam(users) returns NULL !");
-               return NULL;
+       ret = getgrnam_r("users", &grpinfo, grpbuf, grpbufsize, &grpresult);
+       if((ret == 0) && (grpresult != NULL)) {
+               MSAPI_DBG("getgrnam_r users success...\n");
+       } else {
+               MSAPI_DBG_ERR("getgrnam_r users failed ret[%d]", ret);
+               goto END;
        }
 
        if (uid == getuid()) {
                if (MS_STRING_VALID(MEDIA_ROOT_PATH_INTERNAL))
                        result_passwd = strndup(MEDIA_ROOT_PATH_INTERNAL, strlen(MEDIA_ROOT_PATH_INTERNAL));
        } else {
-               struct passwd *userinfo = getpwuid(uid);
-               if (userinfo == NULL) {
-                       MSAPI_DBG_ERR("getpwuid(%d) returns NULL !", uid);
-                       return NULL;
+               struct passwd pwdinfo;
+               struct passwd *pwdresult = NULL;
+               char *pwdbuf;
+               size_t pwdbufsize;
+
+               pwdbufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+               if (pwdbufsize == -1)           /* Value was indeterminate */
+                       pwdbufsize = 16384;             /* Should be more than enough (16*1024) */
+
+               pwdbuf = malloc(pwdbufsize);
+               if (pwdbuf == NULL) {
+                       MSAPI_DBG_ERR("malloc pwdbuf pwdbufsize[%d] failed", pwdbufsize);
+                       goto END;
+               }
+
+               ret = getpwuid_r(uid, &pwdinfo, pwdbuf, pwdbufsize, &pwdresult);
+               if((ret == 0) && (pwdresult != NULL)) {
+                       MSAPI_DBG("getpwuid uid[%d] success\n", uid);
+               } else {
+                       MSAPI_DBG_ERR("getpwuid uid[%d] failed ret[%d]", uid, ret);
+                       MS_SAFE_FREE(pwdbuf);
+                       goto END;
                }
 
                // Compare git_t type and not group name
-               if (grpinfo->gr_gid != userinfo->pw_gid) {
+               if (grpinfo.gr_gid != pwdinfo.pw_gid) {
                        MSAPI_DBG_ERR("UID [%d] does not belong to 'users' group!", uid);
-                       return NULL;
+                       MS_SAFE_FREE(pwdbuf);
+                       goto END;
                }
-               result_passwd = strndup(userinfo->pw_dir, strlen(userinfo->pw_dir));
+               result_passwd = strndup(pwdinfo.pw_dir, strlen(pwdinfo.pw_dir));
+
+               MS_SAFE_FREE(pwdbuf);
        }
 
+END:
+       MS_SAFE_FREE(grpbuf);
+
        return result_passwd;
 }
 
@@ -111,7 +151,7 @@ static bool _is_valid_path(const char *path, uid_t uid)
 {
        bool ret = false;
        int length_path;
-       char * user_path = NULL;
+       char *user_path = NULL;
 
        if (path == NULL)
                return false;
@@ -136,7 +176,7 @@ static bool _is_valid_path(const char *path, uid_t uid)
                ret = true;
        } else if (MS_STRING_VALID(MEDIA_ROOT_PATH_USB) && (strncmp(path, MEDIA_ROOT_PATH_USB, strlen(MEDIA_ROOT_PATH_USB)) == 0)) {
                ret = true;
-       } 
+       }
 #ifdef _USE_SENIOR_MODE
        else if (strncmp(path, MEDIA_ROOT_PATH_SENIOR_MODE, strlen(MEDIA_ROOT_PATH_SENIOR_MODE)) == 0) {
                return true;
index acb5b85..fba682f 100755 (executable)
@@ -93,36 +93,77 @@ bool ms_is_mmc_inserted(void)
 
 static char* __media_get_path(uid_t uid)
 {
+       int ret = -1;
+       char *grpbuf = NULL;
        char *result_passwd = NULL;
-       struct group *grpinfo = NULL;
+       struct group grpinfo;
+       struct group *grpresult = NULL;
+       size_t grpbufsize;
 
-       grpinfo = getgrnam("users");
-       if (grpinfo == NULL) {
-               MS_DBG_ERR("getgrnam(users) returns NULL !");
-               return NULL;
+       grpbufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
+       if (grpbufsize == -1)           /* Value was indeterminate */
+               grpbufsize = 16384;             /* Should be more than enough (16*1024) */
+
+       grpbuf = malloc(grpbufsize);
+       if (grpbuf == NULL) {
+               MS_DBG_ERR("malloc grpbuf grpbufsize[%d] failed", grpbufsize);
+               goto END;
+       }
+
+       ret = getgrnam_r("users", &grpinfo, grpbuf, grpbufsize, &grpresult);
+       if((ret == 0) && (grpresult != NULL)) {
+               MS_DBG("getgrnam_r users success...\n");
+       } else {
+               MS_DBG_ERR("getgrnam_r users failed ret[%d]", ret);
+               goto END;
        }
 
        if (uid == getuid()) {
                if (MS_STRING_VALID(MEDIA_ROOT_PATH_INTERNAL))
                        result_passwd = strndup(MEDIA_ROOT_PATH_INTERNAL, strlen(MEDIA_ROOT_PATH_INTERNAL));
        } else {
-               struct passwd *userinfo = getpwuid(uid);
-               if (userinfo == NULL) {
-                       MS_DBG_ERR("getpwuid(%d) returns NULL !", uid);
-                       return NULL;
+               struct passwd pwdinfo;
+               struct passwd *pwdresult = NULL;
+               char *pwdbuf;
+               size_t pwdbufsize;
+
+               pwdbufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+               if (pwdbufsize == -1)           /* Value was indeterminate */
+                       pwdbufsize = 16384;             /* Should be more than enough (16*1024) */
+
+               pwdbuf = malloc(pwdbufsize);
+               if (pwdbuf == NULL) {
+                       MS_DBG_ERR("malloc pwdbuf pwdbufsize[%d] failed", pwdbufsize);
+                       goto END;
+               }
+
+               ret = getpwuid_r(uid, &pwdinfo, pwdbuf, pwdbufsize, &pwdresult);
+               if((ret == 0) && (pwdresult != NULL)) {
+                       MS_DBG("getpwuid uid[%d] success\n", uid);
+               } else {
+                       MS_DBG_ERR("getpwuid uid[%d] failed ret[%d]", uid, ret);
+                       MS_SAFE_FREE(pwdbuf);
+                       goto END;
                }
 
                // Compare git_t type and not group name
-               if (grpinfo->gr_gid != userinfo->pw_gid) {
+               if (grpinfo.gr_gid != pwdinfo.pw_gid) {
                        MS_DBG_ERR("UID [%d] does not belong to 'users' group!", uid);
-                       return NULL;
+                       MS_SAFE_FREE(pwdbuf);
+                       goto END;
                }
-               result_passwd = strndup(userinfo->pw_dir, strlen(userinfo->pw_dir));
+               result_passwd = strndup(pwdinfo.pw_dir, strlen(pwdinfo.pw_dir));
+
+               MS_SAFE_FREE(pwdbuf);
        }
 
+END:
+       MS_SAFE_FREE(grpbuf);
+
        return result_passwd;
 }
 
+
 ms_storage_type_t ms_get_storage_type_by_full(const char *path, uid_t uid)
 {
        int length_path;
@@ -622,16 +663,20 @@ char* ms_get_path(uid_t uid)
                // Compare git_t type and not group name
                if (grpinfo.gr_gid != pwdinfo.pw_gid) {
                        MS_DBG_ERR("UID [%d] does not belong to 'users' group!", uid);
-                       return NULL;
+                       MS_SAFE_FREE(pwdbuf);
+                       goto END;
                }
 
                len = snprintf(passwd_str, sizeof(passwd_str), "%s/%s", pwdinfo.pw_dir, MEDIA_CONTENT_PATH);
                if (len > 0)
                        result_passwd = strndup(passwd_str, len);
+
+               MS_SAFE_FREE(pwdbuf);
        }
 
 END:
        MS_SAFE_FREE(grpbuf);
+
        return result_passwd;
 }