summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-05-30 02:02:23 +0000
committerAndrew Tridgell <tridge@samba.org>1998-05-30 02:02:23 +0000
commite44f9a12c4c6d560f00d6e3521dca27e1d1e422a (patch)
treea2fabdd8fcd142f9d5ca718fb1b6cce1d097f5df /io.c
parent5243c216d6db4c728c7bf0ad7ab769c9bb6a728b (diff)
downloadrsync-e44f9a12c4c6d560f00d6e3521dca27e1d1e422a.tar.gz
make sure that io_flush() doesn't call writefd_unbuffered from within
a writefd_unbuffered call! this should fix the "decompressor lost sync" bug
Diffstat (limited to 'io.c')
-rw-r--r--io.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/io.c b/io.c
index 85ff7424..a88d76af 100644
--- a/io.c
+++ b/io.c
@@ -79,6 +79,7 @@ static char *read_buffer;
static char *read_buffer_p;
static int read_buffer_len;
static int read_buffer_size;
+static int no_flush;
/* read from a socket with IO timeout. return the number of
bytes read. If no bytes can be read then exit, never return
@@ -325,6 +326,8 @@ static void writefd_unbuffered(int fd,char *buf,int len)
struct timeval tv;
int reading;
+ no_flush++;
+
reading = (buffer_f_in != -1 && read_buffer_len < MAX_READ_BUFFER);
while (total < len) {
@@ -374,6 +377,8 @@ static void writefd_unbuffered(int fd,char *buf,int len)
read_check(buffer_f_in);
}
}
+
+ no_flush--;
}
@@ -395,7 +400,7 @@ void io_start_buffering(int fd)
void io_flush(void)
{
int fd = multiplex_out_fd;
- if (!io_buffer_count) return;
+ if (!io_buffer_count || no_flush) return;
if (io_multiplexing_out) {
SIVAL(io_buffer-4, 0, (MPLEX_BASE<<24) + io_buffer_count);