- Sync with OpenBSD CVS:
  [clientloop.c login.c serverloop.c ssh-agent.c ssh.h sshconnect.c sshd.c]
  - pid_t
  [session.c]
  - remove bogus chan_read_failed. this could cause data
    corruption (missing data) at end of a SSH2 session.
diff --git a/ChangeLog b/ChangeLog
index a32d029..168e583 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
 20000420
  - Make fixpaths work with perl4, patch from Andre Lucas 
    <andre.lucas@dial.pipex.com>
+ - Sync with OpenBSD CVS:
+  [clientloop.c login.c serverloop.c ssh-agent.c ssh.h sshconnect.c sshd.c]
+  - pid_t
+  [session.c]
+  - remove bogus chan_read_failed. this could cause data
+    corruption (missing data) at end of a SSH2 session.
 
 20000419
  - OpenBSD CVS updates
diff --git a/clientloop.c b/clientloop.c
index cc25ca5..0296dac 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -16,7 +16,7 @@
  */
 
 #include "includes.h"
-RCSID("$Id: clientloop.c,v 1.11 2000/04/16 01:18:41 damien Exp $");
+RCSID("$Id: clientloop.c,v 1.12 2000/04/19 21:42:21 damien Exp $");
 
 #include "xmalloc.h"
 #include "ssh.h"
