Jan F d1fc5c
diff -up openssh-5.8p1/packet.c.audit4a openssh-5.8p1/packet.c
Jan F d1fc5c
--- openssh-5.8p1/packet.c.audit4a	2011-03-08 08:52:12.000000000 +0100
Jan F d1fc5c
+++ openssh-5.8p1/packet.c	2011-03-08 08:52:39.000000000 +0100
Jan F d1fc5c
@@ -473,6 +473,13 @@ packet_get_connection_out(void)
Jan F d1fc5c
 	return active_state->connection_out;
Jan F d1fc5c
 }
Jan F d1fc5c
 
Jan F d1fc5c
+static int
Jan F d1fc5c
+packet_state_has_keys (const struct session_state *state)
Jan F d1fc5c
+{
Jan F d1fc5c
+	return state != NULL &&
Jan F d1fc5c
+		(state->newkeys[MODE_IN] != NULL || state->newkeys[MODE_OUT] != NULL);
Jan F d1fc5c
+}
Jan F d1fc5c
+
Jan F d1fc5c
 /* Closes the connection and clears and frees internal data structures. */
Jan F d1fc5c
 
Jan F d1fc5c
 void
Jan F d1fc5c
@@ -481,13 +488,6 @@ packet_close(void)
Jan F d1fc5c
 	if (!active_state->initialized)
Jan F d1fc5c
 		return;
Jan F d1fc5c
 	active_state->initialized = 0;
Jan F d1fc5c
-	if (active_state->connection_in == active_state->connection_out) {
Jan F d1fc5c
-		shutdown(active_state->connection_out, SHUT_RDWR);
Jan F d1fc5c
-		close(active_state->connection_out);
Jan F d1fc5c
-	} else {
Jan F d1fc5c
-		close(active_state->connection_in);
Jan F d1fc5c
-		close(active_state->connection_out);
Jan F d1fc5c
-	}
Jan F d1fc5c
 	buffer_free(&active_state->input);
Jan F d1fc5c
 	buffer_free(&active_state->output);
Jan F d1fc5c
 	buffer_free(&active_state->outgoing_packet);
Jan F d1fc5c
@@ -496,9 +496,18 @@ packet_close(void)
Jan F d1fc5c
 		buffer_free(&active_state->compression_buffer);
Jan F d1fc5c
 		buffer_compress_uninit();
Jan F d1fc5c
 	}
Jan F d1fc5c
-	cipher_cleanup(&active_state->send_context);
Jan F d1fc5c
-	cipher_cleanup(&active_state->receive_context);
Jan F d1fc5c
-	audit_session_key_free(2);
Jan F d1fc5c
+	if (packet_state_has_keys(active_state)) {
Jan F d1fc5c
+		cipher_cleanup(&active_state->send_context);
Jan F d1fc5c
+		cipher_cleanup(&active_state->receive_context);
Jan F d1fc5c
+		audit_session_key_free(2);
Jan F d1fc5c
+	}
Jan F d1fc5c
+	if (active_state->connection_in == active_state->connection_out) {
Jan F d1fc5c
+		shutdown(active_state->connection_out, SHUT_RDWR);
Jan F d1fc5c
+		close(active_state->connection_out);
Jan F d1fc5c
+	} else {
Jan F d1fc5c
+		close(active_state->connection_in);
Jan F d1fc5c
+		close(active_state->connection_out);
Jan F d1fc5c
+	}
Jan F d1fc5c
 }
Jan F d1fc5c
 
Jan F d1fc5c
 /* Sets remote side protocol flags. */
Jan F d1fc5c
@@ -1945,13 +1954,6 @@ packet_destroy_state(struct session_stat
Jan F d1fc5c
 //	memset(state, 0, sizeof(state));
Jan F d1fc5c
 }
Jan F d1fc5c
 
Jan F d1fc5c
-static int
Jan F d1fc5c
-packet_state_has_keys (const struct session_state *state)
Jan F d1fc5c
-{
Jan F d1fc5c
-	return state != NULL &&
Jan F d1fc5c
-		(state->newkeys[MODE_IN] != NULL || state->newkeys[MODE_OUT] != NULL);
Jan F d1fc5c
-}
Jan F d1fc5c
-
Jan F d1fc5c
 void
Jan F d1fc5c
 packet_destroy_all(int audit_it, int privsep)
Jan F d1fc5c
 {
Jan F d1fc5c
diff -up openssh-5.8p1/sshd.c.audit4a openssh-5.8p1/sshd.c
Jan F d1fc5c
--- openssh-5.8p1/sshd.c.audit4a	2011-03-08 08:53:02.000000000 +0100
Jan F d1fc5c
+++ openssh-5.8p1/sshd.c	2011-03-08 08:55:23.000000000 +0100
Jan F d1fc5c
@@ -2033,7 +2033,7 @@ main(int ac, char **av)
Jan F d1fc5c
 	do_authenticated(authctxt);
Jan F d1fc5c
 
Jan F d1fc5c
 	/* The connection has been terminated. */
Jan F d1fc5c
-	packet_destroy_all(1, 0);
Jan F d1fc5c
+	packet_destroy_all(1, 1);
Jan F d1fc5c
 
Jan F d1fc5c
 	packet_get_state(MODE_IN, NULL, NULL, NULL, &ibytes);
Jan F d1fc5c
 	packet_get_state(MODE_OUT, NULL, NULL, NULL, &obytes);