buffer: Add ssh_buffer_allocate() function
Signed-off-by: Aris Adamantiadis <aris@0xbadc0de.be> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Этот коммит содержится в:
родитель
0ad462102a
Коммит
36d52ee205
@ -50,6 +50,7 @@ int ssh_buffer_add_u64(ssh_buffer buffer, uint64_t data);
|
||||
|
||||
int ssh_buffer_validate_length(struct ssh_buffer_struct *buffer, size_t len);
|
||||
|
||||
void *ssh_buffer_allocate(struct ssh_buffer_struct *buffer, uint32_t len);
|
||||
int ssh_buffer_pack_va(struct ssh_buffer_struct *buffer,
|
||||
const char *format,
|
||||
int argc,
|
||||
|
38
src/buffer.c
38
src/buffer.c
@ -248,6 +248,44 @@ int ssh_buffer_add_data(struct ssh_buffer_struct *buffer, const void *data, uint
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @brief Allocate space for data at the tail of a buffer.
|
||||
*
|
||||
* @param[in] buffer The buffer to add the data.
|
||||
*
|
||||
* @param[in] len The length of the data to add.
|
||||
*
|
||||
* @return Pointer on the allocated space
|
||||
* NULL on error.
|
||||
*/
|
||||
void *ssh_buffer_allocate(struct ssh_buffer_struct *buffer, uint32_t len)
|
||||
{
|
||||
void *ptr;
|
||||
buffer_verify(buffer);
|
||||
|
||||
if (buffer->used + len < len) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (buffer->allocated < (buffer->used + len)) {
|
||||
if (buffer->pos > 0) {
|
||||
buffer_shift(buffer);
|
||||
}
|
||||
|
||||
if (realloc_buffer(buffer, buffer->used + len) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ptr = buffer->data + buffer->used;
|
||||
buffer->used+=len;
|
||||
buffer_verify(buffer);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user