X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4034cb3f71473271e4c5768c4bb3cdb3c8cf6d61..5c6fc4a6a3328d9995377efdc05a90987b96d9a2:/sender.c diff --git a/sender.c b/sender.c index 8b649a8f..a1cd3f41 100644 --- a/sender.c +++ b/sender.c @@ -110,7 +110,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) { int fd = -1; struct sum_struct *s; - struct map_struct *buf = NULL; + struct map_struct *mbuf = NULL; STRUCT_STAT st; char fname[MAXPATHLEN]; int i; @@ -130,7 +130,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) rprintf(FINFO, "send_files starting\n"); while (1) { - int offset = 0; + unsigned int offset; i = read_int(f_in); if (i == -1) { @@ -157,18 +157,14 @@ void send_files(struct file_list *flist, int f_out, int f_in) stats.num_transferred_files++; stats.total_transferred_size += file->length; - fname[0] = 0; if (file->basedir) { - offset = stringjoin(fname, sizeof fname, - file->basedir, "/", NULL); - if (offset >= MAXPATHLEN-1) { - io_error |= IOERR_GENERAL; - rprintf(FERROR, "send_files failed on long-named directory %s\n", - full_fname(fname)); - return; - } - } - f_name_to(file, fname + offset, MAXPATHLEN - offset); + /* N.B. We're sure that this fits, so offset is OK. */ + offset = strlcpy(fname, file->basedir, sizeof fname); + if (!offset || fname[offset-1] != '/') + fname[offset++] = '/'; + } else + offset = 0; + f_name_to(file, fname + offset); if (verbose > 2) rprintf(FINFO, "send_files(%d, %s)\n", i, fname); @@ -221,20 +217,17 @@ void send_files(struct file_list *flist, int f_out, int f_in) return; } - if (st.st_size > 0) { - buf = map_file(fd, st.st_size); - } else { - buf = NULL; - } + mbuf = st.st_size ? map_file(fd, st.st_size) : NULL; - if (verbose > 2) + if (verbose > 2) { rprintf(FINFO, "send_files mapped %s of size %.0f\n", fname, (double)st.st_size); + } write_int(f_out, i); if (write_batch) - write_batch_delta_file((char *)&i, sizeof(i)); + write_batch_delta_file((char *)&i, sizeof i); write_sum_head(f_out, s); } @@ -275,7 +268,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) } } } /* end while */ - read_batch_delta_file( buff, MD4_SUM_LENGTH); + read_batch_delta_file(buff, MD4_SUM_LENGTH); write_buf(f_out, buff, MD4_SUM_LENGTH); } /* j=i */ @@ -285,13 +278,13 @@ void send_files(struct file_list *flist, int f_out, int f_in) continue; } } else { - match_sums(f_out, s, buf, st.st_size); + match_sums(f_out, s, mbuf, st.st_size); log_send(file, &initial_stats); } if (!read_batch) { - if (buf) { - j = unmap_file(buf); + if (mbuf) { + j = unmap_file(mbuf); if (j) { io_error |= IOERR_GENERAL; rprintf(FERROR,