diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-03 13:31:02 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-03 13:31:02 +0200 |
commit | 9a89fba3329d7557f9415c5d629b0bf783fe5685 (patch) | |
tree | e42694d05c75a978f2356bd4e1013426668ce345 /src/buffer.c | |
parent | 0bc032726dbd40b2ee478c5f34b4bcfd04627115 (diff) | |
download | libssh-9a89fba3329d7557f9415c5d629b0bf783fe5685.tar.gz libssh-9a89fba3329d7557f9415c5d629b0bf783fe5685.tar.xz libssh-9a89fba3329d7557f9415c5d629b0bf783fe5685.zip |
resolve memory consumption bug
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/buffer.c b/src/buffer.c index fd07177c..27d2592d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -114,7 +114,7 @@ static int realloc_buffer(struct ssh_buffer_struct *buffer, int needed) { char *new = NULL; buffer_verify(buffer); /* Find the smallest power of two which is greater or equal to needed */ - while(smallest < needed) { + while(smallest <= needed) { smallest <<= 1; } needed = smallest; @@ -128,6 +128,20 @@ static int realloc_buffer(struct ssh_buffer_struct *buffer, int needed) { return 0; } +/** @internal + * @brief shifts a buffer to remove unused data in the beginning + * @param buffer SSH buffer + */ +static void buffer_shift(ssh_buffer buffer){ + buffer_verify(buffer); + if(buffer->pos==0) + return; + memmove(buffer->data, buffer->data + buffer->pos, buffer->used - buffer->pos); + buffer->used -= buffer->pos; + buffer->pos=0; + buffer_verify(buffer); +} + /** * @internal * @@ -167,6 +181,8 @@ int buffer_reinit(struct ssh_buffer_struct *buffer) { int buffer_add_data(struct ssh_buffer_struct *buffer, const void *data, uint32_t len) { buffer_verify(buffer); if (buffer->allocated < (buffer->used + len)) { + if(buffer->pos > 0) + buffer_shift(buffer); if (realloc_buffer(buffer, buffer->used + len) < 0) { return -1; } |