[Lutz.Jaenicke at aet.TU-Cottbus.DE: 2.9p1: HP-UX 10.20 utmp/wtmp handling broken?]

Markus Friedl Markus.Friedl at informatik.uni-erlangen.de
Wed Jun 20 23:49:26 EST 2001


On Wed, Jun 20, 2001 at 10:20:51AM +0200, Lutz Jaenicke wrote:
> I am resending the following message about problems with utmp handling.

thanks. your original message was somehow dropped due to
problems with the signal-to-noise ratio.

you can try this patch (against -current).

the patch does a little bit more, but all you
need is this:
+       channel_free_all();
+
        signal(SIGCHLD, SIG_DFL);
        while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
                session_close_by_pid(pid, status);
-       channel_stop_listening();

in serverloop.c and an implementation for channel_free_all().

(some interfaces in channel.c have been changed since 2.9).

Index: channels.c
===================================================================
RCS file: /home/markus/cvs/ssh/channels.c,v
retrieving revision 1.125
diff -u -r1.125 channels.c
--- channels.c	2001/06/07 20:23:04	1.125
+++ channels.c	2001/06/20 13:25:23
@@ -223,11 +223,7 @@
 		channels = xmalloc(channels_alloc * sizeof(Channel *));
 		for (i = 0; i < channels_alloc; i++)
 			channels[i] = NULL;
-		/*
-		 * Kludge: arrange a call to channel_stop_listening if we
-		 * terminate with fatal().
-		 */
-		fatal_add_cleanup((void (*) (void *)) channel_stop_listening, NULL);
+		fatal_add_cleanup((void (*) (void *)) channel_free_all, NULL);
 	}
 	/* Try to find a free slot where to put the new channel. */
 	for (found = -1, i = 0; i < channels_alloc; i++)
@@ -334,38 +330,15 @@
 	xfree(c);
 }
 
-
-/*
- * Stops listening for channels, and removes any unix domain sockets that we
- * might have.
- */
-
 void
-channel_stop_listening()
+channel_free_all(void)
 {
 	int i;
-	Channel *c;
 
-	for (i = 0; i < channels_alloc; i++) {
-		c = channels[i];
-		if (c != NULL) {
-			switch (c->type) {
-			case SSH_CHANNEL_AUTH_SOCKET:
-				close(c->sock);
-				/* auth_sock_cleanup_proc deletes the socket */
-				channel_free(c);
-				break;
-			case SSH_CHANNEL_PORT_LISTENER:
-			case SSH_CHANNEL_RPORT_LISTENER:
-			case SSH_CHANNEL_X11_LISTENER:
-				close(c->sock);
-				channel_free(c);
-				break;
-			default:
-				break;
-			}
-		}
-	}
+	debug("closing all channels");
+	for (i = 0; i < channels_alloc; i++)
+		if (channels[i] != NULL)
+			channel_free(channels[i]);
 }
 
 /*
Index: channels.h
===================================================================
RCS file: /home/markus/cvs/ssh/channels.h,v
retrieving revision 1.38
diff -u -r1.38 channels.h
--- channels.h	2001/06/16 08:50:39	1.38
+++ channels.h	2001/06/20 13:25:24
@@ -150,6 +150,7 @@
 channel_set_fds(int id, int rfd, int wfd, int efd,
     int extusage, int nonblock);
 void    channel_free(Channel *c);
+void    channel_free_all(void);
 
 void	channel_send_open(int id);
 void	channel_request(int id, char *service, int wantconfirm);
@@ -182,8 +183,8 @@
 void    channel_output_poll(void);
 
 int     channel_not_very_much_buffered_data(void);
-void    channel_stop_listening(void);
 void    channel_close_all(void);
+void    channel_free_all(void);
 int     channel_still_open(void);
 char   *channel_open_message(void);
 int	channel_find_open(void);
Index: clientloop.c
===================================================================
RCS file: /home/markus/cvs/ssh/clientloop.c,v
retrieving revision 1.75
diff -u -r1.75 clientloop.c
--- clientloop.c	2001/06/04 23:07:20	1.75
+++ clientloop.c	2001/06/20 13:28:17
@@ -546,7 +546,7 @@
 				leave_raw_mode();
 
 				/* Stop listening for new connections. */
-				channel_stop_listening();
+				channel_close_all();	/* proto1 only XXXX */
 
 				printf("%c& [backgrounded]\n", escape_char);
 
@@ -926,8 +926,7 @@
 	if (have_pty)
 		signal(SIGWINCH, SIG_DFL);
 
-	/* Stop listening for connections. */
-	channel_stop_listening();
+	channel_free_all();
 
 	if (have_pty)
 		leave_raw_mode();
Index: packet.c
===================================================================
RCS file: /home/markus/cvs/ssh/packet.c,v
retrieving revision 1.66
diff -u -r1.66 packet.c
--- packet.c	2001/06/12 16:11:26	1.66
+++ packet.c	2001/06/20 13:25:24
@@ -1085,7 +1085,7 @@
 	packet_write_wait();
 
 	/* Stop listening for connections. */
-	channel_stop_listening();
+	channel_close_all();
 
 	/* Close the connection. */
 	packet_close();
Index: serverloop.c
===================================================================
RCS file: /home/markus/cvs/ssh/serverloop.c,v
retrieving revision 1.68
diff -u -r1.68 serverloop.c
--- serverloop.c	2001/06/04 23:07:20	1.68
+++ serverloop.c	2001/06/20 13:25:24
@@ -608,8 +608,7 @@
 		close(fdin);
 	fdin = -1;
 
-	/* Stop listening for channels; this removes unix domain sockets. */
-	channel_stop_listening();
+	channel_free_all();
 
 	/* We no longer want our SIGCHLD handler to be called. */
 	signal(SIGCHLD, SIG_DFL);
@@ -700,10 +699,11 @@
 	if (writeset)
 		xfree(writeset);
 
+	channel_free_all();
+
 	signal(SIGCHLD, SIG_DFL);
 	while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
 		session_close_by_pid(pid, status);
-	channel_stop_listening();
 }
 
 void



More information about the openssh-unix-dev mailing list