Quiet a compiler warning.
[rsync/rsync.git] / sender.c
index a9c31bb..22d67ab 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -42,10 +42,16 @@ void read_sum_head(int f, struct sum_struct *sum)
 
        sum->count = read_int(f);
        sum->blength = read_int(f);
-       if (protocol_version < 27)
+       if (protocol_version < 27) {
                sum->s2length = csum_length;
-       else
+       } else {
                sum->s2length = read_int(f);
+               if (sum->s2length > MD4_SUM_LENGTH) {
+                       rprintf(FERROR, "Invalid checksum length %ld\n",
+                           (long)sum->s2length);
+                       exit_cleanup(RERR_PROTOCOL);
+               }
+       }
        sum->remainder = read_int(f);
 }
 
@@ -156,7 +162,7 @@ void send_files(struct file_list *flist, int f_out, int f_in)
                if (file->basedir) {
                        strlcpy(fname, file->basedir, MAXPATHLEN);
                        if (strlen(fname) == MAXPATHLEN-1) {
-                               io_error = 1;
+                               io_error |= IOERR_GENERAL;
                                rprintf(FERROR, "send_files failed on long-named directory %s\n",
                                        full_fname(fname));
                                return;
@@ -181,7 +187,7 @@ void send_files(struct file_list *flist, int f_out, int f_in)
 
                s = receive_sums(f_in);
                if (!s) {
-                       io_error = 1;
+                       io_error |= IOERR_GENERAL;
                        rprintf(FERROR, "receive_sums failed\n");
                        return;
                }
@@ -192,16 +198,22 @@ void send_files(struct file_list *flist, int f_out, int f_in)
                if (!read_batch) {
                        fd = do_open(fname, O_RDONLY, 0);
                        if (fd == -1) {
-                               io_error = 1;
-                               rprintf(FERROR, "send_files failed to open %s: %s\n",
-                                       full_fname(fname), strerror(errno));
+                               if (errno == ENOENT) {
+                                       io_error |= IOERR_VANISHED;
+                                       rprintf(FINFO, "file has vanished: %s\n",
+                                               full_fname(fname));
+                               } else {
+                                       io_error |= IOERR_GENERAL;
+                                       rprintf(FERROR, "send_files failed to open %s: %s\n",
+                                               full_fname(fname), strerror(errno));
+                               }
                                free_sums(s);
                                continue;
                        }
 
                        /* map the local file */
                        if (do_fstat(fd, &st) != 0) {
-                               io_error = 1;
+                               io_error |= IOERR_GENERAL;
                                rprintf(FERROR, "fstat failed: %s\n", strerror(errno));
                                free_sums(s);
                                close(fd);
@@ -280,12 +292,10 @@ void send_files(struct file_list *flist, int f_out, int f_in)
                        if (buf) {
                                j = unmap_file(buf);
                                if (j) {
-                                       io_error = 1;
+                                       io_error |= IOERR_GENERAL;
                                        rprintf(FERROR,
                                            "read errors mapping %s: (%d) %s\n",
-                                           full_fname(fname),
-                                           j,
-                                           strerror(j));
+                                           full_fname(fname), j, strerror(j));
                                }
                        }
                        close(fd);