* NEWS, lib/nscd.c: Execute nscd -i instead of using the private

glibc socket to flush the nscd tables. This comes from the RedHat
  patch shadow-4.0.16-nscd.c.
* lib/commonio.c: Forbid inheritance of the passwd and group files
  to the spawed processes (like nscd). This comes from the RedHat
  patch shadow-4.0.17-notInheritFd.patch.
* lib/nscd.h: Update header.
This commit is contained in:
nekral-guest 2007-11-17 14:04:05 +00:00
parent 6c2e7c124f
commit 4aafb131ca
5 changed files with 55 additions and 93 deletions

View File

@ -1,3 +1,13 @@
2007-11-17 Nicolas François <nicolas.francois@centraliens.net>
* NEWS, lib/nscd.c: Execute nscd -i instead of using the private
glibc socket to flush the nscd tables. This comes from the RedHat
patch shadow-4.0.16-nscd.c.
* lib/commonio.c: Forbid inheritance of the passwd and group files
to the spawed processes (like nscd). This comes from the RedHat
patch shadow-4.0.17-notInheritFd.patch.
* lib/nscd.h: Update header.
2007-11-17 Nicolas François <nicolas.francois@centraliens.net>
* src/usermod.c (fail_exit): Add static variables pw_locked,

2
NEWS
View File

@ -30,6 +30,8 @@ shadow-4.0.18.1 -> shadow-4.0.18.2 UNRELEASED
- usermod: Update the group database before flushing the nscd caches.
- usermod: Make sure the group modifications will be allowed before
writing the passwd files.
- Flush the nscd tables using nscd -i instead of the private glibc socket.
(RedHat patches shadow-4.0.16-nscd.c and shadow-4.0.17-notInheritFd.patch)
shadow-4.0.18.1 -> shadow-4.0.18.2 28-10-2007

View File

@ -460,6 +460,10 @@ int commonio_open (struct commonio_db *db, int mode)
}
return 0;
}
/* Do not inherit fd in spawned processes (e.g. nscd) */
fcntl(fileno(db->fp), F_SETFD, FD_CLOEXEC);
#ifdef WITH_SELINUX
db->scontext = NULL;
if ((is_selinux_enabled () > 0) && (!db->readonly)) {

View File

@ -1,101 +1,50 @@
/* Copyright (c) 1999 SuSE GmbH Nuerenberg, Germany
Author: Thorsten Kukuk <kukuk@suse.de> */
/* Author: Peter Vrabec <pvrabec@redhat.com> */
#include <assert.h>
#include <signal.h>
/* because of TEMP_FAILURE_RETRY */
#define _GNU_SOURCE
#include <features.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <spawn.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/types.h>
/* Version number of the daemon interface */
#define NSCD_VERSION 2
/* Path for the Unix domain socket. */
#define _PATH_NSCDSOCKET "/var/run/nscd/socket"
#define _PATH_NSCDSOCKET_OLD "/var/run/.nscd_socket"
/* Available services. */
typedef enum {
GETPWBYNAME,
GETPWBYUID,
GETGRBYNAME,
GETGRBYGID,
GETHOSTBYNAME,
GETHOSTBYNAMEv6,
GETHOSTBYADDR,
GETHOSTBYADDRv6,
LASTDBREQ = GETHOSTBYADDRv6,
SHUTDOWN, /* Shut the server down. */
GETSTAT, /* Get the server statistic. */
INVALIDATE, /* Invalidate one special cache. */
LASTREQ
} request_type;
/* Header common to all requests */
typedef struct {
int version; /* Version number of the daemon interface. */
request_type type; /* Service requested. */
#if defined(__alpha__)
int64_t key_len; /* Key length is 64bit on Alpha. */
#else
int32_t key_len; /* Key length, 32bit on most plattforms. */
#endif
} request_header;
/* Create a socket connected to a name. */
static int nscd_open_socket (void)
{
struct sockaddr_un addr;
int sock;
sock = socket (PF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
return -1;
addr.sun_family = AF_UNIX;
assert (sizeof (addr.sun_path) >= sizeof (_PATH_NSCDSOCKET));
strcpy (addr.sun_path, _PATH_NSCDSOCKET);
if (connect (sock, (struct sockaddr *) &addr, sizeof (addr)) < 0) {
addr.sun_family = AF_UNIX;
assert (sizeof (addr.sun_path) >=
sizeof (_PATH_NSCDSOCKET_OLD));
strcpy (addr.sun_path, _PATH_NSCDSOCKET_OLD);
if (connect (sock, (struct sockaddr *) &addr, sizeof (addr)) <
0) {
close (sock);
return -1;
}
}
return sock;
}
/*
* nscd_flush_cache - flush specyfied service bufor in nscd cache
* nscd_flush_cache - flush specified service buffer in nscd cache
*/
int nscd_flush_cache (char *service)
int nscd_flush_cache (const char *service)
{
int sock = nscd_open_socket ();
request_header req;
struct iovec iov[2];
ssize_t nbytes;
pid_t pid, termpid;
int err, status;
char *spawnedArgs[] = {"/usr/sbin/nscd", "nscd", "-i", service, NULL};
char *spawnedEnv[] = {NULL};
if (sock == -1)
/* spawn process */
if( (err=posix_spawn(&pid, spawnedArgs[0], NULL, NULL,
spawnedArgs, spawnedEnv)) !=0 )
{
fprintf(stderr, "posix_spawn() error=%d\n", err);
return -1;
}
req.version = NSCD_VERSION;
req.type = INVALIDATE;
req.key_len = strlen (service) + 1;
/* Wait for the spawned process to exit */
termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0));
if (termpid == -1)
{
perror("waitpid");
return -1;
}
else if (termpid != pid)
{
fprintf(stderr, "waitpid returned %ld != %ld\n",
(long int) termpid, (long int) pid);
return -1;
}
iov[0].iov_base = &req;
iov[0].iov_len = sizeof (req);
iov[1].iov_base = service;
iov[1].iov_len = req.key_len;
nbytes = writev (sock, iov, 2);
close (sock);
return (nbytes != iov[0].iov_len + iov[1].iov_len ? (-1) : 0);
return 0;
}

View File

@ -1,11 +1,8 @@
/* Copyright (c) 1999 SuSE GmbH Nuerenberg, Germany
Author: Thorsten Kukuk <kukuk@suse.de> */
#ifndef _FAILURE_H_
#define _FAILURE_H_
#ifndef _NSCD_H_
#define _NSCD_H_
/*
* nscd_flush_cache - flush specyfied service bufor in nscd cache
* nscd_flush_cache - flush specified service buffer in nscd cache
*/
extern int nscd_flush_cache (char *service);