diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | sftp-client.c | 13 |
2 files changed, 15 insertions, 6 deletions
@@ -31,6 +31,12 @@ | |||
31 | introduce atomiciov() function that wraps readv/writev to retry | 31 | introduce atomiciov() function that wraps readv/writev to retry |
32 | interrupted transfers like atomicio() does for read/write; | 32 | interrupted transfers like atomicio() does for read/write; |
33 | feedback deraadt@ dtucker@ stevesk@ ok deraadt@ | 33 | feedback deraadt@ dtucker@ stevesk@ ok deraadt@ |
34 | - djm@cvs.openbsd.org 2006/04/16 00:54:10 | ||
35 | [sftp-client.c] | ||
36 | avoid making a tiny 4-byte write to send the packet length of sftp | ||
37 | commands, which would result in a separate tiny packet on the wire by | ||
38 | using atomiciov(writev, ...) to write the length and the command in one | ||
39 | pass; ok deraadt@ | ||
34 | 40 | ||
35 | 20060421 | 41 | 20060421 |
36 | - (djm) [Makefile.in configure.ac session.c sshpty.c] | 42 | - (djm) [Makefile.in configure.ac session.c sshpty.c] |
@@ -4542,4 +4548,4 @@ | |||
4542 | - (djm) Trim deprecated options from INSTALL. Mention UsePAM | 4548 | - (djm) Trim deprecated options from INSTALL. Mention UsePAM |
4543 | - (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu | 4549 | - (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu |
4544 | 4550 | ||
4545 | $Id: ChangeLog,v 1.4308 2006/04/23 02:06:20 djm Exp $ | 4551 | $Id: ChangeLog,v 1.4309 2006/04/23 02:06:35 djm Exp $ |
diff --git a/sftp-client.c b/sftp-client.c index c71c66f33..8778439b9 100644 --- a/sftp-client.c +++ b/sftp-client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sftp-client.c,v 1.64 2006/03/30 09:58:16 djm Exp $ */ | 1 | /* $OpenBSD: sftp-client.c,v 1.65 2006/04/16 00:54:10 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> | 3 | * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> |
4 | * | 4 | * |
@@ -61,16 +61,19 @@ static void | |||
61 | send_msg(int fd, Buffer *m) | 61 | send_msg(int fd, Buffer *m) |
62 | { | 62 | { |
63 | u_char mlen[4]; | 63 | u_char mlen[4]; |
64 | struct iovec iov[2]; | ||
64 | 65 | ||
65 | if (buffer_len(m) > SFTP_MAX_MSG_LENGTH) | 66 | if (buffer_len(m) > SFTP_MAX_MSG_LENGTH) |
66 | fatal("Outbound message too long %u", buffer_len(m)); | 67 | fatal("Outbound message too long %u", buffer_len(m)); |
67 | 68 | ||
68 | /* Send length first */ | 69 | /* Send length first */ |
69 | put_u32(mlen, buffer_len(m)); | 70 | put_u32(mlen, buffer_len(m)); |
70 | if (atomicio(vwrite, fd, mlen, sizeof(mlen)) != sizeof(mlen)) | 71 | iov[0].iov_base = mlen; |
71 | fatal("Couldn't send packet: %s", strerror(errno)); | 72 | iov[0].iov_len = sizeof(mlen); |
72 | 73 | iov[1].iov_base = buffer_ptr(m); | |
73 | if (atomicio(vwrite, fd, buffer_ptr(m), buffer_len(m)) != buffer_len(m)) | 74 | iov[1].iov_len = buffer_len(m); |
75 | |||
76 | if (atomiciov(writev, fd, iov, 2) != buffer_len(m) + sizeof(mlen)) | ||
74 | fatal("Couldn't send packet: %s", strerror(errno)); | 77 | fatal("Couldn't send packet: %s", strerror(errno)); |
75 | 78 | ||
76 | buffer_clear(m); | 79 | buffer_clear(m); |