diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-03 13:01:21 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-03 13:01:21 +0200 |
commit | 0bc032726dbd40b2ee478c5f34b4bcfd04627115 (patch) | |
tree | c684067a7c8fdfce890bab310bc91b5ebb2759f1 /src | |
parent | b2f571e544f82116bb78b954a8c449105df148d4 (diff) | |
download | libssh-0bc032726dbd40b2ee478c5f34b4bcfd04627115.tar.gz libssh-0bc032726dbd40b2ee478c5f34b4bcfd04627115.tar.xz libssh-0bc032726dbd40b2ee478c5f34b4bcfd04627115.zip |
Fix prepend bug
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c index 465f618..fd07177 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -293,14 +293,24 @@ int buffer_add_u8(struct ssh_buffer_struct *buffer,uint8_t data){ int buffer_prepend_data(struct ssh_buffer_struct *buffer, const void *data, uint32_t len) { buffer_verify(buffer); - if (buffer->allocated < (buffer->used + len)) { - if (realloc_buffer(buffer, buffer->used + len) < 0) { + + if(len <= buffer->pos){ + /* It's possible to insert data between begin and pos */ + memcpy(buffer->data + (buffer->pos - len), data, len); + buffer->pos -= len; + buffer_verify(buffer); + return 0; + } + /* pos isn't high enough */ + if (buffer->allocated < (buffer->used - buffer->pos + len)) { + if (realloc_buffer(buffer, buffer->used - buffer->pos + len) < 0) { return -1; } } - memmove(buffer->data + len, buffer->data, buffer->used); + memmove(buffer->data + len, buffer->data + buffer->pos, buffer->used - buffer->pos); memcpy(buffer->data, data, len); - buffer->used += len; + buffer->used += len - buffer->pos; + buffer->pos = 0; buffer_verify(buffer); return 0; } |