ACK

On 4/3/2013 5:04 PM, Jan Friesse wrote:
> ERANGE from above functions are now correctly handled. Error is
> correctly returned back (instead of using errno what is nonsense for
> reentrant functions). Existence of user/group is now correctly
> handled. Also numerical uid/gid works as expected.
> 
> Backport of 52f88d04eaf2ad6c65df34a3401417d0583c6a45,
> 005e7fd3b9de79bc32894f9f15431a7cf32a3b27 and
> 86b074dc1a72f9696ab5a3d302c7719b2961d8d6 from master
> 
> Signed-off-by: Jan Friesse <[email protected]>
> ---
>  exec/mainconfig.c |   84 
> ++++++++++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 67 insertions(+), 17 deletions(-)
> 
> diff --git a/exec/mainconfig.c b/exec/mainconfig.c
> index 7961876..e69652d 100644
> --- a/exec/mainconfig.c
> +++ b/exec/mainconfig.c
> @@ -580,21 +580,46 @@ static int uid_determine (const char *req_user)
>       struct passwd* pwdptr = &passwd;
>       struct passwd* temp_pwd_pt;
>       char *pwdbuffer;
> -     int  pwdlinelen;
> +     int  pwdlinelen, rc;
> +     long int id;
> +     char *ep;
> +
> +     id = strtol(req_user, &ep, 10);
> +     if (*ep == '\0' && id >= 0 && id <= UINT_MAX) {
> +             return (id);
> +     }
>  
>       pwdlinelen = sysconf (_SC_GETPW_R_SIZE_MAX);
>  
>       if (pwdlinelen == -1) {
> -             pwdlinelen = 256;
> +             pwdlinelen = 256;
>       }
>  
>       pwdbuffer = malloc (pwdlinelen);
>  
> -     if ((getpwnam_r (req_user, pwdptr, pwdbuffer, pwdlinelen, 
> &temp_pwd_pt)) != 0) {
> -             log_printf (LOGSYS_LEVEL_ERROR,
> -                     "ERROR: The '%s' user is not found in /etc/passwd, 
> please read the documentation.\n",
> -                     req_user);
> -             corosync_exit_error (AIS_DONE_UID_DETERMINE);
> +     while ((rc = getpwnam_r (req_user, pwdptr, pwdbuffer, pwdlinelen, 
> &temp_pwd_pt)) == ERANGE) {
> +             char *n;
> +
> +             pwdlinelen *= 2;
> +             if (pwdlinelen <= 32678) {
> +                     n = realloc (pwdbuffer, pwdlinelen);
> +                     if (n != NULL) {
> +                             pwdbuffer = n;
> +                             continue;
> +                     }
> +             }
> +     }
> +     if (rc != 0) {
> +             free (pwdbuffer);
> +             log_printf (LOGSYS_LEVEL_ERROR, "getpwnam_r(): %s", 
> strerror(rc));
> +             corosync_exit_error (AIS_DONE_UID_DETERMINE);
> +     }
> +     if (temp_pwd_pt == NULL) {
> +             free (pwdbuffer);
> +             log_printf (LOGSYS_LEVEL_ERROR,
> +                     "The '%s' user is not found in /etc/passwd, please read 
> the documentation.",
> +                     req_user);
> +             corosync_exit_error (AIS_DONE_UID_DETERMINE);
>       }
>       pw_uid = passwd.pw_uid;
>       free (pwdbuffer);
> @@ -604,31 +629,56 @@ static int uid_determine (const char *req_user)
>  
>  static int gid_determine (const char *req_group)
>  {
> -     int ais_gid = 0;
> +     int corosync_gid = 0;
>       struct group group;
>       struct group * grpptr = &group;
>       struct group * temp_grp_pt;
>       char *grpbuffer;
> -     int  grplinelen;
> +     int  grplinelen, rc;
> +     long int id;
> +     char *ep;
> +
> +     id = strtol(req_group, &ep, 10);
> +     if (*ep == '\0' && id >= 0 && id <= UINT_MAX) {
> +             return (id);
> +     }
>  
>       grplinelen = sysconf (_SC_GETGR_R_SIZE_MAX);
>  
>       if (grplinelen == -1) {
> -             grplinelen = 256;
> +             grplinelen = 256;
>       }
>  
>       grpbuffer = malloc (grplinelen);
>  
> -     if ((getgrnam_r (req_group, grpptr, grpbuffer, grplinelen, 
> &temp_grp_pt)) != 0) {
> -             log_printf (LOGSYS_LEVEL_ERROR,
> -                     "ERROR: The '%s' group is not found in /etc/group, 
> please read the documentation.\n",
> -                     req_group);
> -             corosync_exit_error (AIS_DONE_GID_DETERMINE);
> +     while ((rc = getgrnam_r (req_group, grpptr, grpbuffer, grplinelen, 
> &temp_grp_pt)) == ERANGE) {
> +             char *n;
> +
> +             grplinelen *= 2;
> +             if (grplinelen <= 32678) {
> +                     n = realloc (grpbuffer, grplinelen);
> +                     if (n != NULL) {
> +                             grpbuffer = n;
> +                             continue;
> +                     }
> +             }
> +     }
> +     if (rc != 0) {
> +             free (grpbuffer);
> +             log_printf (LOGSYS_LEVEL_ERROR, "getgrnam_r(): %s", 
> strerror(rc));
> +             corosync_exit_error (AIS_DONE_GID_DETERMINE);
> +     }
> +     if (temp_grp_pt == NULL) {
> +             free (grpbuffer);
> +             log_printf (LOGSYS_LEVEL_ERROR,
> +                     "The '%s' group is not found in /etc/group, please read 
> the documentation.",
> +                     req_group);
> +             corosync_exit_error (AIS_DONE_GID_DETERMINE);
>       }
> -     ais_gid = group.gr_gid;
> +     corosync_gid = group.gr_gid;
>       free (grpbuffer);
>  
> -     return ais_gid;
> +     return corosync_gid;
>  }
>  
>  static unsigned int logging_handle_find (
> 

_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss

Reply via email to