diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2018-10-07 14:13:56 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2018-10-08 09:27:06 +0200 |
commit | 3245b50795ab58f2c279afb17bb25092bd128f50 (patch) | |
tree | 55a511593dc2ca4ab798d640adf7c5073bca4232 /src/sftp.c | |
parent | 508dfc525119a050eae911a439c2abd3dec8d7d1 (diff) | |
download | libssh-3245b50795ab58f2c279afb17bb25092bd128f50.tar.gz libssh-3245b50795ab58f2c279afb17bb25092bd128f50.tar.xz libssh-3245b50795ab58f2c279afb17bb25092bd128f50.zip |
sftp: Only prepend header data once
This reduces memory moving.
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Jakub Jelen <jjelen@redhat.com>
Diffstat (limited to 'src/sftp.c')
-rw-r--r-- | src/sftp.c | 24 |
1 files changed, 15 insertions, 9 deletions
@@ -320,24 +320,30 @@ void sftp_free(sftp_session sftp) int sftp_packet_write(sftp_session sftp, uint8_t type, ssh_buffer payload) { + uint8_t header[5] = {0}; + uint32_t payload_size; int size; + int rc; - if (ssh_buffer_prepend_data(payload, &type, sizeof(uint8_t)) < 0) { - ssh_set_error_oom(sftp->session); - return -1; - } + /* Add size of type */ + payload_size = ssh_buffer_get_len(payload) + sizeof(uint8_t); + PUSH_BE_U32(header, 0, payload_size); + PUSH_BE_U8(header, 4, type); - size = htonl(ssh_buffer_get_len(payload)); - if (ssh_buffer_prepend_data(payload, &size, sizeof(uint32_t)) < 0) { + rc = ssh_buffer_prepend_data(payload, header, sizeof(header)); + if (rc < 0) { ssh_set_error_oom(sftp->session); return -1; } - size = ssh_channel_write(sftp->channel, ssh_buffer_get(payload), - ssh_buffer_get_len(payload)); + size = ssh_channel_write(sftp->channel, + ssh_buffer_get(payload), + ssh_buffer_get_len(payload)); if (size < 0) { return -1; - } else if((uint32_t) size != ssh_buffer_get_len(payload)) { + } + + if ((uint32_t)size != ssh_buffer_get_len(payload)) { SSH_LOG(SSH_LOG_PACKET, "Had to write %d bytes, wrote only %d", ssh_buffer_get_len(payload), |