Fix prepend bug
Этот коммит содержится в:
родитель
b2f571e544
Коммит
0bc032726d
@ -23,7 +23,13 @@
|
|||||||
#define BUFFER_H_
|
#define BUFFER_H_
|
||||||
|
|
||||||
#include "libssh/libssh.h"
|
#include "libssh/libssh.h"
|
||||||
/* Describes a buffer state */
|
/*
|
||||||
|
* Describes a buffer state
|
||||||
|
* [XXXXXXXXXXXXDATA PAYLOAD XXXXXXXXXXXXXXXXXXXXXXXX]
|
||||||
|
* ^ ^ ^ ^]
|
||||||
|
* \_data points\_pos points here \_used points here | /
|
||||||
|
* here Allocated
|
||||||
|
*/
|
||||||
struct ssh_buffer_struct {
|
struct ssh_buffer_struct {
|
||||||
char *data;
|
char *data;
|
||||||
uint32_t used;
|
uint32_t used;
|
||||||
|
18
src/buffer.c
18
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,
|
int buffer_prepend_data(struct ssh_buffer_struct *buffer, const void *data,
|
||||||
uint32_t len) {
|
uint32_t len) {
|
||||||
buffer_verify(buffer);
|
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;
|
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);
|
memcpy(buffer->data, data, len);
|
||||||
buffer->used += len;
|
buffer->used += len - buffer->pos;
|
||||||
|
buffer->pos = 0;
|
||||||
buffer_verify(buffer);
|
buffer_verify(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,14 @@ START_TEST (torture_buffer_prepend)
|
|||||||
buffer_prepend_data(buffer,"aris",4);
|
buffer_prepend_data(buffer,"aris",4);
|
||||||
ck_assert_int_eq(buffer_get_rest_len(buffer),9);
|
ck_assert_int_eq(buffer_get_rest_len(buffer),9);
|
||||||
ck_assert_int_eq(memcmp(buffer_get_rest(buffer), "arisbcdef", 9), 0);
|
ck_assert_int_eq(memcmp(buffer_get_rest(buffer), "arisbcdef", 9), 0);
|
||||||
|
/* same thing but we add 5 bytes now */
|
||||||
|
buffer_get_u32(buffer,&v);
|
||||||
|
ck_assert_int_eq(buffer_get_rest_len(buffer),5);
|
||||||
|
ck_assert_int_eq(memcmp(buffer_get_rest(buffer), "bcdef", 5), 0);
|
||||||
|
buffer_prepend_data(buffer,"12345",5);
|
||||||
|
ck_assert_int_eq(buffer_get_rest_len(buffer),10);
|
||||||
|
ck_assert_int_eq(memcmp(buffer_get_rest(buffer), "12345bcdef", 10), 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user