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:
18
src/buffer.c
18
src/buffer.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user