@@ -471,7 +471,8 @@
 void
 client_process_input(fd_set * readset)
 {
-	int len, pid;
+	int len;
+	pid_t pid;
 	char buf[8192], *s;
 
 	/* Read input from stdin. */
diff --git a/login.c b/login.c
index b4a8baf..de2c89c 100644
--- a/login.c
+++ b/login.c
@@ -18,7 +18,7 @@
  */
 
 #include "includes.h"
-RCSID("$Id: login.c,v 1.23 2000/04/16 01:18:43 damien Exp $");
+RCSID("$Id: login.c,v 1.24 2000/04/19 21:42:22 damien Exp $");
 
 #if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
 # include <utmpx.h>
@@ -136,7 +136,7 @@
  */
 
 void
-record_login(int pid, const char *ttyname, const char *user, uid_t uid,
+record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
 	     const char *host, struct sockaddr * addr)
 {
 #if defined(_PATH_LASTLOG) && !defined(DISABLE_LASTLOG)
@@ -274,7 +274,7 @@
 /* Records that the user has logged out. */
 
 void
-record_logout(int pid, const char *ttyname)
+record_logout(pid_t pid, const char *ttyname)
 {
 #ifdef HAVE_LIBUTIL_LOGIN
 	const char *line = ttyname + 5;	/* /dev/ttyq8 -> ttyq8 */
diff --git a/serverloop.c b/serverloop.c
index a7abbe4..1a76b8d 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -52,7 +52,7 @@
  * that the child's output gets a chance to drain before it is yanked.
  */
 
-static int child_pid;			/* Pid of the child. */
+static pid_t child_pid;			/* Pid of the child. */
 static volatile int child_terminated;	/* The child has terminated. */
 static volatile int child_has_selected; /* Child has had chance to drain. */
 static volatile int child_wait_status;	/* Status from wait(). */
@@ -63,7 +63,8 @@
 sigchld_handler(int sig)
 {
 	int save_errno = errno;
-	int wait_pid;
+	pid_t wait_pid;
+
 	debug("Received SIGCHLD.");
 	wait_pid = wait((int *) &child_wait_status);
 	if (wait_pid != -1) {
@@ -373,9 +374,10 @@
  * child program).
  */
 void
-server_loop(int pid, int fdin_arg, int fdout_arg, int fderr_arg)
+server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg)
 {
-	int wait_status, wait_pid;	/* Status and pid returned by wait(). */
+	int wait_status;	/* Status returned by wait(). */
+	pid_t wait_pid;		/* pid returned by wait(). */
 	int waiting_termination = 0;	/* Have displayed waiting close message. */
 	unsigned int max_time_milliseconds;
 	unsigned int previous_stdout_buffer_bytes;
diff --git a/session.c b/session.c
index 24bc25c..840a4e9 100644
--- a/session.c
+++ b/session.c
@@ -8,7 +8,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: session.c,v 1.4 2000/04/14 10:30:33 markus Exp $");
+RCSID("$OpenBSD: session.c,v 1.5 2000/04/19 09:24:39 markus Exp $");
 
 #include "xmalloc.h"
 #include "ssh.h"
@@ -1388,8 +1388,12 @@
 	/* disconnect channel */
 	debug("session_exit_message: release channel %d", s->chanid);
 	channel_cancel_cleanup(s->chanid);
-	if (c->istate == CHAN_INPUT_OPEN)
-		chan_read_failed(c);
+	/*
+	 * emulate a write failure with 'chan_write_failed', nobody will be
+	 * interested in data we write.
+	 * Note that we must not call 'chan_read_failed', since there could
+	 * be some more data waiting in the pipe.
+	 */
 	chan_write_failed(c);
 	s->chanid = -1;
 }
diff --git a/ssh-agent.c b/ssh-agent.c
index fac2a2c..5a265e6 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: ssh-agent.c,v 1.28 2000/04/14 10:30:33 markus Exp $	*/
+/*	$OpenBSD: ssh-agent.c,v 1.29 2000/04/19 07:05:49 deraadt Exp $	*/
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -9,7 +9,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: ssh-agent.c,v 1.28 2000/04/14 10:30:33 markus Exp $");
+RCSID("$OpenBSD: ssh-agent.c,v 1.29 2000/04/19 07:05:49 deraadt Exp $");
 
 #include "ssh.h"
 #include "rsa.h"
@@ -46,7 +46,7 @@
 int max_fd = 0;
 
 /* pid of shell == parent of agent */
-int parent_pid = -1;
+pid_t parent_pid = -1;
 
 /* pathname and directory for AUTH_SOCKET */
 char socket_name[1024];
@@ -464,7 +464,7 @@
 void
 check_parent_exists(int sig)
 {
-	if (kill(parent_pid, 0) < 0) {
+	if (parent_pid != -1 && kill(parent_pid, 0) < 0) {
 		/* printf("Parent has died - Authentication agent exiting.\n"); */
 		exit(1);
 	}
@@ -550,6 +550,7 @@
 		}
 		pid = atoi(pidstr);
 		if (pid < 1) {	/* XXX PID_MAX check too */
+		/* Yes, PID_MAX check please */
 			fprintf(stderr, "%s=\"%s\", which is not a good PID\n",
 				SSH_AGENTPID_ENV_NAME, pidstr);
 			exit(1);
diff --git a/ssh.h b/ssh.h
index 57fcf57..7bc0c56 100644
--- a/ssh.h
+++ b/ssh.h
@@ -13,7 +13,7 @@
  *
  */
 
-/* RCSID("$Id: ssh.h,v 1.32 2000/04/16 01:18:47 damien Exp $"); */
+/* RCSID("$Id: ssh.h,v 1.33 2000/04/19 21:42:22 damien Exp $"); */
 
 #ifndef SSH_H
 #define SSH_H
@@ -288,14 +288,14 @@
  * by login(1).
  */
 void
-record_login(int pid, const char *ttyname, const char *user, uid_t uid,
+record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
     const char *host, struct sockaddr *addr);
 
 /*
  * Records that the user has logged out.  This does many thigs normally done
  * by login(1) or init.
  */
-void    record_logout(int pid, const char *ttyname);
+void    record_logout(pid_t pid, const char *ttyname);
 
 /*------------ definitions for sshconnect.c ----------*/
 
@@ -504,7 +504,7 @@
  * (of the child program), and reads from stdout and stderr (of the child
  * program).
  */
-void    server_loop(int pid, int fdin, int fdout, int fderr);
+void    server_loop(pid_t pid, int fdin, int fdout, int fderr);
 void    server_loop2(void);
 
 /* Client side main loop for the interactive session. */
diff --git a/sshconnect.c b/sshconnect.c
index 3c5c990..f58289e 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -10,7 +10,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: sshconnect.c,v 1.68 2000/04/14 10:30:33 markus Exp $");
+RCSID("$OpenBSD: sshconnect.c,v 1.69 2000/04/19 07:05:50 deraadt Exp $");
 
 #include <openssl/bn.h>
 #include "xmalloc.h"
@@ -62,7 +62,7 @@
 	const char *cp;
 	char *command_string;
 	int pin[2], pout[2];
-	int pid;
+	pid_t pid;
 	char strport[NI_MAXSERV];
 
 	/* Convert the port number into a string. */
diff --git a/sshd.c b/sshd.c
index 3b75b88..c1dcdd8 100644
--- a/sshd.c
+++ b/sshd.c
@@ -14,7 +14,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: sshd.c,v 1.106 2000/04/17 12:31:47 markus Exp $");
+RCSID("$OpenBSD: sshd.c,v 1.107 2000/04/19 07:05:50 deraadt Exp $");
 
 #include "xmalloc.h"
 #include "rsa.h"
@@ -396,7 +396,8 @@
 {
 	extern char *optarg;
 	extern int optind;
-	int opt, sock_in = 0, sock_out = 0, newsock, i, fdsetsz, pid, on = 1;
+	int opt, sock_in = 0, sock_out = 0, newsock, i, fdsetsz, on = 1;
+	pid_t pid;
 	socklen_t fromlen;
 	int silentrsa = 0;
 	fd_set *fdset;