{
int len = 0;
char *result_passwd = NULL;
- struct group *grpinfo = NULL;
+
+ struct group grpinfo;
+ struct group* grpresult = NULL;
+ char* grpbuf;
+ size_t grpbufsize;
+ int ret = -1;
+
+ 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);
+ return NULL;
+ }
+
+ ret = getgrnam_r("users", &grpinfo, grpbuf, grpbufsize, &grpresult);
+ if((ret == 0) && (grpresult != NULL)) {
+ MSAPI_DBG_ERR("getgrnam_r users success...\n");
+ } else {
+ MSAPI_DBG_ERR("getgrnam_r users failed ret[%d]", ret);
+ goto END;
+ }
+
if (uid == getuid()) {
- grpinfo = getgrnam("users");
- if (grpinfo == NULL) {
- MSAPI_DBG_ERR("getgrnam(users) returns NULL !");
- return NULL;
- }
- if (MS_STRING_VALID(MEDIA_DB_NAME))
+ if (MS_STRING_VALID(MEDIA_DB_NAME)) {
+ MSAPI_DBG_ERR("MS_STRING_VALID MEDIA_DB_NAME valid...\n");
result_passwd = strdup(MEDIA_DB_NAME);
+ } else {
+ MSAPI_DBG_ERR("MS_STRING_VALID MEDIA_DB_NAME invalid...\n");
+ goto END;
+ }
} else {
char passwd_str[MAX_FILEPATH_LEN] = {0, };
- 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;
}
- grpinfo = getgrnam("users");
- if (grpinfo == NULL) {
- MSAPI_DBG_ERR("getgrnam(users) returns NULL !");
- return NULL;
+
+ ret = getpwuid_r(uid, &pwdinfo, pwdbuf, pwdbufsize, &pwdresult);
+ if((ret == 0) && (pwdresult != NULL)) {
+ MSAPI_DBG_ERR("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) {
- MSAPI_DBG_ERR("UID [%d] does not belong to 'users' group!", uid);
- return NULL;
+
+ MSAPI_DBG_ERR("grpinfo.gr_gid[%d], pwdinfo.pw_gid[%d]", grpinfo.gr_gid, pwdinfo.pw_gid);
+ if(grpinfo.gr_gid != pwdinfo.pw_gid) {
+ MSAPI_DBG_ERR("UID [%d] does not belong to 'users' group![%d][%d]", uid, grpinfo.gr_gid, pwdinfo.pw_gid);
+ MS_SAFE_FREE(pwdbuf);
+ goto END;
}
- len = snprintf(passwd_str, sizeof(passwd_str), "%s/.applications/dbspace/.media.db", userinfo->pw_dir);
+
+ len = snprintf(passwd_str, sizeof(passwd_str), "%s/.applications/dbspace/.media.db", pwdinfo.pw_dir);
if (len > 0)
result_passwd = strndup(passwd_str, len);
+
+ MS_SAFE_FREE(pwdbuf);
}
+END:
+ MS_SAFE_FREE(grpbuf);
return result_passwd;
}