From 0bc032726dbd40b2ee478c5f34b4bcfd04627115 Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Sun, 3 Oct 2010 13:01:21 +0200 Subject: Fix prepend bug --- src/buffer.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/buffer.c') diff --git a/src/buffer.c b/src/buffer.c index 465f618a..fd07177c 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; } -- cgit v1.2.3