diff options
Diffstat (limited to 'nis/nis_ismember.c')
-rw-r--r-- | nis/nis_ismember.c | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/nis/nis_ismember.c b/nis/nis_ismember.c index 4a33f02cff..7580ee8c8e 100644 --- a/nis/nis_ismember.c +++ b/nis/nis_ismember.c @@ -1,6 +1,6 @@ -/* Copyright (c) 1997, 1998 Free Software Foundation, Inc. +/* Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997. + Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -43,13 +43,21 @@ internal_ismember (const_nis_name principal, const_nis_name group) *cp++ = '.'; strcpy (cp, cp2); } + res = nis_lookup (buf, EXPAND_NAME|FOLLOW_LINKS); - if (NIS_RES_STATUS (res) != NIS_SUCCESS) - return 0; + if (res == NULL || NIS_RES_STATUS (res) != NIS_SUCCESS) + { + if (res) + nis_freeresult (res); + return 0; + } if ((NIS_RES_NUMOBJ (res) != 1) || (__type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ)) - return 0; + { + nis_freeresult (res); + return 0; + } /* We search twice in the list, at first, if we have the name with a "-", then if without. "-member" has priority */ @@ -59,14 +67,19 @@ internal_ismember (const_nis_name principal, const_nis_name group) if (cp[0] == '-') { if (strcmp (&cp[1], principal) == 0) - return -1; + { + nis_freeresult (res); + return -1; + } if (cp[1] == '@') switch (internal_ismember (principal, &cp[2])) { case -1: + nis_freeresult (res); return -1; case 1: - return -1; + nis_freeresult (res); + return 1; default: break; } @@ -76,26 +89,34 @@ internal_ismember (const_nis_name principal, const_nis_name group) char buf1[strlen (principal) + 2]; char buf2[strlen (cp) + 2]; - strcpy (buf1, nis_domain_of (principal)); - strcpy (buf2, nis_domain_of (cp)); - if (strcmp (buf1, buf2) == 0) - return -1; + if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1), + nis_domain_of_r (cp, buf2, sizeof buf2)) == 0) + { + nis_freeresult (res); + return -1; + } } } } + for (i = 0; i < NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len; ++i) { cp = NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[i]; if (cp[0] != '-') { if (strcmp (cp, principal) == 0) - return 1; + { + nis_freeresult (res); + return 1; + } if (cp[0] == '@') switch (internal_ismember (principal, &cp[1])) { case -1: + nis_freeresult (res); return -1; case 1: + nis_freeresult (res); return 1; default: break; @@ -108,10 +129,14 @@ internal_ismember (const_nis_name principal, const_nis_name group) if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1), nis_domain_of_r (cp, buf2, sizeof buf2)) == 0) - return 1; + { + nis_freeresult (res); + return 1; + } } } } + nis_freeresult (res); return 0; } |