Make the !flist_eof assumption explicit before the check_for_io_err
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index 6068575..9f819ee 100644 (file)
--- a/io.c
+++ b/io.c
@@ -63,6 +63,7 @@ int allowed_lull = 0;
 int ignore_timeout = 0;
 int batch_fd = -1;
 int msgdone_cnt = 0;
+int check_for_io_err = 0;
 
 /* Ignore an EOF error if non-zero. See whine_about_eof(). */
 int kluge_around_eof = 0;
@@ -182,9 +183,7 @@ static int flist_ndx_pop(struct flist_ndx_list *lp)
 static void got_flist_entry_status(enum festatus status, const char *buf)
 {
        int ndx = IVAL(buf, 0);
-       struct file_list *flist = flist_for_ndx(ndx);
-
-       assert(flist != NULL);
+       struct file_list *flist = flist_for_ndx(ndx, "got_flist_entry_status");
 
        if (remove_source_files) {
                active_filecnt--;
@@ -379,6 +378,8 @@ static void read_msg_fd(void)
        len = tag & 0xFFFFFF;
        tag = (tag >> 24) - MPLEX_BASE;
 
+       check_for_io_err = 0;
+
        switch (tag) {
        case MSG_DONE:
                if (len < 0 || len > 1 || !am_generator) {
@@ -413,6 +414,9 @@ static void read_msg_fd(void)
                }
                flist = recv_file_list(fd);
                flist->parent_ndx = IVAL(buf,0);
+               /* If the sender is going to send us an MSG_IO_ERROR value, it
+                * will always be the very next message following MSG_FLIST. */
+               check_for_io_err = 1;
 #ifdef SUPPORT_HARD_LINKS
                if (preserve_hard_links)
                        match_hard_links(flist);
@@ -448,6 +452,7 @@ static void read_msg_fd(void)
                got_flist_entry_status(FES_NO_SEND, buf);
                break;
        case MSG_ERROR_SOCKET:
+       case MSG_ERROR_UTF8:
        case MSG_CLIENT:
                if (!am_generator)
                        goto invalid_msg;
@@ -1060,6 +1065,8 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
                msg_bytes = tag & 0xFFFFFF;
                tag = (tag >> 24) - MPLEX_BASE;
 
+               check_for_io_err = 0;
+
                switch (tag) {
                case MSG_DATA:
                        if (msg_bytes > iobuf_in_siz) {