diff options
author | Sander Vrijders <[email protected]> | 2016-03-15 16:04:55 +0100 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2016-03-15 16:04:55 +0100 |
commit | 788414c1a728440e25b8a7428af294189e3b70ca (patch) | |
tree | 6fb96112f64976ca19d069beaf08dbb4d4e3791b /src/lib/du_buff.c | |
parent | 7ca8145790db15d7da3c2f1b260ad3421993b67c (diff) | |
parent | 8c649a56e61012d0b245defbdea3ff5c3acb21c1 (diff) | |
download | ouroboros-788414c1a728440e25b8a7428af294189e3b70ca.tar.gz ouroboros-788414c1a728440e25b8a7428af294189e3b70ca.zip |
Merged in dstaesse/ouroboros/b-du_buff (pull request #32)
lib: Updated du_buff to limit allowable PCI size
Diffstat (limited to 'src/lib/du_buff.c')
-rw-r--r-- | src/lib/du_buff.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index cf523847..918ee57d 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -24,16 +24,15 @@ #include <malloc.h> #include <string.h> #include <errno.h> -#include "ouroboros/du_buff.h" +#include <ouroboros/du_buff.h> +#include <ouroboros/list.h> #define OUROBOROS_PREFIX "du_buff" -#ifndef DU_BUFF_BLOCKSIZE -#define DU_BUFF_BLOCKSIZE (1 << 16) -#endif - #include "ouroboros/logs.h" +#define DU_BLOCK_DATA_SIZE (DU_BUFF_BLOCK_SIZE - sizeof (struct buffer)) + struct buffer { uint8_t * data; size_t size; @@ -79,9 +78,12 @@ struct buffer * buffer_create (size_t size, size_t headspace, size_t len) { struct buffer * head = NULL; size_t remaining = size; - const size_t page_size = DU_BUFF_BLOCKSIZE; size_t ts = size - (headspace + len); - bool head_block = true; + + if (headspace > DU_BLOCK_DATA_SIZE || ts > DU_BLOCK_DATA_SIZE) { + LOG_ERR("Illegal du_buff: Cannot fit PCI in DU_BUFF_BLOCK."); + return NULL; + } head = malloc(sizeof *head); if (head == NULL) @@ -97,17 +99,15 @@ struct buffer * buffer_create (size_t size, size_t headspace, size_t len) size_t sz; - if (size > DU_BUFF_BLOCKSIZE && head_block) { - sz = headspace; - head_block = false; - } else if (size > DU_BUFF_BLOCKSIZE - && remaining - ts <= DU_BUFF_BLOCKSIZE + if (size > DU_BLOCK_DATA_SIZE + && remaining - ts <= DU_BLOCK_DATA_SIZE && remaining != ts) { sz = remaining - ts; - } else if (size > DU_BUFF_BLOCKSIZE && remaining == ts) { + } else if (size > DU_BLOCK_DATA_SIZE && remaining == ts) { sz = ts; } else { - sz = remaining < page_size ? remaining : page_size; + sz = remaining < DU_BLOCK_DATA_SIZE ? + remaining : DU_BLOCK_DATA_SIZE; } buf = malloc(sizeof *buf); @@ -248,7 +248,7 @@ int buffer_copy_data(struct buffer * head, du_buff_t * du_buff_create(size_t size) { - du_buff_t * dub = (du_buff_t *)malloc(sizeof(du_buff_t)); + du_buff_t * dub = malloc(sizeof *dub); if (dub == NULL) { LOG_DBGF("Bogus input, bugging out."); @@ -290,7 +290,7 @@ int du_buff_init(du_buff_t * dub, } if (start + len > dub->size) { - LOG_DBGF("Buffer too small for data %lu.", start); + LOG_DBGF("Buffer too small for data."); return -EINVAL; } |