X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0f78b81511be65d8fe21af1e6ac674f9e80ac29d..bdac7621eea8aaf7330174f787f68c67215ed026:/main.c diff --git a/main.c b/main.c index 1237447d..f5b9312a 100644 --- a/main.c +++ b/main.c @@ -16,9 +16,9 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "rsync.h" @@ -49,6 +49,9 @@ extern int preserve_hard_links; extern int protocol_version; extern int recurse; extern int relative_paths; +extern int sanitize_paths; +extern int curr_dir_depth; +extern int module_id; extern int rsync_port; extern int whole_file; extern int read_batch; @@ -59,6 +62,7 @@ extern int filesfrom_fd; extern pid_t cleanup_child_pid; extern struct stats stats; extern char *filesfrom_host; +extern char *basis_dir[]; extern char *rsync_path; extern char *shell_cmd; extern char *batch_name; @@ -467,7 +471,7 @@ static char *get_local_name(struct file_list *flist, char *dest_path) * it and use mode 1. If there is something other than a directory * at the destination path, we must be transferring one file * (anything at the destination will be overwritten). */ - if (do_stat(dest_path, &st) == 0) { + if (safe_stat(dest_path, &st) == 0) { if (S_ISDIR(st.st_mode)) { if (!push_dir(dest_path)) { rsyserr(FERROR, errno, "push_dir#1 %s failed", @@ -785,6 +789,14 @@ static void do_server_recv(int f_in, int f_out, int argc,char *argv[]) if (argc > 0) local_name = get_local_name(flist,argv[0]); + /* Now that we know what our destination directory turned out to be, + * we can sanitize the --link-/copy-/compare-dest args correctly. */ + if (sanitize_paths) { + char **dir; + for (dir = basis_dir; *dir; dir++) + *dir = sanitize_path(NULL, *dir, NULL, curr_dir_depth, NULL); + } + exit_code = do_recv(f_in,f_out,flist,local_name); exit_cleanup(exit_code); }