X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f855a7d01ab8401a307bb02cdcdee546df3e2423..66203a982b3d249bafda9b9272c4c103c19e4a9b:/flist.c diff --git a/flist.c b/flist.c index b8b4c666..14fa5a3f 100644 --- a/flist.c +++ b/flist.c @@ -45,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]; @@ -309,6 +310,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; @@ -343,6 +348,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 @@ -401,7 +409,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; @@ -414,6 +423,9 @@ 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); @@ -726,8 +738,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; @@ -758,7 +769,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) { @@ -843,7 +855,12 @@ 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; + if (lp_ignore_errors(module_id)) { + read_int(f); + } else { + io_error |= read_int(f); + } } if (list_only) { @@ -905,7 +922,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); @@ -982,12 +999,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); } }