Call seteuid() when calling setuid().
[rsync/rsync.git] / clientserver.c
index b16e0fc..eeaf8e1 100644 (file)
@@ -339,7 +339,7 @@ int start_inband_exchange(int f_in, int f_out, const char *user, int argc, char
 
        if (protocol_version < 23) {
                if (protocol_version == 22 || !am_sender)
-                       io_start_multiplex_in();
+                       io_start_multiplex_in(f_in);
        }
 
        free(modname);
@@ -620,24 +620,24 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
                set_filter_dir(module_dir, module_dirlen);
 
        p = lp_filter(i);
-       parse_rule(&daemon_filter_list, p, FILTRULE_WORD_SPLIT,
+       parse_filter_str(&daemon_filter_list, p, rule_template(FILTRULE_WORD_SPLIT),
                   XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3);
 
        p = lp_include_from(i);
-       parse_filter_file(&daemon_filter_list, p, FILTRULE_INCLUDE,
+       parse_filter_file(&daemon_filter_list, p, rule_template(FILTRULE_INCLUDE),
            XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS);
 
        p = lp_include(i);
-       parse_rule(&daemon_filter_list, p,
-                  FILTRULE_INCLUDE | FILTRULE_WORD_SPLIT,
+       parse_filter_str(&daemon_filter_list, p,
+                  rule_template(FILTRULE_INCLUDE | FILTRULE_WORD_SPLIT),
                   XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES);
 
        p = lp_exclude_from(i);
-       parse_filter_file(&daemon_filter_list, p, 0,
+       parse_filter_file(&daemon_filter_list, p, rule_template(0),
            XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES | XFLG_FATAL_ERRORS);
 
        p = lp_exclude(i);
-       parse_rule(&daemon_filter_list, p, FILTRULE_WORD_SPLIT,
+       parse_filter_str(&daemon_filter_list, p, rule_template(FILTRULE_WORD_SPLIT),
                   XFLG_ABS_IF_SLASH | XFLG_DIR2WILD3 | XFLG_OLD_PREFIXES);
 
        log_init(1);
@@ -801,7 +801,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
        }
 
        if (set_uid) {
-               if (setuid(uid)) {
+               if (setuid(uid) || seteuid(uid)) {
                        rsyserr(FLOG, errno, "setuid %ld failed", (long)uid);
                        io_printf(f_out, "@ERROR: setuid failed\n");
                        return -1;
@@ -885,7 +885,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
 
        if (protocol_version < 23
            && (protocol_version == 22 || am_sender))
-               io_start_multiplex_out();
+               io_start_multiplex_out(f_out);
        else if (!ret || err_msg) {
                /* We have to get I/O multiplexing started so that we can
                 * get the error back to the client.  This means getting
@@ -909,7 +909,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
                        if (files_from)
                                write_byte(f_out, 0);
                }
-               io_start_multiplex_out();
+               io_start_multiplex_out(f_out);
        }
 
        if (!ret || err_msg) {