Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 18 Jan 2003 10:12:37 +0000 (10:12 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 18 Jan 2003 10:12:37 +0000 (10:12 +0000)
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.

ChangeLog
inet/rexec.c

index 2ed6d18..2048932 100644 (file)
--- 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]:
index c6b432a..3c14836 100644 (file)
@@ -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.  */