From f2a4853c93136bfa282cff767873064db3ebb28c Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Thu, 12 May 2005 17:36:29 +0000 Subject: [PATCH] Improved the use of the "remaining" var in readfd_unbuffered() to make certain that the static value is always set correctly anytime we call out to another function. --- io.c | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/io.c b/io.c index 2dd6d41f..f8b908e3 100644 --- a/io.c +++ b/io.c @@ -712,6 +712,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) { static size_t remaining; static size_t iobuf_in_ndx; + size_t msg_bytes; int tag, ret = 0; #if MAXPATHLEN < 4096 char line[4096+1024]; @@ -740,56 +741,52 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) read_loop(fd, line, 4); tag = IVAL(line, 0); - remaining = tag & 0xFFFFFF; + msg_bytes = tag & 0xFFFFFF; tag = (tag >> 24) - MPLEX_BASE; switch (tag) { case MSG_DATA: - if (remaining > iobuf_in_siz) { + if (msg_bytes > iobuf_in_siz) { if (!(iobuf_in = realloc_array(iobuf_in, char, - remaining))) + msg_bytes))) out_of_memory("readfd_unbuffered"); - iobuf_in_siz = remaining; + iobuf_in_siz = msg_bytes; } - read_loop(fd, iobuf_in, remaining); + read_loop(fd, iobuf_in, msg_bytes); + remaining = msg_bytes; iobuf_in_ndx = 0; break; case MSG_DELETED: - if (remaining >= sizeof line) { - rprintf(FERROR, "invalid multi-message %d:%ld\n", - tag, (long)remaining); - exit_cleanup(RERR_STREAMIO); - } - read_loop(fd, line, remaining); - line[remaining] = '\0'; + if (msg_bytes >= sizeof line) + goto overflow; + read_loop(fd, line, msg_bytes); + line[msg_bytes] = '\0'; /* A directory name was sent with the trailing null */ - if (remaining > 0 && !line[remaining-1]) + if (msg_bytes > 0 && !line[msg_bytes-1]) log_delete(line, S_IFDIR); else log_delete(line, S_IFREG); - remaining = 0; break; case MSG_SUCCESS: - if (remaining != 4) { + if (msg_bytes != 4) { rprintf(FERROR, "invalid multi-message %d:%ld [%s]\n", - tag, (long)remaining, who_am_i()); + tag, (long)msg_bytes, who_am_i()); exit_cleanup(RERR_STREAMIO); } - read_loop(fd, line, remaining); + read_loop(fd, line, msg_bytes); successful_send(IVAL(line, 0)); - remaining = 0; break; case MSG_INFO: case MSG_ERROR: - if (remaining >= sizeof line) { + if (msg_bytes >= sizeof line) { + overflow: rprintf(FERROR, "multiplexing overflow %d:%ld [%s]\n", - tag, (long)remaining, who_am_i()); + tag, (long)msg_bytes, who_am_i()); exit_cleanup(RERR_STREAMIO); } - read_loop(fd, line, remaining); - rwrite((enum logcode)tag, line, remaining); - remaining = 0; + read_loop(fd, line, msg_bytes); + rwrite((enum logcode)tag, line, msg_bytes); break; default: rprintf(FERROR, "unexpected tag %d [%s]\n", -- 2.34.1