Optimize last initgroups patch a bit.

This commit is contained in:
Ulrich Drepper 2010-11-22 11:15:08 -05:00
parent 3056dcdb78
commit eaca75697f
2 changed files with 17 additions and 12 deletions

View File

@ -1,3 +1,8 @@
2010-11-22 Ulrich Drepper <drepper@gmail.com>
* nis/nss_compat/compat-initgroups.c (internal_getgrent_r): Optimize
last patch a bit. Pretty printing
2010-05-31 Petr Baudis <pasky@suse.cz> 2010-05-31 Petr Baudis <pasky@suse.cz>
[BZ #10085] [BZ #10085]

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1998-2004, 2006, 2007, 2009 Free Software Foundation, Inc. /* Copyright (C) 1998-2004,2006,2007,2009,2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998. Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@ -288,12 +288,12 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
return NSS_STATUS_TRYAGAIN; return NSS_STATUS_TRYAGAIN;
/* For every gid in the list we get from the NSS module, /* For every gid in the list we get from the NSS module,
get the whole group entry. We need to do this, since we get the whole group entry. We need to do this, since we
need the group name to check if it is in the blacklist. need the group name to check if it is in the blacklist.
In worst case, this is as twice as slow as stepping with In worst case, this is as twice as slow as stepping with
getgrent_r through the whole group database. But for large getgrent_r through the whole group database. But for large
group databases this is faster, since the user can only be group databases this is faster, since the user can only be
in a limited number of groups. */ in a limited number of groups. */
if (nss_initgroups_dyn (user, group, &mystart, &mysize, &mygroups, if (nss_initgroups_dyn (user, group, &mystart, &mysize, &mygroups,
limit, errnop) == NSS_STATUS_SUCCESS) limit, errnop) == NSS_STATUS_SUCCESS)
{ {
@ -426,7 +426,7 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
} }
while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */
/* Parse the line. If it is invalid, loop to /* Parse the line. If it is invalid, loop to
get the next line of the file to parse. */ get the next line of the file to parse. */
!(parse_res = _nss_files_parse_grent (p, &grpbuf, data, buflen, !(parse_res = _nss_files_parse_grent (p, &grpbuf, data, buflen,
errnop))); errnop)));
@ -477,15 +477,15 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL) if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL)
{ {
if (nss_setgrent != NULL) if (nss_setgrent != NULL)
{ {
nss_setgrent (1); nss_setgrent (1);
ent->need_endgrent = true; ent->need_endgrent = true;
} }
ent->skip_initgroups_dyn = true; ent->skip_initgroups_dyn = true;
}
if (ent->skip_initgroups_dyn && nss_getgrent_r == NULL) if (nss_getgrent_r == NULL)
return NSS_STATUS_UNAVAIL; return NSS_STATUS_UNAVAIL;
}
ent->files = false; ent->files = false;