Compare commits

...

8 Commits

Author SHA1 Message Date
rsync-bugs
c120bb2235 preparing for release of 2.0.8 1998-05-17 14:58:20 +00:00
Andrew Tridgell
5d58c8d664 updated so I can auto-build rsync packages 1998-05-17 14:32:57 +00:00
Andrew Tridgell
22d6234e04 close some unnecessary file descriptors in do_recv() 1998-05-17 07:22:53 +00:00
Andrew Tridgell
5dd7e03167 put a limit (default 1MB) on the read buffer size. This stops it
growing too much if the sender is much faster than the receiver
1998-05-17 05:56:32 +00:00
Andrew Tridgell
08ac228fbd moved usage mesage after am_daemon test (I'd broken daemon mode) 1998-05-17 03:51:41 +00:00
Andrew Tridgell
6c29af2251 close the other half of the pipe in do_recv(). This fixes the problem
where a rsync receive process could hang around after the connection
has gone away if a fatal error occurs (such as someone killing the
other end)
1998-05-17 01:24:16 +00:00
Andrew Tridgell
6c00346849 check for right number of arguments _after_ the option parsing.
this stops "rsync -v" causing a segv.
1998-05-16 15:18:07 +00:00
Andrew Tridgell
d0d56395c8 for authenticated access record the authenticated username in the logs 1998-05-16 07:45:26 +00:00
8 changed files with 121 additions and 87 deletions

View File

@@ -125,21 +125,28 @@ void generate_hash(char *in, char *challenge, char *out)
}
/* possible negotiate authentication with the client. Use "leader" to
start off the auth if necessary */
int auth_server(int fd, int module, char *addr, char *leader)
start off the auth if necessary
return NULL if authentication failed
return "" if anonymous access
otherwise return username
*/
char *auth_server(int fd, int module, char *addr, char *leader)
{
char *users = lp_auth_users(module);
char challenge[16];
char b64_challenge[30];
char line[MAXPATHLEN];
char user[100];
static char user[100];
char secret[100];
char pass[30];
char pass2[30];
char *tok;
/* if no auth list then allow anyone in! */
if (!users || !*users) return 1;
if (!users || !*users) return "";
gen_challenge(addr, challenge);
@@ -148,18 +155,18 @@ int auth_server(int fd, int module, char *addr, char *leader)
io_printf(fd,"%s%s\n", leader, b64_challenge);
if (!read_line(fd, line, sizeof(line)-1)) {
return 0;
return NULL;
}
memset(user, 0, sizeof(user));
memset(pass, 0, sizeof(pass));
if (sscanf(line,"%99s %29s", user, pass) != 2) {
return 0;
return NULL;
}
users = strdup(users);
if (!users) return 0;
if (!users) return NULL;
for (tok=strtok(users," ,\t"); tok; tok = strtok(NULL," ,\t")) {
if (strcmp(tok, user) == 0) break;
@@ -167,19 +174,22 @@ int auth_server(int fd, int module, char *addr, char *leader)
free(users);
if (!tok) {
return 0;
return NULL;
}
memset(secret, 0, sizeof(secret));
if (!get_secret(module, user, secret, sizeof(secret)-1)) {
memset(secret, 0, sizeof(secret));
return 0;
return NULL;
}
generate_hash(secret, b64_challenge, pass2);
memset(secret, 0, sizeof(secret));
return (strcmp(pass, pass2) == 0);
if (strcmp(pass, pass2) == 0)
return user;
return NULL;
}

View File

@@ -109,6 +109,7 @@ static int rsync_module(int fd, int i)
char *addr = client_addr(fd);
char *host = client_name(fd);
char *name = lp_name(i);
char *user;
int start_glob=0;
char *request=NULL;
extern int am_sender;
@@ -121,13 +122,6 @@ static int rsync_module(int fd, int i)
return -1;
}
if (!auth_server(fd, i, addr, "@RSYNCD: AUTHREQD ")) {
rprintf(FERROR,"auth failed on module %s from %s (%s)\n",
name, client_name(fd), client_addr(fd));
io_printf(fd,"@ERROR: auth failed on module %s\n",name);
return -1;
}
if (!claim_connection(lp_lock_file(), lp_max_connections())) {
rprintf(FERROR,"max connections (%d) reached\n",
lp_max_connections());
@@ -136,6 +130,15 @@ static int rsync_module(int fd, int i)
}
user = auth_server(fd, i, addr, "@RSYNCD: AUTHREQD ");
if (!user) {
rprintf(FERROR,"auth failed on module %s from %s (%s)\n",
name, client_name(fd), client_addr(fd));
io_printf(fd,"@ERROR: auth failed on module %s\n",name);
return -1;
}
module_id = i;
if (lp_read_only(i))
@@ -233,9 +236,15 @@ static int rsync_module(int fd, int i)
parse_arguments(argc, argv);
if (request) {
rprintf(FINFO,"rsync %s %s from %s (%s)\n",
am_sender?"on":"to",
request, host, addr);
if (*user) {
rprintf(FINFO,"rsync %s %s from %s@%s (%s)\n",
am_sender?"on":"to",
request, user, host, addr);
} else {
rprintf(FINFO,"rsync %s %s from %s (%s)\n",
am_sender?"on":"to",
request, host, addr);
}
free(request);
}

