[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-4609-g7ef3e75

Jeremy Allison jra at samba.org
Tue Dec 9 22:26:55 GMT 2008


The branch, v3-3-test has been updated
       via  7ef3e752bf56d130a242d6bb6e92fa76cae45fa0 (commit)
      from  8dd3a7bfde16e85a9ee509cf6bcfc788062705a5 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test


- Log -----------------------------------------------------------------
commit 7ef3e752bf56d130a242d6bb6e92fa76cae45fa0
Author: SATOH Fumiyasu <fumiyas at osstech.co.jp>
Date:   Tue Dec 9 14:25:46 2008 -0800

    Fix bug #5688 LPQ process is orphaned if socket address parameter is invalid

-----------------------------------------------------------------------

Summary of changes:
 source/printing/printing.c |   39 +++++++++++++++++++++++++++++++++------
 1 files changed, 33 insertions(+), 6 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/printing/printing.c b/source/printing/printing.c
index 1016e61..724cdc9 100644
--- a/source/printing/printing.c
+++ b/source/printing/printing.c
@@ -1394,7 +1394,19 @@ main thread of the background lpq updater
 ****************************************************************************/
 void start_background_queue(void)
 {
+	/* Use local variables for this as we don't
+	 * need to save the parent side of this, just
+	 * ensure it closes when the process exits.
+	 */
+	int pause_pipe[2];
+
 	DEBUG(3,("start_background_queue: Starting background LPQ thread\n"));
+
+	if (pipe(pause_pipe) == -1) {
+		DEBUG(5,("start_background_queue: cannot create pipe. %s\n", strerror(errno) ));
+		exit(1);
+	}
+
 	background_lpq_updater_pid = sys_fork();
 
 	if (background_lpq_updater_pid == -1) {
@@ -1406,6 +1418,9 @@ void start_background_queue(void)
 		/* Child. */
 		DEBUG(5,("start_background_queue: background LPQ thread started\n"));
 
+		close(pause_pipe[0]);
+		pause_pipe[0] = -1;
+
 		if (!reinit_after_fork(smbd_messaging_context(), true)) {
 			DEBUG(0,("reinit_after_fork() failed\n"));
 			smb_panic("reinit_after_fork() failed");
@@ -1420,13 +1435,23 @@ void start_background_queue(void)
 
 		messaging_register(smbd_messaging_context(), NULL,
 				   MSG_PRINTER_UPDATE, print_queue_receive);
-		
+
 		DEBUG(5,("start_background_queue: background LPQ thread waiting for messages\n"));
 		while (1) {
-			pause();
-			
+			fd_set pause_fds;
+			int pause_select;
+
+			FD_ZERO(&pause_fds);
+			FD_SET(pause_pipe[1], &pause_fds);
+			pause_select = sys_select(pause_pipe[1]+1, &pause_fds, NULL, NULL, NULL);
+			/* If pause_pipe[0] is closed it means the parent smbd
+			 * and children exited or aborted. */
+			if (pause_select == 1) {
+                                exit_server_cleanly(NULL);
+			}
+
 			/* check for some essential signals first */
-			
+
                         if (got_sig_term) {
                                 exit_server_cleanly(NULL);
                         }
@@ -1437,9 +1462,9 @@ void start_background_queue(void)
                                 reload_services(False);
                                 reload_after_sighup = 0;
                         }
-			
+
 			/* now check for messages */
-			
+
 			DEBUG(10,("start_background_queue: background LPQ thread got a message\n"));
 			message_dispatch(smbd_messaging_context());
 
@@ -1449,6 +1474,8 @@ void start_background_queue(void)
 						   0);
 		}
 	}
+
+	close(pause_pipe[1]);
 }
 
 /****************************************************************************


-- 
Samba Shared Repository


More information about the samba-cvs mailing list