X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/26e21efc5a7e87b2aa1bdb6d64a74a30c699c085..7a498f5b6c49690344a288059434e8886937a80f:/clientserver.c diff --git a/clientserver.c b/clientserver.c index b891d79a..059be75d 100644 --- a/clientserver.c +++ b/clientserver.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998-2001 Andrew Tridgell * Copyright (C) 2001-2002 Martin Pool - * Copyright (C) 2002-2008 Wayne Davison + * Copyright (C) 2002-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -81,6 +81,9 @@ static int rl_nulls = 0; static struct sigaction sigact; #endif +/* Used when "reverse lookup" is off. */ +const char undetermined_hostname[] = "UNDETERMINED"; + /** * Run a client connected to an rsyncd. The alternative to this * function for remote-shell connections is do_cmd(). @@ -405,7 +408,7 @@ static int path_failure(int f_out, const char *dir, BOOL was_chdir) return -1; } -static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) +static int rsync_module(int f_in, int f_out, int i, const char *addr, const char *host) { int argc; char **argv, **orig_argv, **orig_early_argv, *module_chdir; @@ -427,6 +430,11 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) iconv_opt = NULL; #endif + /* If reverse lookup is disabled globally but enabled for this module, + * we need to do it now before the access check. */ + if (host == undetermined_hostname && lp_reverse_lookup(i)) + host = client_name(f_in); + if (!allow_access(addr, host, lp_hosts_allow(i), lp_hosts_deny(i))) { rprintf(FLOG, "rsync denied on module %s from %s (%s)\n", name, host, addr); @@ -603,7 +611,8 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) status = -1; if (asprintf(&p, "RSYNC_EXIT_STATUS=%d", status) > 0) putenv(p); - system(lp_postxfer_exec(i)); + if (system(lp_postxfer_exec(i)) < 0) + status = -1; _exit(status); } } @@ -913,7 +922,7 @@ static int load_config(int globals_only) int start_daemon(int f_in, int f_out) { char line[1024]; - char *addr, *host; + const char *addr, *host; int i; io_set_sock_fds(f_in, f_out); @@ -926,7 +935,7 @@ int start_daemon(int f_in, int f_out) exit_cleanup(RERR_SYNTAX); addr = client_addr(f_in); - host = client_name(f_in); + host = lp_reverse_lookup(-1) ? client_name(f_in) : undetermined_hostname; rprintf(FLOG, "connect from %s (%s)\n", host, addr); if (!am_server) { @@ -974,20 +983,23 @@ static void create_pid_file(void) char *pid_file = lp_pid_file(); char pidbuf[16]; pid_t pid = getpid(); - int fd; + int fd, len; if (!pid_file || !*pid_file) return; cleanup_set_pid(pid); if ((fd = do_open(pid_file, O_WRONLY|O_CREAT|O_EXCL, 0666 & ~orig_umask)) == -1) { + failure: cleanup_set_pid(0); fprintf(stderr, "failed to create pid file %s: %s\n", pid_file, strerror(errno)); rsyserr(FLOG, errno, "failed to create pid file %s", pid_file); exit_cleanup(RERR_FILEIO); } snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid); - write(fd, pidbuf, strlen(pidbuf)); + len = strlen(pidbuf); + if (write(fd, pidbuf, len) != len) + goto failure; close(fd); }