1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-08-07 08:02:55 +03:00

resolve memory consumption bug

This commit is contained in:
Aris Adamantiadis
2010-10-03 13:31:02 +02:00
parent 0bc032726d
commit 9a89fba332
2 changed files with 19 additions and 2 deletions

View File

@@ -114,7 +114,7 @@ static int realloc_buffer(struct ssh_buffer_struct *buffer, int needed) {
char *new = NULL; char *new = NULL;
buffer_verify(buffer); buffer_verify(buffer);
/* Find the smallest power of two which is greater or equal to needed */ /* Find the smallest power of two which is greater or equal to needed */
while(smallest < needed) { while(smallest <= needed) {
smallest <<= 1; smallest <<= 1;
} }
needed = smallest; needed = smallest;
@@ -128,6 +128,20 @@ static int realloc_buffer(struct ssh_buffer_struct *buffer, int needed) {
return 0; 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 * @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) { int buffer_add_data(struct ssh_buffer_struct *buffer, const void *data, uint32_t len) {
buffer_verify(buffer); buffer_verify(buffer);
if (buffer->allocated < (buffer->used + len)) { if (buffer->allocated < (buffer->used + len)) {
if(buffer->pos > 0)
buffer_shift(buffer);
if (realloc_buffer(buffer, buffer->used + len) < 0) { if (realloc_buffer(buffer, buffer->used + len) < 0) {
return -1; return -1;
} }

View File

@@ -1,7 +1,8 @@
#define LIBSSH_STATIC #define LIBSSH_STATIC
#include "torture.h" #include "torture.h"
#include "libssh/buffer.h" #define DEBUG_BUFFER
#include "buffer.c"
ssh_buffer buffer; ssh_buffer buffer;
#define LIMIT (8*1024*1024) #define LIMIT (8*1024*1024)