summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2014-07-02 12:49:51 +0200
committerVicent Marti <tanoku@gmail.com>2014-08-05 02:07:16 +0200
commit12dcc6eeae177050849902f958f618e41e39ec76 (patch)
tree4eed8240fa78c1dd31f0a9070a88af521007b41d
parent38ddf2277ff136f0e07240cbc6352fd80c5ca884 (diff)
downloadlibgit2-12dcc6eeae177050849902f958f618e41e39ec76.tar.gz
ssh: libssh2_channel_write() behaves like send()
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 b403727c..79a632bd 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;
}