summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2008-08-14 07:32:18 -0700
committerWayne Davison <wayned@samba.org>2008-08-14 07:32:18 -0700
commit9bed85542c5219f000035598cf9d01c16ef0e4a5 (patch)
treed44f5f83d87fbdc920d5a2cef7021d3f2b8329a5
parent5b979530a7483d8c0373697711f03b3bd8050cbe (diff)
downloadrsync-9bed85542c5219f000035598cf9d01c16ef0e4a5.tar.gz
Changed flist_for_ndx() to optionally die with an error
if the index isn't found.
-rw-r--r--generator.c5
-rw-r--r--hlink.c17
-rw-r--r--io.c4
-rw-r--r--rsync.c57
-rw-r--r--sender.c8
5 files changed, 45 insertions, 46 deletions
diff --git a/generator.c b/generator.c
index 86a48155..fdfc8dd1 100644
--- a/generator.c
+++ b/generator.c
@@ -2079,8 +2079,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);
@@ -2103,7 +2102,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 b8ada486..4cff7638 100644
--- a/hlink.c
+++ b/hlink.c
@@ -37,7 +37,7 @@ extern int stdout_format_has_i;
extern int maybe_ATTRS_REPORT;
extern int unsort_ndx;
extern char *basis_dir[];
-extern struct file_list *cur_flist, *first_flist;
+extern struct file_list *cur_flist;
#ifdef SUPPORT_HARD_LINKS
@@ -127,7 +127,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 {
@@ -256,7 +256,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)) {
@@ -478,16 +478,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 b7a1c5cf..8c19141a 100644
--- a/io.c
+++ b/io.c
@@ -184,9 +184,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 a9e655e4..50a50ba0 100644
--- a/rsync.c
+++ b/rsync.c
@@ -266,8 +266,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);
@@ -277,9 +286,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);
}
@@ -312,17 +322,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);
@@ -623,23 +623,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 74d0634b..75b5a2f3 100644
--- a/sender.c
+++ b/sender.c
@@ -127,13 +127,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;