aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-10-03 13:01:21 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-10-03 13:01:21 +0200
commit0bc032726dbd40b2ee478c5f34b4bcfd04627115 (patch)
treec684067a7c8fdfce890bab310bc91b5ebb2759f1 /src
parentb2f571e544f82116bb78b954a8c449105df148d4 (diff)
downloadlibssh-0bc032726dbd40b2ee478c5f34b4bcfd04627115.tar.gz
libssh-0bc032726dbd40b2ee478c5f34b4bcfd04627115.tar.xz
libssh-0bc032726dbd40b2ee478c5f34b4bcfd04627115.zip
Fix prepend bug
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c18
1 files changed, 14 insertions, 4 deletions
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;
}