On Mar 28, 2013, at 17:01 , Jan Friesse <[email protected]> wrote:
> Andrei,
> thanks for patch. Sadly, this part was changed in
> 52f88d04eaf2ad6c65df34a3401417d0583c6a45 (and I believe error you are
> pointing out is still existing there). Can you please send a patch
> applied on master git version?
Sure, please find it attached.
By the way, current code seems to be incorrect: using errno
with getpwnam_r()/getgrnam_r() functions is meaningless
(patch fixed this also).
>
> Thanks,
> Honza
>
> Andrei Belov napsal(a):
>> Hello corosync users,
>>
>> I've spent some time building and trying corosync 2.3.0 on SunOS
>> (Joyent's SmartOS-based VM), and noticed one issue with uidgid {}
>> configuration blocks parsing, e.g.:
>>
>> uidgid {
>> uid: user|uid
>> gid: group|gid
>> }
>>
>> Corosync won't display any errors in case of non-existent username/uid
>> or groupname/gid in configuration, and then we'll get something like
>> that:
>>
>> # corosync-cmapctl uidgid
>> uidgid.gid.4096 (u8) = 1
>> uidgid.uid.4292862832 (u8) = 1
>>
>> I'm attaching the patch that fixes this issue by performing additional
>> checks according to the following POSIX documents:
>>
>> http://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam_r.html
>> http://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrnam_r.html
>>
>> [..]
>> A null pointer is returned at the location pointed to by result on error or
>> if the requested entry is not found.
>> [..]
>>
>>
>> Hope this would be helpful for someone.
>>
>> Best regards,
>> Andrei.
From 2a38326ab171caf66e490893d7633938cc310c42 Mon Sep 17 00:00:00 2001
From: Andrei Belov <[email protected]>
Date: Thu, 28 Mar 2013 14:24:41 +0000
Subject: Improved POSIX-compliant handling of getpwnam_r() and getgrnam_r().
---
exec/coroparse.c | 56 ++++++++++++++++++++++++++++++++------------------------
1 file changed, 32 insertions(+), 24 deletions(-)
diff --git a/exec/coroparse.c b/exec/coroparse.c
index a1fd315..9439649 100644
--- a/exec/coroparse.c
+++ b/exec/coroparse.c
@@ -130,7 +130,7 @@ static int uid_determine (const char *req_user)
struct passwd* pwdptr = &passwd;
struct passwd* temp_pwd_pt;
char *pwdbuffer;
- int pwdlinelen;
+ int pwdlinelen, rc;
pwdlinelen = sysconf (_SC_GETPW_R_SIZE_MAX);
@@ -140,20 +140,24 @@ static int uid_determine (const char *req_user)
pwdbuffer = malloc (pwdlinelen);
- while ((getpwnam_r (req_user, pwdptr, pwdbuffer, pwdlinelen,
&temp_pwd_pt)) != 0) {
- if (errno == ERANGE) {
- char *n;
+ 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;
- }
+ pwdlinelen *= 2;
+ if (pwdlinelen <= 32678) {
+ n = realloc (pwdbuffer, pwdlinelen);
+ if (n != NULL) {
+ pwdbuffer = n;
+ continue;
}
}
-
+ }
+ if (rc != 0) {
+ free (pwdbuffer);
+ sprintf (error_string_response, "getpwnam_r(): %s",
strerror(rc));
+ return (-1);
+ }
+ if (temp_pwd_pt == NULL) {
free (pwdbuffer);
sprintf (error_string_response,
"The '%s' user is not found in /etc/passwd, please read
the documentation.",
@@ -173,7 +177,7 @@ static int gid_determine (const char *req_group)
struct group * grpptr = &group;
struct group * temp_grp_pt;
char *grpbuffer;
- int grplinelen;
+ int grplinelen, rc;
grplinelen = sysconf (_SC_GETGR_R_SIZE_MAX);
@@ -183,20 +187,24 @@ static int gid_determine (const char *req_group)
grpbuffer = malloc (grplinelen);
- while ((getgrnam_r (req_group, grpptr, grpbuffer, grplinelen,
&temp_grp_pt)) != 0) {
- if (errno == ERANGE) {
- char *n;
+ 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;
- }
+ grplinelen *= 2;
+ if (grplinelen <= 32678) {
+ n = realloc (grpbuffer, grplinelen);
+ if (n != NULL) {
+ grpbuffer = n;
+ continue;
}
}
-
+ }
+ if (rc != 0) {
+ free (grpbuffer);
+ sprintf (error_string_response, "getgrnam_r(): %s",
strerror(rc));
+ return (-1);
+ }
+ if (temp_grp_pt == NULL) {
free (grpbuffer);
sprintf (error_string_response,
"The '%s' group is not found in /etc/group, please read
the documentation.",
--
1.8.0.1
_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss