summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2014-07-02 12:49:51 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2014-07-02 12:49:51 +0200
commit0963716b3fd30a0900c22884bcd52f04d556fb67 (patch)
tree05b88b78b9a84f98a2626ca31da7e35fcf231d9e
parent28f087c8642ff9c8dd6964e101e6d8539db6281a (diff)
downloadlibgit2-cmn/ssh-send-everything.tar.gz
ssh: libssh2_channel_write() behaves like send()cmn/ssh-send-everything
When the stream writing function was written, it assume that libssh2_channel_write() would always write all of the data to the wire. This is only true for the first 32k of data, which it tries to fit into one ssh packet. Since it can perform short writes, call it in a loop like we do for send(), advancing the buffer offset.
-rw-r--r--src/transports/ssh.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index b403727c9..79a632bd5 100644
--- a/src/transports/ssh.c
+++ b/src/transports/ssh.c
@@ -132,11 +132,22 @@ static int ssh_stream_write(
size_t len)
{
ssh_stream *s = (ssh_stream *)stream;
+ size_t off = 0;
+ ssize_t ret = 0;
if (!s->sent_command && send_command(s) < 0)
return -1;
- if (libssh2_channel_write(s->channel, buffer, len) < LIBSSH2_ERROR_NONE) {
+ do {
+ ret = libssh2_channel_write(s->channel, buffer + off, len - off);
+ if (ret < 0)
+ break;
+
+ off += ret;
+
+ } while (off < len);
+
+ if (ret < 0) {
ssh_error(s->session, "SSH could not write data");
return -1;
}