diff --git a/ChangeLog b/ChangeLog index 4edc6356..659b7548 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2011-09-18 Nicolas François + + * lib/prototypes, libmisc/basename.c (Basename): Input is a + constant string. + * lib/prototypes.h, lib/spawn.h, lib/spawn.c, src/userdel.c, + lib/nscd.c, lib/Makefile.am: Delete spawn.h. Move from spawn.h to + prototypes.h. + * src/userdel.c: Remove unused variables. + * lib/nscd.c: Remove unused header files. + * lib/nscd.c: Add the program name to error messages. + * lib/nscd.c: Indicate when nscd does not terminate normally (signal). + * lib/spawn.c: Updated header. + * lib/spawn.c: Flush stdout and stderr to avoid inheriting from + ongoing buffers. + * lib/spawn.c: Avoid implicit conversion of pointer to boolean. + * lib/spawn.c: Replace perror by a complete message. + * lib/spawn.c: Continue to wait for the child if another child + terminates. + * lib/prototypes.h: The name field from cleanup_info_mod is a + constant string. (username). + 2011-09-18 Nicolas François * libmisc/cleanup.c: Spawn children should no trigger cleanup diff --git a/lib/Makefile.am b/lib/Makefile.am index 48da50ed..05b3a943 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -49,7 +49,6 @@ libshadow_la_SOURCES = \ shadowio.h \ shadowmem.c \ spawn.c \ - spawn.h \ utent.c if WITH_TCB diff --git a/lib/nscd.c b/lib/nscd.c index 8aa94046..bcdeccc2 100644 --- a/lib/nscd.c +++ b/lib/nscd.c @@ -3,25 +3,15 @@ #include #ifdef USE_NSCD -/* because of TEMP_FAILURE_RETRY */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include #include -#include -#include -#include -#include #include #include #include "exitcodes.h" #include "defines.h" -#include "spawn.h" +#include "prototypes.h" #include "nscd.h" -#define MSG_NSCD_FLUSH_CACHE_FAILED "Failed to flush the nscd cache.\n" +#define MSG_NSCD_FLUSH_CACHE_FAILED "%s: Failed to flush the nscd cache.\n" /* * nscd_flush_cache - flush specified service buffer in nscd cache @@ -29,31 +19,34 @@ int nscd_flush_cache (const char *service) { pid_t pid; - int err, status, code; - const char *spawnedArgs[] = {"/usr/sbin/nscd", "nscd", "-i", service, NULL}; + int status, code; + const char *cmd = "/usr/sbin/nscd"; + const char *spawnedArgs[] = {"nscd", "-i", service, NULL}; const char *spawnedEnv[] = {NULL}; - err = run_command (spawnedArgs[0], spawnedArgs, spawnedEnv, &status); - if (0 != err) - { + if (run_command (cmd, spawnedArgs, spawnedEnv, &status) != 0) { /* run_command writes its own more detailed message. */ - (void) fputs (_(MSG_NSCD_FLUSH_CACHE_FAILED), stderr); + (void) fprintf (stderr, _(MSG_NSCD_FLUSH_CACHE_FAILED), Prog); return -1; } - code = WIFEXITED (status) ? WEXITSTATUS (status) - : (WTERMSIG (status) + 128); - if (code == E_CMD_NOTFOUND) - { + + code = WEXITSTATUS (status); + if (!WIFEXITED (status)) { + (void) fprintf (stderr, + _("%s: nscd did not terminate normally (signal %d)\n"), + Prog, WTERMSIG (status)); + return -1; + } else if (code == E_CMD_NOTFOUND) { /* nscd is not installed, or it is installed but uses an interpreter that is missing. Probably the former. */ return 0; - } - if (code != 0) - { - (void) fprintf (stderr, "nscd exited with status %d", code); - (void) fputs (_(MSG_NSCD_FLUSH_CACHE_FAILED), stderr); + } else if (code != 0) { + (void) fprintf (stderr, _("%s: nscd exited with status %d"), + Prog, code); + (void) fprintf (stderr, _(MSG_NSCD_FLUSH_CACHE_FAILED), Prog); return -1; } + return 0; } #else /* USE_NSCD */ diff --git a/lib/prototypes.h b/lib/prototypes.h index 904f46ee..2332744a 100644 --- a/lib/prototypes.h +++ b/lib/prototypes.h @@ -72,7 +72,7 @@ extern int isexpired (const struct passwd *, /*@null@*/const struct spwd *); /* basename() renamed to Basename() to avoid libc name space confusion */ /* basename.c */ -extern /*@observer@*/const char *Basename (char *str); +extern /*@observer@*/const char *Basename (const char *str); /* chowndir.c */ extern int chown_tree (const char *root, @@ -92,7 +92,7 @@ void do_cleanups (void); struct cleanup_info_mod { char *audit_msg; char *action; - char *name; + /*@observer@*/const char *name; }; void cleanup_report_add_group (void *group_name); void cleanup_report_add_group_group (void *group_name); @@ -338,6 +338,10 @@ extern void spw_free (/*@out@*/ /*@only@*/struct spwd *spent); /* shell.c */ extern int shell (const char *file, /*@null@*/const char *arg, char *const envp[]); +/* spawn.c */ +extern int run_command (const char *cmd, const char *argv[], + const char *envp[], int *status); + /* system.c */ extern int safe_system (const char *command, const char *argv[], diff --git a/lib/spawn.c b/lib/spawn.c index afce926a..472f64db 100644 --- a/lib/spawn.c +++ b/lib/spawn.c @@ -1,21 +1,24 @@ /* - * Copyright (c) 2011, Jonathan Nieder + * Copyright (c) 2011 , Jonathan Nieder + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. + * 3. The name of the copyright holders or contributors may not be used to + * endorse or promote products derived from this software without + * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD - * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY @@ -26,51 +29,54 @@ #include -#include #include #include #include #include #include +#include #include "exitcodes.h" -#include "spawn.h" - -extern char **environ; +#include "prototypes.h" int run_command (const char *cmd, const char *argv[], const char *envp[], int *status) { pid_t pid, wpid; - if (!envp) + if (NULL == envp) { envp = (const char **)environ; + } + + (void) fflush (stdout); + (void) fflush (stderr); + pid = fork (); - if (pid == 0) { - execve (cmd, (char * const *) argv, (char * const *) envp); - if (errno == ENOENT) + if (0 == pid) { + (void) execve (cmd, (char * const *) argv, + (char * const *) envp); + if (ENOENT == errno) { exit (E_CMD_NOTFOUND); - perror(cmd); + } + fprintf (stderr, "%s: cannot execute %s: %s\n", + Prog, cmd, strerror (errno)); exit (E_CMD_NOEXEC); } else if ((pid_t)-1 == pid) { - int saved_errno = errno; - perror ("fork"); - errno = saved_errno; + fprintf (stderr, "%s: cannot execute %s: %s\n", + Prog, cmd, strerror (errno)); return -1; } do { wpid = waitpid (pid, status, 0); - } while ((pid_t)-1 == wpid && errno == EINTR); + } while ( ((pid_t)-1 == wpid && errno == EINTR) + || (wpid != pid)); if ((pid_t)-1 == wpid) { - int saved_errno = errno; - perror ("waitpid"); - return -1; - } else if (wpid != pid) { - (void) fprintf (stderr, "waitpid returned %ld != %ld\n", - (long int) wpid, (long int) pid); - errno = ECHILD; + fprintf (stderr, "%s: waitpid (status: %d): %s\n", + Prog, *status, strerror (errno)); return -1; } + return 0; } + diff --git a/lib/spawn.h b/lib/spawn.h deleted file mode 100644 index f975d2ce..00000000 --- a/lib/spawn.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _SPAWN_H -#define _SPAWN_H - -extern int run_command (const char *cmd, const char *argv[], - const char *envp[], int *status); - -#endif diff --git a/libmisc/basename.c b/libmisc/basename.c index 0022aae9..1525169c 100644 --- a/libmisc/basename.c +++ b/libmisc/basename.c @@ -42,7 +42,7 @@ #include "defines.h" #include "prototypes.h" -/*@observer@*/const char *Basename (char *str) +/*@observer@*/const char *Basename (const char *str) { char *cp = strrchr (str, '/'); diff --git a/src/userdel.c b/src/userdel.c index fbfb7183..c1995f13 100644 --- a/src/userdel.c +++ b/src/userdel.c @@ -59,7 +59,6 @@ #ifdef SHADOWGRP #include "sgroupio.h" #endif /* SHADOWGRP */ -#include "spawn.h" #ifdef WITH_TCB #include #include "tcbfuncs.h" @@ -630,7 +629,6 @@ static void user_cancel (const char *user) { const char *cmd; const char *argv[3]; - pid_t pid, wpid; int status; cmd = getdef_str ("USERDEL_CMD");