diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | inet/rexec.c | 17 |
2 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 2ed6d18555..20489320bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-01-18 Ulrich Drepper <drepper@redhat.com> + + * inet/rexec.c (rexec_af): Protect socket operations with + TEMP_FAILURE_RETRY. Use writev instead of multiple write. + * inet/rcmd.c (rcmd_af): Likewise. + 2003-01-17 Roland McGrath <roland@redhat.com> * math/libm-test.inc (sin_test, cos_test, sincos_test) [TEST_DOUBLE]: diff --git a/inet/rexec.c b/inet/rexec.c index c6b432a6f8..3c14836aa2 100644 --- a/inet/rexec.c +++ b/inet/rexec.c @@ -43,6 +43,7 @@ static char sccsid[] = "@(#)rexec.c 8.1 (Berkeley) 6/4/93"; #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <sys/uio.h> int rexecoptions; libc_freeres_ptr (static char *ahostbuf); @@ -136,7 +137,8 @@ retry: (void) sprintf(num, "%u", port); (void) __write(s, num, strlen(num)+1); { int len = sizeof (from); - s3 = accept(s2, (struct sockaddr *)&from, &len); + s3 = TEMP_FAILURE_RETRY (accept(s2, (struct sockaddr *)&from, + &len)); __close(s2); if (s3 < 0) { perror("accept"); @@ -146,10 +148,15 @@ retry: } *fd2p = s3; } - (void) __write(s, name, strlen(name) + 1); - /* should public key encypt the password here */ - (void) __write(s, pass, strlen(pass) + 1); - (void) __write(s, cmd, strlen(cmd) + 1); + + struct iovec iov[3] = + { + [0] = { .iov_base = (void *) name, .iov_len = strlen (name) + 1 }, + /* should public key encypt the password here */ + [1] = { .iov_base = (void *) pass, .iov_len = strlen (pass) + 1 }, + [2] = { .iov_base = (void *) cmd, .iov_len = strlen (cmd) + 1 } + }; + (void) TEMP_FAILURE_RETRY (__writev (s, iov, 3)); /* We don't need the memory allocated for the name and the password in ruserpass anymore. */ |