extern int preserve_xattrs;
extern int kluge_around_eof;
extern int daemon_over_rsh;
+extern int munge_symlinks;
extern int sanitize_paths;
extern int numeric_ids;
extern int filesfrom_fd;
extern int logfile_format_has_o_or_i;
extern mode_t orig_umask;
extern char *bind_address;
-extern char *sockopts;
extern char *config_file;
extern char *logfile_format;
extern char *files_from;
char *auth_user;
int read_only = 0;
int module_id = -1;
-int munge_symlinks = 0;
struct chmod_mode_struct *daemon_chmod_modes;
/* module_dirlen is the length of the module_dir string when in daemon
char *name = lp_name(i);
int use_chroot = lp_use_chroot(i);
int ret, pre_exec_fd = -1;
+ int save_munge_symlinks;
pid_t pre_exec_pid = 0;
char *request = NULL;
munge_symlinks = !use_chroot || module_dirlen;
if (munge_symlinks) {
STRUCT_STAT st;
- if (do_stat(SYMLINK_PREFIX, &st) == 0 && S_ISDIR(st.st_mode)) {
- rprintf(FLOG, "Symlink munging is unsupported when a %s directory exists.\n",
- SYMLINK_PREFIX);
+ char prefix[SYMLINK_PREFIX_LEN]; /* NOT +1 ! */
+ strlcpy(prefix, SYMLINK_PREFIX, sizeof prefix); /* trim the trailing slash */
+ if (do_stat(prefix, &st) == 0 && S_ISDIR(st.st_mode)) {
+ rprintf(FLOG, "Symlink munging is unsafe when a %s directory exists.\n",
+ prefix);
io_printf(f_out, "@ERROR: daemon security issue -- contact admin\n", name);
exit_cleanup(RERR_UNSUPPORTED);
}
read_args(f_in, name, line, sizeof line, rl_nulls, &argv, &argc, &request);
orig_argv = argv;
+ save_munge_symlinks = munge_symlinks;
+
reset_output_levels(); /* future verbosity is controlled by client options */
ret = parse_arguments(&argc, (const char ***) &argv);
if (protect_args && ret) {
} else
orig_early_argv = NULL;
+ munge_symlinks = save_munge_symlinks; /* The client mustn't control this. */
+
if (pre_exec_pid) {
err_msg = finish_pre_exec(pre_exec_pid, pre_exec_fd, request,
orig_early_argv, orig_argv);
with "list = False". */
static void send_listing(int fd)
{
- int n = lp_numservices();
+ int n = lp_num_modules();
int i;
for (i = 0; i < n; i++) {
fprintf(stderr, "Failed to parse config file: %s\n", config_file);
exit_cleanup(RERR_SYNTAX);
}
+ set_dparams(0);
if (no_detach)
create_pid_file();