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;
}
{
bool ret = false;
int length_path;
- char * user_path = NULL;
+ char *user_path = NULL;
if (path == NULL)
return false;
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;
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;
// 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;
}