Miscellaneous:
* 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).
This commit is contained in:
		
							
								
								
									
										21
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,3 +1,24 @@ | ||||
| 2011-09-18  Nicolas François  <nicolas.francois@centraliens.net> | ||||
|  | ||||
| 	* 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  <nicolas.francois@centraliens.net> | ||||
|  | ||||
| 	* libmisc/cleanup.c: Spawn children should no trigger cleanup | ||||
|   | ||||
| @@ -49,7 +49,6 @@ libshadow_la_SOURCES = \ | ||||
| 	shadowio.h \ | ||||
| 	shadowmem.c \ | ||||
| 	spawn.c \ | ||||
| 	spawn.h \ | ||||
| 	utent.c | ||||
|  | ||||
| if WITH_TCB | ||||
|   | ||||
							
								
								
									
										47
									
								
								lib/nscd.c
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								lib/nscd.c
									
									
									
									
									
								
							| @@ -3,25 +3,15 @@ | ||||
| #include <config.h> | ||||
| #ifdef USE_NSCD | ||||
|  | ||||
| /* because of TEMP_FAILURE_RETRY */ | ||||
| #ifndef _GNU_SOURCE | ||||
| #define _GNU_SOURCE | ||||
| #endif | ||||
|  | ||||
| #include <features.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
| #include <spawn.h> | ||||
| #include <errno.h> | ||||
| #include <sys/wait.h> | ||||
| #include <sys/types.h> | ||||
| #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 */ | ||||
|   | ||||
| @@ -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[], | ||||
|   | ||||
							
								
								
									
										54
									
								
								lib/spawn.c
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								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 <config.h> | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/wait.h> | ||||
| #include <unistd.h> | ||||
| #include <errno.h> | ||||
| #include <string.h> | ||||
| #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; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
| @@ -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, '/'); | ||||
|  | ||||
|   | ||||
| @@ -59,7 +59,6 @@ | ||||
| #ifdef	SHADOWGRP | ||||
| #include "sgroupio.h" | ||||
| #endif				/* SHADOWGRP */ | ||||
| #include "spawn.h" | ||||
| #ifdef WITH_TCB | ||||
| #include <tcb.h> | ||||
| #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"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user