From 7343814ee7e0d5a1900d2effb08e8652c403e7c2 Mon Sep 17 00:00:00 2001 From: djm Date: Sun, 16 Jan 2011 12:16:53 +0000 Subject: - djm@cvs.openbsd.org 2011/01/16 11:50:05 [clientloop.c] Use atomicio when flushing protocol 1 std{out,err} buffers at session close. This was a latent bug exposed by setting a SIGCHLD handler and spotted by kevin.brott AT gmail.com; ok dtucker@ --- ChangeLog | 6 ++++++ clientloop.c | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1266e998..7012e620 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,12 @@ 20110116 - (dtucker) [Makefile.in configure.ac regress/kextype.sh] Skip sha256-based on configurations that don't have it. + - OpenBSD CVS Sync + - djm@cvs.openbsd.org 2011/01/16 11:50:05 + [clientloop.c] + Use atomicio when flushing protocol 1 std{out,err} buffers at + session close. This was a latent bug exposed by setting a SIGCHLD + handler and spotted by kevin.brott AT gmail.com; ok dtucker@ 20110114 - OpenBSD CVS Sync diff --git a/clientloop.c b/clientloop.c index c60b758c..325657ba 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.229 2011/01/11 06:13:10 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.230 2011/01/16 11:50:05 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1591,9 +1591,9 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) /* Output any buffered data for stdout. */ while (buffer_len(&stdout_buffer) > 0) { - len = write(fileno(stdout), buffer_ptr(&stdout_buffer), - buffer_len(&stdout_buffer)); - if (len <= 0) { + len = atomicio(vwrite, fileno(stdout), + buffer_ptr(&stdout_buffer), buffer_len(&stdout_buffer)); + if (len != buffer_len(&stdout_buffer)) { error("Write failed flushing stdout buffer."); break; } @@ -1602,9 +1602,9 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) /* Output any buffered data for stderr. */ while (buffer_len(&stderr_buffer) > 0) { - len = write(fileno(stderr), buffer_ptr(&stderr_buffer), - buffer_len(&stderr_buffer)); - if (len <= 0) { + len = atomicio(vwrite, fileno(stderr), + buffer_ptr(&stderr_buffer), buffer_len(&stderr_buffer)); + if (len != buffer_len(&stderr_buffer)) { error("Write failed flushing stderr buffer."); break; } -- cgit v1.2.1