Skip to content

Commit

Permalink
2005-07-05 Thorsten Kukuk <kukuk@suse.de>
Browse files Browse the repository at this point in the history
	[BZ #1111]
	* nis/nss_compat/compat-grp.c (internal_getgrgid_r): Check if NSS
	module provides getgrgid_r.
	(getgrnam_plusgroup): Preserve original return value.
	* nis/nss_compat/compat-pwd.c (getpwnam_plususer): Preserve
	original return value.
	* nis/nss_compat/compat-spwd.c (getspnam_plususer): Likewise.
  • Loading branch information
Roland McGrath committed Jul 18, 2005
1 parent db9535f commit e1cbe0a
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 24 deletions.
15 changes: 9 additions & 6 deletions nis/nss_compat/compat-grp.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,9 +229,10 @@ getgrnam_plusgroup (const char *name, struct group *result, ent_t *ent,
if (!nss_getgrnam_r)
return NSS_STATUS_UNAVAIL;

if (nss_getgrnam_r (name, result, buffer, buflen, errnop) !=
NSS_STATUS_SUCCESS)
return NSS_STATUS_NOTFOUND;
enum nss_status status = nss_getgrnam_r (name, result, buffer, buflen,
errnop);
if (status != NSS_STATUS_SUCCESS)
return status;

if (in_blacklist (result->gr_name, strlen (result->gr_name), ent))
return NSS_STATUS_NOTFOUND;
Expand Down Expand Up @@ -551,7 +552,7 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
!(parse_res = _nss_files_parse_grent (p, result, data, buflen,
errnop)));

if (parse_res == -1)
if (__builtin_expect (parse_res == -1, 0))
/* The parser ran out of space. */
goto erange_reset;

Expand Down Expand Up @@ -589,9 +590,11 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
/* +:... */
if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
{
enum nss_status status;
if (!nss_getgrgid_r)
return NSS_STATUS_UNAVAIL;

status = nss_getgrgid_r (gid, result, buffer, buflen, errnop);
enum nss_status status = nss_getgrgid_r (gid, result, buffer, buflen,
errnop);
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
return NSS_STATUS_NOTFOUND;
else
Expand Down
16 changes: 7 additions & 9 deletions nis/nss_compat/compat-pwd.c
Original file line number Diff line number Diff line change
Expand Up @@ -453,29 +453,27 @@ static enum nss_status
getpwnam_plususer (const char *name, struct passwd *result, ent_t *ent,
char *buffer, size_t buflen, int *errnop)
{
struct passwd pwd;
char *p;
size_t plen;

if (!nss_getpwnam_r)
return NSS_STATUS_UNAVAIL;

struct passwd pwd;
memset (&pwd, '\0', sizeof (struct passwd));

copy_pwd_changes (&pwd, result, NULL, 0);

plen = pwd_need_buflen (&pwd);
size_t plen = pwd_need_buflen (&pwd);
if (plen > buflen)
{
*errnop = ERANGE;
return NSS_STATUS_TRYAGAIN;
}
p = buffer + (buflen - plen);
char *p = buffer + (buflen - plen);
buflen -= plen;

if (nss_getpwnam_r (name, result, buffer, buflen, errnop) !=
NSS_STATUS_SUCCESS)
return NSS_STATUS_NOTFOUND;
enum nss_status status = nss_getpwnam_r (name, result, buffer, buflen,
errnop);
if (status != NSS_STATUS_SUCCESS)
return status;

if (in_blacklist (result->pw_name, strlen (result->pw_name), ent))
return NSS_STATUS_NOTFOUND;
Expand Down
16 changes: 7 additions & 9 deletions nis/nss_compat/compat-spwd.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,13 +401,10 @@ static enum nss_status
getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
char *buffer, size_t buflen, int *errnop)
{
struct spwd pwd;
char *p;
size_t plen;

if (!nss_getspnam_r)
return NSS_STATUS_UNAVAIL;

struct spwd pwd;
memset (&pwd, '\0', sizeof (struct spwd));
pwd.sp_warn = -1;
pwd.sp_inact = -1;
Expand All @@ -416,18 +413,19 @@ getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,

copy_spwd_changes (&pwd, result, NULL, 0);

plen = spwd_need_buflen (&pwd);
size_t plen = spwd_need_buflen (&pwd);
if (plen > buflen)
{
*errnop = ERANGE;
return NSS_STATUS_TRYAGAIN;
}
p = buffer + (buflen - plen);
char *p = buffer + (buflen - plen);
buflen -= plen;

if (nss_getspnam_r (name, result, buffer, buflen, errnop) !=
NSS_STATUS_SUCCESS)
return NSS_STATUS_NOTFOUND;
enum nss_status status = nss_getspnam_r (name, result, buffer, buflen,
errnop);
if (status != NSS_STATUS_SUCCESS)
return status;

if (in_blacklist (result->sp_namp, strlen (result->sp_namp), ent))
return NSS_STATUS_NOTFOUND;
Expand Down

0 comments on commit e1cbe0a

Please sign in to comment.