diff --git a/exec/mainconfig.c b/exec/mainconfig.c index 70984f90..7d4e520b 100644 --- a/exec/mainconfig.c +++ b/exec/mainconfig.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -568,11 +569,20 @@ parse_error: static int uid_determine (const char *req_user) { + int pw_uid = 0; struct passwd passwd; struct passwd* pwdptr = &passwd; struct passwd* temp_pwd_pt; - char pwdbuffer[200]; - int pwdlinelen = sizeof(pwdbuffer); + char *pwdbuffer; + int pwdlinelen; + + pwdlinelen = sysconf (_SC_GETPW_R_SIZE_MAX); + + if (pwdlinelen == -1) { + pwdlinelen = 256; + } + + pwdbuffer = malloc (pwdlinelen); if ((getpwnam_r (req_user, pwdptr, pwdbuffer, pwdlinelen, &temp_pwd_pt)) != 0) { log_printf (LOGSYS_LEVEL_ERROR, @@ -580,8 +590,10 @@ static int uid_determine (const char *req_user) req_user); corosync_exit_error (AIS_DONE_UID_DETERMINE); } + pw_uid = passwd.pw_uid; + free (pwdbuffer); - return passwd.pw_uid; + return pw_uid; } static int gid_determine (const char *req_group) @@ -590,8 +602,16 @@ static int gid_determine (const char *req_group) struct group group; struct group * grpptr = &group; struct group * temp_grp_pt; - char grpbuffer[200]; - int grplinelen = sizeof(grpbuffer); + char *grpbuffer; + int grplinelen; + + grplinelen = sysconf (_SC_GETGR_R_SIZE_MAX); + + if (grplinelen == -1) { + grplinelen = 256; + } + + grpbuffer = malloc (grplinelen); if ((getgrnam_r (req_group, grpptr, grpbuffer, grplinelen, &temp_grp_pt)) != 0) { log_printf (LOGSYS_LEVEL_ERROR, @@ -600,6 +620,8 @@ static int gid_determine (const char *req_group) corosync_exit_error (AIS_DONE_GID_DETERMINE); } ais_gid = group.gr_gid; + free (grpbuffer); + return ais_gid; }