Improved the use of the "remaining" var in readfd_unbuffered() to
authorWayne Davison <wayned@samba.org>
Thu, 12 May 2005 17:36:29 +0000 (17:36 +0000)
committerWayne Davison <wayned@samba.org>
Thu, 12 May 2005 17:36:29 +0000 (17:36 +0000)
make certain that the static value is always set correctly anytime
we call out to another function.

io.c

diff --git a/io.c b/io.c
index 2dd6d41f0eab8aaa3eaab772c17a88539d1de7b8..f8b908e3452f35ff2cae5ac1e5c591c88e8973d8 100644 (file)
--- 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",