115
io.c
View File

@@ -45,8 +45,8 @@ static int buffer_f_in = -1;
void setup_nonblocking(int f_in,int f_out)
{
set_blocking(f_out,0);
buffer_f_in = f_in;
set_blocking(f_out,0);
buffer_f_in = f_in;
}
@@ -61,39 +61,42 @@ static int read_buffer_size;
* ssh will clag up. Uggh. */
static void read_check(int f)
{
int n;
int n;
if (f == -1) return;
if (f == -1) return;
if (read_buffer_len == 0) {
read_buffer_p = read_buffer;
}
if (read_buffer_len == 0) {
read_buffer_p = read_buffer;
}
if ((n=num_waiting(f)) <= 0)
return;
if ((n=num_waiting(f)) <= 0)
return;
/* things could deteriorate if we read in really small chunks */
if (n < 10) n = 1024;
/* things could deteriorate if we read in really small chunks */
if (n < 10) n = 1024;
if (read_buffer_p != read_buffer) {
memmove(read_buffer,read_buffer_p,read_buffer_len);
read_buffer_p = read_buffer;
}
if (n > MAX_READ_BUFFER/4)
n = MAX_READ_BUFFER/4;
if (n > (read_buffer_size - read_buffer_len)) {
read_buffer_size += n;
if (!read_buffer)
read_buffer = (char *)malloc(read_buffer_size);
else
read_buffer = (char *)realloc(read_buffer,read_buffer_size);
if (!read_buffer) out_of_memory("read check");
read_buffer_p = read_buffer;
}
if (read_buffer_p != read_buffer) {
memmove(read_buffer,read_buffer_p,read_buffer_len);
read_buffer_p = read_buffer;
}
n = read(f,read_buffer+read_buffer_len,n);
if (n > 0) {
read_buffer_len += n;
}
if (n > (read_buffer_size - read_buffer_len)) {
read_buffer_size += n;
if (!read_buffer)
read_buffer = (char *)malloc(read_buffer_size);
else
read_buffer = (char *)realloc(read_buffer,read_buffer_size);
if (!read_buffer) out_of_memory("read check");
read_buffer_p = read_buffer;
}
n = read(f,read_buffer+read_buffer_len,n);
if (n > 0) {
read_buffer_len += n;
}
}
static time_t last_io;
@@ -334,38 +337,40 @@ static int writefd_unbuffered(int fd,char *buf,int len)
if (ret == -1) {
read_check(buffer_f_in);
if (read_buffer_len < MAX_READ_BUFFER)
read_check(buffer_f_in);
fd_count = fd+1;
FD_ZERO(&w_fds);
FD_ZERO(&r_fds);
FD_SET(fd,&w_fds);
if (buffer_f_in != -1) {
FD_SET(buffer_f_in,&r_fds);
if (buffer_f_in > fd)
fd_count = buffer_f_in+1;
}
fd_count = fd+1;
FD_ZERO(&w_fds);
FD_ZERO(&r_fds);
FD_SET(fd,&w_fds);
if (buffer_f_in != -1) {
FD_SET(buffer_f_in,&r_fds);
if (buffer_f_in > fd)
fd_count = buffer_f_in+1;
}
tv.tv_sec = BLOCKING_TIMEOUT;
tv.tv_usec = 0;
count = select(fd_count,buffer_f_in == -1? NULL: &r_fds,
&w_fds,NULL,&tv);
if (count == -1 && errno != EINTR) {
if (verbose > 1)
rprintf(FERROR,"select error: %s\n", strerror(errno));
exit_cleanup(1);
}
tv.tv_sec = BLOCKING_TIMEOUT;
tv.tv_usec = 0;
count = select(fd_count,buffer_f_in == -1? NULL: &r_fds,
&w_fds,NULL,&tv);
if (count == 0) {
check_timeout();
continue;
}
if (count == -1 && errno != EINTR) {
if (verbose > 1)
rprintf(FERROR,"select error: %s\n", strerror(errno));
exit_cleanup(1);
}
if (count == 0) {
check_timeout();
continue;
}
if (FD_ISSET(fd, &w_fds)) {
got_select = 1;
}
if (FD_ISSET(fd, &w_fds)) {
got_select = 1;
}
} else {
total += ret;
total += ret;
}
}

