From: Wayne Davison Date: Thu, 14 Aug 2008 14:40:56 +0000 (-0700) Subject: Changed flist_for_ndx() to optionally die with an error X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/e982d591465013c547ab2371d4818345dac819ff Changed flist_for_ndx() to optionally die with an error if the index isn't found. --- diff --git a/generator.c b/generator.c index 8290e603..f7ebe477 100644 --- a/generator.c +++ b/generator.c @@ -2077,8 +2077,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo) while (1) { #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && (ndx = get_hlink_num()) != -1) { - flist = flist_for_ndx(ndx); - assert(flist != NULL); + flist = flist_for_ndx(ndx, "check_for_finished_files.1"); file = flist->files[ndx - flist->ndx_start]; assert(file->flags & FLAG_HLINKED); finish_hard_link(file, f_name(file, fbuf), ndx, NULL, itemizing, code, -1); @@ -2101,7 +2100,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo) ignore_times++; flist = cur_flist; - cur_flist = flist_for_ndx(ndx); + cur_flist = flist_for_ndx(ndx, "check_for_finished_files.2"); file = cur_flist->files[ndx - cur_flist->ndx_start]; if (solo_file) diff --git a/hlink.c b/hlink.c index fede1537..cdafa9fa 100644 --- a/hlink.c +++ b/hlink.c @@ -36,7 +36,7 @@ extern int stdout_format_has_i; extern int maybe_ATTRS_REPORT; extern int unsort_ndx; extern char *basis_dir[MAX_BASIS_DIRS+1]; -extern struct file_list *cur_flist, *first_flist; +extern struct file_list *cur_flist; #ifdef SUPPORT_HARD_LINKS @@ -132,7 +132,7 @@ static void match_gnums(int32 *ndx_list, int ndx_count) } else if (CVAL(node->data, 0) == 0) { struct file_list *flist; prev = IVAL(node->data, 1); - flist = flist_for_ndx(prev); + flist = flist_for_ndx(prev, NULL); if (flist) flist->files[prev - flist->ndx_start]->flags &= ~FLAG_HLINK_LAST; else { @@ -261,7 +261,7 @@ static char *check_prior(struct file_struct *file, int gnum, while (1) { struct file_list *flist; if (prev_ndx < 0 - || (flist = flist_for_ndx(prev_ndx)) == NULL) + || (flist = flist_for_ndx(prev_ndx, NULL)) == NULL) break; fp = flist->files[prev_ndx - flist->ndx_start]; if (!(fp->flags & FLAG_SKIP_HLINK)) { @@ -504,16 +504,7 @@ void finish_hard_link(struct file_struct *file, const char *fname, int fin_ndx, while ((ndx = prev_ndx) >= 0) { int val; - flist = flist_for_ndx(ndx); - if (flist == NULL) { - int start1 = first_flist ? first_flist->ndx_start : 0; - int start2 = first_flist ? first_flist->prev->ndx_start : 0; - int used = first_flist ? first_flist->prev->used : 0; - rprintf(FERROR, - "File index not found: %d (%d - %d)\n", - ndx, start1 - 1, start2 + used - 1); - exit_cleanup(RERR_PROTOCOL); - } + flist = flist_for_ndx(ndx, "finish_hard_link"); file = flist->files[ndx - flist->ndx_start]; file->flags = (file->flags & ~FLAG_HLINK_FIRST) | FLAG_HLINK_DONE; prev_ndx = F_HL_PREV(file); diff --git a/io.c b/io.c index 2756b148..9f819ee9 100644 --- a/io.c +++ b/io.c @@ -183,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--; diff --git a/rsync.c b/rsync.c index 21f5288f..f26f2121 100644 --- a/rsync.c +++ b/rsync.c @@ -265,8 +265,17 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, check_for_io_err = 0; if (ndx == NDX_DONE) return ndx; - if (!inc_recurse || am_sender) - goto invalid_ndx; + if (!inc_recurse || am_sender) { + int last; + if (first_flist) + last = first_flist->prev->ndx_start + first_flist->prev->used - 1; + else + last = -1; + rprintf(FERROR, + "Invalid file index: %d (%d - %d) [%s]\n", + ndx, NDX_DONE, last, who_am_i()); + exit_cleanup(RERR_PROTOCOL); + } if (ndx == NDX_FLIST_EOF) { flist_eof = 1; send_msg(MSG_FLIST_EOF, "", 0, 0); @@ -276,9 +285,10 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, 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->used + 1); + "Invalid dir index: %d (%d - %d) [%s]\n", + ndx, NDX_FLIST_OFFSET, + NDX_FLIST_OFFSET - dir_flist->used + 1, + who_am_i()); exit_cleanup(RERR_PROTOCOL); } @@ -313,17 +323,7 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr, goto read_loop; } - if (!(flist = flist_for_ndx(ndx))) { - int start, used; - invalid_ndx: - start = first_flist ? first_flist->ndx_start : 0; - used = first_flist ? first_flist->used : 0; - rprintf(FERROR, - "Invalid file index: %d (%d - %d) with iflags %x [%s]\n", - ndx, start - 1, start + used -1, iflags, who_am_i()); - exit_cleanup(RERR_PROTOCOL); - } - cur_flist = flist; + cur_flist = flist_for_ndx(ndx, "read_ndx_and_attrs"); if (iflags & ITEM_BASIS_TYPE_FOLLOWS) fnamecmp_type = read_byte(f_in); @@ -624,23 +624,40 @@ int finish_transfer(const char *fname, const char *fnametmp, return 1; } -struct file_list *flist_for_ndx(int ndx) +struct file_list *flist_for_ndx(int ndx, const char *fatal_error_loc) { struct file_list *flist = cur_flist; if (!flist && !(flist = first_flist)) - return NULL; + goto not_found; while (ndx < flist->ndx_start-1) { if (flist == first_flist) - return NULL; + goto not_found; flist = flist->prev; } while (ndx >= flist->ndx_start + flist->used) { if (!(flist = flist->next)) - return NULL; + goto not_found; } return flist; + + not_found: + if (fatal_error_loc) { + int first, last; + if (first_flist) { + first = first_flist->ndx_start - 1; + last = first_flist->prev->ndx_start + first_flist->prev->used - 1; + } else { + first = 0; + last = -1; + } + rprintf(FERROR, + "File-list index %d not in %d - %d (%s) [%s]\n", + ndx, first, last, fatal_error_loc, who_am_i()); + exit_cleanup(RERR_PROTOCOL); + } + return NULL; } const char *who_am_i(void) diff --git a/sender.c b/sender.c index c8ef7ccd..ba1d6ffa 100644 --- a/sender.c +++ b/sender.c @@ -125,13 +125,7 @@ void successful_send(int ndx) if (!remove_source_files) return; - if (!(flist = flist_for_ndx(ndx))) { - rprintf(FERROR, - "INTERNAL ERROR: unable to find flist for item %d\n", - ndx); - return; - } - + flist = flist_for_ndx(ndx, "successful_send"); file = flist->files[ndx - flist->ndx_start]; if (!change_pathname(file, NULL, 0)) return;