mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-19 13:40:59 +08:00
Update.
2004-04-02 Jakub Jelinek <jakub@redhat.com> * nis/nss: Add SERVICES_AUTHORITATIVE. * nis/nss-nis.h (NSS_FLAG_SET, NSS_FLAG_NETID_AUTHORITATIVE, NSS_FLAG_SERVICES_AUTHORITATIVE): Define. (_nis_default_nss_flags, _nis_check_default_nss): New decls. (_nis_default_nss): New inline. * nis/nss-nis.c: Include ctype.h, stdio.h and stdio_ext.h. (_nis_default_nss_flags, default_nss): New variables. (_nis_check_default_nss): New function. * nis/nss_nis/nis-initgroups.c: Don't include stdio.h and stdio_ext.h. (check_default_nss, default_nss): Move to nss-nis.c. (init): Removed. (_nss_nis_initgroups_dyn): Use _nis_default_nss (). * nis/nss_nis/nis-services.c (_nss_nis_getservbyname_r): If NSS_FLAG_SERVICES_AUTHORITATIVE and services.byservicename lookup fails, return immediately.
This commit is contained in:
parent
0fce307092
commit
4eb6619c70
19
ChangeLog
19
ChangeLog
@ -1,3 +1,22 @@
|
||||
2004-04-02 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* nis/nss: Add SERVICES_AUTHORITATIVE.
|
||||
* nis/nss-nis.h (NSS_FLAG_SET, NSS_FLAG_NETID_AUTHORITATIVE,
|
||||
NSS_FLAG_SERVICES_AUTHORITATIVE): Define.
|
||||
(_nis_default_nss_flags, _nis_check_default_nss): New decls.
|
||||
(_nis_default_nss): New inline.
|
||||
* nis/nss-nis.c: Include ctype.h, stdio.h and stdio_ext.h.
|
||||
(_nis_default_nss_flags, default_nss): New variables.
|
||||
(_nis_check_default_nss): New function.
|
||||
* nis/nss_nis/nis-initgroups.c: Don't include stdio.h and
|
||||
stdio_ext.h.
|
||||
(check_default_nss, default_nss): Move to nss-nis.c.
|
||||
(init): Removed.
|
||||
(_nss_nis_initgroups_dyn): Use _nis_default_nss ().
|
||||
* nis/nss_nis/nis-services.c (_nss_nis_getservbyname_r): If
|
||||
NSS_FLAG_SERVICES_AUTHORITATIVE and services.byservicename lookup
|
||||
fails, return immediately.
|
||||
|
||||
2004-04-01 Roland McGrath <roland@redhat.com>
|
||||
|
||||
* elf/tst-execstack.c (do_test): Make F static.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 2001, 2004 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -16,6 +16,9 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdio_ext.h>
|
||||
#include <rpcsvc/ypclnt.h>
|
||||
|
||||
#include "nss-nis.h"
|
||||
@ -45,3 +48,81 @@ const enum nss_status __yperr2nss_tab[] =
|
||||
};
|
||||
const unsigned int __yperr2nss_count = (sizeof (__yperr2nss_tab)
|
||||
/ sizeof (__yperr2nss_tab[0]));
|
||||
|
||||
int _nis_default_nss_flags;
|
||||
|
||||
static const char default_nss[] = "/etc/default/nss";
|
||||
|
||||
int
|
||||
_nis_check_default_nss (void)
|
||||
{
|
||||
FILE *fp = fopen (default_nss, "rc");
|
||||
int flags = NSS_FLAG_SET;
|
||||
if (fp != NULL)
|
||||
{
|
||||
char *line = NULL;
|
||||
size_t linelen = 0;
|
||||
|
||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||
|
||||
while (!feof_unlocked (fp))
|
||||
{
|
||||
ssize_t n = getline (&line, &linelen, fp);
|
||||
if (n <= 0)
|
||||
break;
|
||||
|
||||
/* There currently are only two variables we expect, so
|
||||
simplify the parsing. Recognize only
|
||||
|
||||
NETID_AUTHORITATIVE = TRUE
|
||||
SERVICES_AUTHORITATIVE = TRUE
|
||||
|
||||
with arbitrary white spaces. */
|
||||
char *cp = line;
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
|
||||
/* Recognize comment lines. */
|
||||
if (*cp == '#')
|
||||
continue;
|
||||
|
||||
static const char netid_authoritative[] = "NETID_AUTHORITATIVE";
|
||||
static const char services_authoritative[]
|
||||
= "SERVICES_AUTHORITATIVE";
|
||||
size_t flag_len;
|
||||
if (strncmp (cp, netid_authoritative,
|
||||
flag_len = sizeof (netid_authoritative) - 1) != 0
|
||||
&& strncmp (cp, services_authoritative,
|
||||
flag_len = sizeof (services_authoritative) - 1)
|
||||
!= 0)
|
||||
continue;
|
||||
|
||||
cp += flag_len;
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
if (*cp++ != '=')
|
||||
continue;
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
|
||||
if (strncmp (cp, "TRUE", 4) != 0)
|
||||
continue;
|
||||
cp += 4;
|
||||
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
|
||||
if (*cp == '\0')
|
||||
flags |= flag_len == sizeof (netid_authoritative) - 1
|
||||
? NSS_FLAG_NETID_AUTHORITATIVE
|
||||
: NSS_FLAG_SERVICES_AUTHORITATIVE;
|
||||
}
|
||||
|
||||
free (line);
|
||||
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
_nis_default_nss_flags = flags;
|
||||
return flags;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 2004 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -36,4 +36,16 @@ yperr2nss (int errval)
|
||||
return __yperr2nss_tab[(unsigned int) errval];
|
||||
}
|
||||
|
||||
#define NSS_FLAG_SET 1
|
||||
#define NSS_FLAG_NETID_AUTHORITATIVE 2
|
||||
#define NSS_FLAG_SERVICES_AUTHORITATIVE 4
|
||||
extern int _nis_default_nss_flags attribute_hidden;
|
||||
extern int _nis_check_default_nss (void) attribute_hidden;
|
||||
|
||||
extern inline __attribute__((always_inline)) int
|
||||
_nis_default_nss (void)
|
||||
{
|
||||
return _nis_default_nss_flags ?: _nis_check_default_nss ();
|
||||
}
|
||||
|
||||
#endif /* nis/nss-nis.h */
|
||||
|
@ -23,8 +23,6 @@
|
||||
#include <grp.h>
|
||||
#include <nss.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdio_ext.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <rpcsvc/yp.h>
|
||||
@ -129,78 +127,6 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen,
|
||||
}
|
||||
|
||||
|
||||
static int init;
|
||||
static int use_netid;
|
||||
|
||||
|
||||
static const char default_nss[] = "/etc/default/nss";
|
||||
|
||||
static void
|
||||
check_default_nss (void)
|
||||
{
|
||||
FILE *fp = fopen (default_nss, "rc");
|
||||
if (fp != NULL)
|
||||
{
|
||||
char *line = NULL;
|
||||
size_t linelen = 0;
|
||||
|
||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||
|
||||
while (!feof_unlocked (fp))
|
||||
{
|
||||
ssize_t n = getline (&line, &linelen, fp);
|
||||
if (n <= 0)
|
||||
break;
|
||||
|
||||
/* There currently is only one variable we expect, so
|
||||
simplify the parsing. Recognize only
|
||||
|
||||
NETID_AUTHORITATIVE = TRUE
|
||||
|
||||
with arbitrary white spaces. */
|
||||
char *cp = line;
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
|
||||
/* Recognize comment lines. */
|
||||
if (*cp == '#')
|
||||
continue;
|
||||
|
||||
static const char netid_authoritative[] = "NETID_AUTHORITATIVE";
|
||||
if (strncmp (cp, netid_authoritative,
|
||||
sizeof (netid_authoritative) - 1) != 0)
|
||||
continue;
|
||||
|
||||
cp += sizeof (netid_authoritative) - 1;
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
if (*cp++ != '=')
|
||||
continue;
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
|
||||
if (strncmp (cp, "TRUE", 4) != 0)
|
||||
continue;
|
||||
cp +=4;
|
||||
|
||||
while (isspace (*cp))
|
||||
++cp;
|
||||
|
||||
if (*cp == '\0')
|
||||
use_netid = 1;
|
||||
|
||||
/* For now, just drop out of the loop. */
|
||||
break;
|
||||
}
|
||||
|
||||
free (line);
|
||||
|
||||
fclose (fp);
|
||||
}
|
||||
init = 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
get_uid (const char *user, uid_t *uidp)
|
||||
{
|
||||
@ -321,10 +247,7 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
/* Check whether we are supposed to use the netid.byname map. */
|
||||
if (!init)
|
||||
check_default_nss ();
|
||||
|
||||
if (use_netid)
|
||||
if (_nis_default_nss () & NSS_FLAG_NETID_AUTHORITATIVE)
|
||||
{
|
||||
/* We need the user ID. */
|
||||
uid_t uid;
|
||||
|
@ -330,6 +330,10 @@ _nss_nis_getservbyname_r (const char *name, const char *protocol,
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Check if it is safe to rely on services.byservicename. */
|
||||
if (_nis_default_nss () & NSS_FLAG_SERVICES_AUTHORITATIVE)
|
||||
return status;
|
||||
|
||||
struct ypall_callback ypcb;
|
||||
struct search_t req;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user