Fixed the check_filter() calls that might be checking an absolute path

in "use chroot = no" mode against a daemon's exclude restriction.
This commit is contained in:
Wayne Davison committed 2007-12-16 14:16:37 -08:00
1 parent eb7715c1eb
commit a10186910d
2 files changed
+26 -19

No files matched your search

+9 -10
View File
@@ -65,6 +65,7 @@ extern int batch_fd;
extern int filesfrom_fd;
extern int connect_timeout;
extern pid_t cleanup_child_pid;
extern unsigned int module_dirlen;
extern struct stats stats;
extern char *filesfrom_host;
extern char *partial_dir;
@@ -332,7 +333,6 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
int i, argc = 0;
char *args[MAX_ARGS];
pid_t ret;
char *dir = NULL;
int dash_l_set = 0;
if (!read_batch && !local_server) {
@@ -508,9 +508,6 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
ret = piped_child(args, f_in_p, f_out_p);
}
if (dir)
free(dir);
return ret;
oom:
@@ -869,7 +866,6 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
int exit_code;
struct file_list *flist;
char *local_name = NULL;
char *dir = NULL;
int save_verbose = verbose;
if (filesfrom_fd >= 0) {
@@ -890,7 +886,7 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
}
if (argc > 0) {
dir = argv[0];
char *dir = argv[0];
argc--;
argv++;
if (!am_daemon && !push_dir(dir, 0)) {
@@ -940,15 +936,18 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
check_alt_basis_dirs();
if (server_filter_list.head) {
char **dir;
char **dir_p;
struct filter_list_struct *elp = &server_filter_list;
for (dir = basis_dir; *dir; dir++) {
if (check_filter(elp, *dir, 1) < 0)
for (dir_p = basis_dir; *dir_p; dir_p++) {
char *dir = *dir_p;
if (*dir == '/')
dir += module_dirlen;
if (check_filter(elp, dir, 1) < 0)
goto options_rejected;
}
if (partial_dir && *partial_dir == '/'
&& check_filter(elp, partial_dir, 1) < 0) {
&& check_filter(elp, partial_dir + module_dirlen, 1) < 0) {
options_rejected:
rprintf(FERROR,
"Your options have been rejected by the server.\n");
+17 -9
View File
@@ -27,6 +27,7 @@
extern int module_id;
extern int sanitize_paths;
extern int daemon_over_rsh;
extern unsigned int module_dirlen;
extern struct filter_list_struct filter_list;
extern struct filter_list_struct server_filter_list;
@@ -1007,13 +1008,14 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
arg = sanitize_path(NULL, arg, NULL, 0);
if (server_filter_list.head) {
int rej;
char *cp = strdup(arg);
char *dir, *cp = strdup(arg);
if (!cp)
out_of_memory("parse_arguments");
if (!*cp)
goto options_rejected;
clean_fname(cp, CFN_COLLAPSE_DOT_DOT_DIRS);
rej = check_filter(&server_filter_list, cp, 0) < 0;
dir = cp + (*cp == '/' ? module_dirlen : 0);
clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
rej = check_filter(&server_filter_list, dir, 0) < 0;
free(cp);
if (rej)
goto options_rejected;
@@ -1406,17 +1408,21 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
if (server_filter_list.head && !am_sender) {
struct filter_list_struct *elp = &server_filter_list;
if (tmpdir) {
char *dir;
if (!*tmpdir)
goto options_rejected;
clean_fname(tmpdir, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(elp, tmpdir, 1) < 0)
dir = tmpdir + (*tmpdir == '/' ? module_dirlen : 0);
clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(elp, dir, 1) < 0)
goto options_rejected;
}
if (backup_dir) {
char *dir;
if (!*backup_dir)
goto options_rejected;
clean_fname(backup_dir, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(elp, backup_dir, 1) < 0)
dir = backup_dir + (*backup_dir == '/' ? module_dirlen : 0);
clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(elp, dir, 1) < 0)
goto options_rejected;
}
}
@@ -1607,10 +1613,12 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
if (sanitize_paths)
files_from = sanitize_path(NULL, files_from, NULL, 0);
if (server_filter_list.head) {
char *dir;
if (!*files_from)
goto options_rejected;
clean_fname(files_from, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(&server_filter_list, files_from, 0) < 0)
dir = files_from + (*files_from == '/' ? module_dirlen : 0);
clean_fname(dir, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(&server_filter_list, dir, 0) < 0)
goto options_rejected;
}
filesfrom_fd = open(files_from, O_RDONLY|O_BINARY);