X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/245fbb5129975a8b6550d14123bd0bdc40f3f63b..f0359dd00d60d72c4b3dec85de8e490692f6015c:/flist.c diff --git a/flist.c b/flist.c index c6e0006c..f12bf893 100644 --- a/flist.c +++ b/flist.c @@ -23,8 +23,6 @@ extern struct stats stats; -extern int csum_length; - extern int verbose; extern int am_server; extern int always_checksum; @@ -47,6 +45,7 @@ extern int copy_links; extern int copy_unsafe_links; extern int remote_version; extern int io_error; +extern int sanitize_paths; static char topsrcname[MAXPATHLEN]; @@ -254,7 +253,11 @@ static void send_file_entry(struct file_struct *file,int f,unsigned base_flags) #endif if (always_checksum) { - write_buf(f,file->sum,csum_length); + if (remote_version < 21) { + write_buf(f,file->sum,2); + } else { + write_buf(f,file->sum,MD4_SUM_LENGTH); + } } last_mode = file->mode; @@ -296,7 +299,11 @@ static void receive_file_entry(struct file_struct **fptr, memset((char *)file, 0, sizeof(*file)); (*fptr) = file; - if (l2 >= MAXPATHLEN-l1) overflow("receive_file_entry"); + if (l2 >= MAXPATHLEN-l1) { + rprintf(FERROR,"overflow: flags=0x%x l1=%d l2=%d lastname=%s\n", + flags, l1, l2, lastname); + overflow("receive_file_entry"); + } strlcpy(thisname,lastname,l1+1); read_sbuf(f,&thisname[l1],l2); @@ -307,6 +314,10 @@ static void receive_file_entry(struct file_struct **fptr, clean_fname(thisname); + if (sanitize_paths) { + sanitize_path(thisname, NULL); + } + if ((p = strrchr(thisname,'/'))) { static char *lastdir; *p = 0; @@ -341,6 +352,9 @@ static void receive_file_entry(struct file_struct **fptr, file->link = (char *)malloc(l+1); if (!file->link) out_of_memory("receive_file_entry 2"); read_sbuf(f,file->link,l); + if (sanitize_paths) { + sanitize_path(file->link, file->dirname); + } } #if SUPPORT_HARD_LINKS @@ -353,7 +367,11 @@ static void receive_file_entry(struct file_struct **fptr, if (always_checksum) { file->sum = (char *)malloc(MD4_SUM_LENGTH); if (!file->sum) out_of_memory("md4 sum"); - read_buf(f,file->sum,csum_length); + if (remote_version < 21) { + read_buf(f,file->sum,2); + } else { + read_buf(f,file->sum,MD4_SUM_LENGTH); + } } last_mode = file->mode; @@ -395,7 +413,8 @@ static int skip_filesystem(char *fname, STRUCT_STAT *st) return (st2.st_dev != filesystem_dev); } -static struct file_struct *make_file(int f, char *fname) +/* create a file_struct for a named file */ +struct file_struct *make_file(int f, char *fname) { struct file_struct *file; STRUCT_STAT st; @@ -408,13 +427,16 @@ static struct file_struct *make_file(int f, char *fname) strlcpy(cleaned_name, fname, MAXPATHLEN); cleaned_name[MAXPATHLEN-1] = 0; clean_fname(cleaned_name); + if (sanitize_paths) { + sanitize_path(cleaned_name, NULL); + } fname = cleaned_name; memset(sum,0,SUM_LENGTH); if (readlink_stat(fname,&st,linkbuf) != 0) { io_error = 1; - rprintf(FERROR,"%s: %s\n", + rprintf(FERROR,"readlink %s: %s\n", fname,strerror(errno)); return NULL; } @@ -651,8 +673,10 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) } if (link_stat(fname,&st) != 0) { - io_error=1; - rprintf(FERROR,"%s : %s\n",fname,strerror(errno)); + if (f != -1) { + io_error=1; + rprintf(FERROR,"link_stat %s : %s\n",fname,strerror(errno)); + } continue; } @@ -720,8 +744,7 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) if (one_file_system) set_filesystem(fname); - if (!recurse || !send_included_file_names(f,flist)) - send_file_name(f,flist,fname,recurse,FLAG_DELETE); + send_file_name(f,flist,fname,recurse,FLAG_DELETE); if (olddir != NULL) { flist_dir = NULL; @@ -752,7 +775,8 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) /* if protocol version is >= 17 then send the io_error flag */ if (f != -1 && remote_version >= 17) { - write_int(f, io_error); + extern int module_id; + write_int(f, lp_ignore_errors(module_id)? 0 : io_error); } if (f != -1) { @@ -837,7 +861,13 @@ struct file_list *recv_file_list(int f) /* if protocol version is >= 17 then recv the io_error flag */ if (f != -1 && remote_version >= 17) { - io_error |= read_int(f); + extern int module_id; + extern int ignore_errors; + if (lp_ignore_errors(module_id) || ignore_errors) { + read_int(f); + } else { + io_error |= read_int(f); + } } if (list_only) { @@ -899,7 +929,7 @@ int flist_find(struct file_list *flist,struct file_struct *f) /* * free up one file */ -static void free_file(struct file_struct *file) +void free_file(struct file_struct *file) { if (!file) return; if (file->basename) free(file->basename); @@ -976,12 +1006,12 @@ static void clean_flist(struct file_list *flist, int strip_root) if (verbose <= 3) return; for (i=0;icount;i++) { - rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%d\n", + rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%.0f\n", getpid(), i, NS(flist->files[i]->dirname), NS(flist->files[i]->basename), flist->files[i]->mode, - (int)flist->files[i]->length); + (double)flist->files[i]->length); } }