9
main.c
View File

@@ -242,11 +242,15 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
if ((pid=do_fork()) == 0) {
close(recv_pipe[0]);
close(f_out);
recv_files(f_in,flist,local_name,recv_pipe[1]);
if (am_daemon) report(-1);
exit_cleanup(0);
}
close(recv_pipe[1]);
close(f_in);
generate_files(f_out,flist,local_name,recv_pipe[0]);
waitpid(pid, &status, 0);
@@ -501,6 +505,11 @@ int main(int argc,char *argv[])
return daemon_main();
}
if (argc < 1) {
usage(FERROR);
exit(1);
}
if (dry_run)
verbose = MAX(verbose,1);

View File

@@ -1,12 +1,12 @@
Summary: Program for efficient remote updates of files.
Name: rsync
Version: 2.0.7
Version: 2.0.8
Release: 1
Copyright: GPL
Group: Applications/Networking
Source: ftp://samba.anu.edu.au/pub/rsync/
Source: ftp://samba.anu.edu.au/pub/rsync/rsync-2.0.8.tar.gz
URL: http://samba.anu.edu.au/rsync/
Packager: John H Terpstra <jht@samba.anu.edu.au>
Packager: Andrew Tridgell <tridge@samba.anu.edu.au>
BuildRoot: /tmp/rsync
%description
@@ -21,6 +21,9 @@ A technical report describing the rsync algorithm is included with
this package.
%changelog
* Mon May 18 1998
reworked for auto-building when I release rsync (tridge@samba.anu.edu.au)
* Sat May 16 1998 John H Terpstra <jht@aquasoft.com.au>
Upgraded to Rsync 2.0.6
-new feature anonymous rsync
@@ -57,8 +60,6 @@ previous package(s).)
./configure --prefix=/usr
make CFLAGS=$RPM_OPT_FLAGS
strip rsync
latex tech_report
dvips tech_report -o
%install
mkdir -p $RPM_BUILD_ROOT/usr/{bin,man/{man1,man5}}
@@ -73,7 +74,6 @@ rm -rf $RPM_BUILD_ROOT
%attr(-,root,root) /usr/bin/rsync
%attr(-,root,root) /usr/man/man1/rsync.1
%attr(-,root,root) /usr/man/man5/rsyncd.conf.5
%attr(-,root,root) %doc tech_report.ps
%attr(-,root,root) %doc tech_report.tex
%attr(-,root,root) %doc README
%attr(-,root,root) %doc COPYING

View File

@@ -4,9 +4,9 @@ Version: PVERSION
Release: PRELEASE
Copyright: GPL
Group: Applications/Networking
Source: ftp://samba.anu.edu.au/pub/rsync/
Source: ftp://samba.anu.edu.au/pub/rsync/rsync-PVERSION.tar.gz
URL: http://samba.anu.edu.au/rsync/
Packager: John H Terpstra <jht@samba.anu.edu.au>
Packager: Andrew Tridgell <tridge@samba.anu.edu.au>
BuildRoot: /tmp/rsync
%description
@@ -21,6 +21,9 @@ A technical report describing the rsync algorithm is included with
this package.
%changelog
* Mon May 18 1998
reworked for auto-building when I release rsync (tridge@samba.anu.edu.au)
* Sat May 16 1998 John H Terpstra <jht@aquasoft.com.au>
Upgraded to Rsync 2.0.6
-new feature anonymous rsync
@@ -57,8 +60,6 @@ previous package(s).)
./configure --prefix=/usr
make CFLAGS=$RPM_OPT_FLAGS
strip rsync
latex tech_report
dvips tech_report -o
%install
mkdir -p $RPM_BUILD_ROOT/usr/{bin,man/{man1,man5}}
@@ -73,7 +74,6 @@ rm -rf $RPM_BUILD_ROOT
%attr(-,root,root) /usr/bin/rsync
%attr(-,root,root) /usr/man/man1/rsync.1
%attr(-,root,root) /usr/man/man5/rsyncd.conf.5
%attr(-,root,root) %doc tech_report.ps
%attr(-,root,root) %doc tech_report.tex
%attr(-,root,root) %doc README
%attr(-,root,root) %doc COPYING

View File

@@ -52,6 +52,7 @@
#define CHUNK_SIZE (32*1024)
#define MAX_MAP_SIZE (4*1024*1024)
#define IO_BUFFER_SIZE (4096)
#define MAX_READ_BUFFER (1024*1024)
#define MAX_ARGS 1000

View File

@@ -1 +1 @@
#define VERSION "2.0.7"
#define VERSION "2.0.8"