Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ulrich Drepper committed Apr 2, 2004
1 parent 0fce307 commit 4eb6619
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 80 deletions.
19 changes: 19 additions & 0 deletions 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.
Expand Down
83 changes: 82 additions & 1 deletion nis/nss-nis.c
@@ -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
Expand All @@ -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"
Expand Down Expand Up @@ -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;
}
14 changes: 13 additions & 1 deletion nis/nss-nis.h
@@ -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
Expand Down Expand Up @@ -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 */
79 changes: 1 addition & 78 deletions nis/nss_nis/nis-initgroups.c
Expand Up @@ -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>
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions nis/nss_nis/nis-service.c
Expand Up @@ -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;

Expand Down

0 comments on commit 4eb6619

Please sign in to comment.