X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4fd842f98df4970f6e49a0365dbed60774e56c09..83d5e90054cd85c5bb2a93ef53d5ae32877e05b1:/rsync.c diff --git a/rsync.c b/rsync.c index 3c802867..1ae33684 100644 --- a/rsync.c +++ b/rsync.c @@ -162,12 +162,12 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, continue; } ndx = NDX_FLIST_OFFSET - ndx; - if (ndx < 0 || ndx >= dir_flist->count) { + if (ndx < 0 || ndx >= dir_flist->used) { ndx = NDX_FLIST_OFFSET - ndx; rprintf(FERROR, "[%s] Invalid dir index: %d (%d - %d)\n", who_am_i(), ndx, NDX_FLIST_OFFSET, - NDX_FLIST_OFFSET - dir_flist->count + 1); + NDX_FLIST_OFFSET - dir_flist->used + 1); exit_cleanup(RERR_PROTOCOL); } @@ -188,7 +188,7 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, /* Honor the old-style keep-alive indicator. */ if (protocol_version < 30 - && ndx == cur_flist->count && iflags == ITEM_IS_NEW) { + && ndx == cur_flist->used && iflags == ITEM_IS_NEW) { if (am_sender) maybe_send_keepalive(); goto read_loop; @@ -198,9 +198,8 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, invalid_ndx: rprintf(FERROR, "Invalid file index: %d (%d - %d) with iflags %x [%s]\n", - ndx, first_flist->ndx_start + first_flist->ndx_start, - first_flist->prev->ndx_start + first_flist->ndx_start - + first_flist->prev->count - 1, iflags, who_am_i()); + ndx, first_flist->ndx_start - 1, first_flist->prev->ndx_end, + iflags, who_am_i()); exit_cleanup(RERR_PROTOCOL); } cur_flist = flist; @@ -220,7 +219,7 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, if (iflags & ITEM_TRANSFER) { int i = ndx - cur_flist->ndx_start; - if (!S_ISREG(cur_flist->files[i]->mode)) { + if (i < 0 || !S_ISREG(cur_flist->files[i]->mode)) { rprintf(FERROR, "received request to transfer non-regular file: %d [%s]\n", ndx, who_am_i()); @@ -495,12 +494,12 @@ struct file_list *flist_for_ndx(int ndx) if (!flist && !(flist = first_flist)) return NULL; - while (ndx < flist->ndx_start) { + while (ndx < flist->ndx_start-1) { if (flist == first_flist) return NULL; flist = flist->prev; } - while (ndx >= flist->ndx_start + flist->count) { + while (ndx > flist->ndx_end) { if (!(flist = flist->next)) return NULL; }