summaryrefslogtreecommitdiff
path: root/src/lib/du_buff.c
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2016-03-15 16:04:55 +0100
committerSander Vrijders <[email protected]>2016-03-15 16:04:55 +0100
commit788414c1a728440e25b8a7428af294189e3b70ca (patch)
tree6fb96112f64976ca19d069beaf08dbb4d4e3791b /src/lib/du_buff.c
parent7ca8145790db15d7da3c2f1b260ad3421993b67c (diff)
parent8c649a56e61012d0b245defbdea3ff5c3acb21c1 (diff)
downloadouroboros-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.c32
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;
}