X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/26e21efc5a7e87b2aa1bdb6d64a74a30c699c085..11ef77b76aa0837851bc1c808921c5bacaa3d464:/clientserver.c diff --git a/clientserver.c b/clientserver.c index b891d79a..1bc5b9ac 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(). @@ -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); } } @@ -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); }