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);
}
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;
s = receive_sums(f_in);
if (!s) {
- io_error = 1;
+ io_error |= IOERR_GENERAL;
rprintf(FERROR, "receive_sums failed\n");
return;
}
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);
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);