From b97e438d696617a2b209c543abf673e3dc4ca077 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Tue, 23 Feb 2016 22:00:27 +0100 Subject: lib: bugfixes to du_buff.c The initial commit was untested and caused some segmentation faults. This version should be bugfree (no promises). --- src/lib/du_buff.c | 61 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index e4b56b5b..84fa22a0 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -59,17 +59,17 @@ void buffer_destroy(struct buffer * buf) } -void buffer_destroy_list(struct buffer * buf) +void buffer_destroy_list(struct buffer * head) { struct list_head * ptr; struct list_head * n; - if (buf == NULL) { + if (head == NULL) { LOG_DBGF("Bogus input, bugging out."); return; } - list_for_each_safe(ptr, n, &(buf->list)) { + list_for_each_safe(ptr, n, &(head->list)) { struct buffer * tmp = list_entry(ptr, struct buffer, list); list_del(ptr); buffer_destroy(tmp); @@ -78,10 +78,16 @@ void buffer_destroy_list(struct buffer * buf) struct buffer * buffer_create (size_t size) { - struct buffer * head = NULL; + struct buffer * head = NULL; size_t remaining = size; const size_t page_size = sysconf(_SC_PAGESIZE); + head = (struct buffer *) malloc(sizeof(struct buffer)); + head->size=0; + head->data=NULL; + + INIT_LIST_HEAD(&(head->list)); + while (remaining > 0) { struct buffer * buf; size_t sz = remaining < page_size ? remaining : page_size; @@ -98,14 +104,9 @@ struct buffer * buffer_create (size_t size) buffer_destroy_list(head); return NULL; } - buf->size = sz; - INIT_LIST_HEAD(&(buf->list)); - if (head == NULL) - head = buf; - else - list_add_tail(&(buf->list), &(head->list)); + list_add_tail(&(buf->list), &(head->list)); remaining -= buf->size; } @@ -127,8 +128,12 @@ struct buffer * buffer_seek(const struct buffer * head, size_t pos) list_for_each(ptr, &(head->list)) { struct buffer * tmp = list_entry(ptr, struct buffer, list); - cur_buf_end = cur_buf_start + tmp->size; + if (tmp == NULL) { + LOG_WARN("Could not iterate over elements %p", head); + return NULL; + } + cur_buf_end = cur_buf_start + tmp->size; if (cur_buf_end > pos) return tmp; @@ -186,8 +191,8 @@ int buffer_copy_data(struct buffer * head, if (buf_start == NULL || buf_end == NULL) { LOG_DBGF("Index out of bounds %d, %d", - pos, - pos+len); + (int) pos, + (int) (pos+len)); return -EINVAL; } @@ -200,9 +205,12 @@ int buffer_copy_data(struct buffer * head, copy_pos = (uint8_t *)src; bytes_remaining = len; - list_for_each(ptr, &(buf_start->list)) { + list_for_each(ptr, &(head->list)) { struct buffer * tmp = list_entry(ptr, struct buffer, list); - space_in_buf = tmp->data + tmp->size - ptr_start; + if (tmp != buf_start) + continue; + + space_in_buf = (tmp->data + tmp->size) - ptr_start; if (space_in_buf >= bytes_remaining) { memcpy(ptr_start, copy_pos, bytes_remaining); return 0; @@ -257,38 +265,52 @@ int du_buff_init(du_buff_t * dub, uint8_t * data, size_t len) { + int ret = -EINVAL; + if (dub == NULL || data == NULL) { LOG_DBG("Bogus input, bugging out."); return -EINVAL; } if (start + len > dub->size) { - LOG_DBGF("Index out of bounds %d", start); + LOG_DBGF("Index out of bounds %d.", (int) start); return -EINVAL; } dub->du_start = start; dub->du_end = start + len; - return buffer_copy_data(dub->buffer, start, data, len); + ret = buffer_copy_data(dub->buffer, start, data, len); + + return ret; } uint8_t * du_buff_data_ptr_start(du_buff_t * dub) { + uint8_t * ret = NULL; + if (dub == NULL) { LOG_DBGF("Bogus input, bugging out."); return NULL; } - return buffer_seek_pos(dub->buffer, dub->du_start); + + ret = buffer_seek_pos(dub->buffer, dub->du_start); + + return ret; } uint8_t * du_buff_data_ptr_end(du_buff_t * dub) { + uint8_t * ret = NULL; + if (dub == NULL) { LOG_DBG("Bogus input, bugging out."); return NULL; } - return buffer_seek_pos(dub->buffer, dub->du_end); + + ret = buffer_seek_pos(dub->buffer, dub->du_end); + + return ret; } int du_buff_head_alloc(du_buff_t * dub, size_t size) @@ -322,7 +344,6 @@ int du_buff_tail_alloc(du_buff_t * dub, size_t size) dub->du_end += size; return 0; - } int du_buff_head_release(du_buff_t * dub, size_t size) -- cgit v1.2.3 From 36ea927cff712233b875ffddcf7577499273e8ad Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Wed, 24 Feb 2016 10:43:25 +0100 Subject: lib: Fixed shoddy cast du_buff.c size_t now prints correctly as %llu --- src/lib/du_buff.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index 84fa22a0..5756ba27 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -190,9 +190,7 @@ int buffer_copy_data(struct buffer * head, buf_end = buffer_seek(head, pos + len); if (buf_start == NULL || buf_end == NULL) { - LOG_DBGF("Index out of bounds %d, %d", - (int) pos, - (int) (pos+len)); + LOG_DBGF("Index out of bounds %llu, %llu", pos, pos+len); return -EINVAL; } @@ -273,7 +271,7 @@ int du_buff_init(du_buff_t * dub, } if (start + len > dub->size) { - LOG_DBGF("Index out of bounds %d.", (int) start); + LOG_DBGF("Index out of bounds %llu.", start); return -EINVAL; } -- cgit v1.2.3 From 32bad3183aa5045e2ab8a0da92d4b7a8802d4aad Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Wed, 24 Feb 2016 10:47:42 +0100 Subject: lib: Fixed syntax formatting in du_buff forgot spaces before/after + --- src/lib/du_buff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index 5756ba27..eace2d02 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -190,7 +190,7 @@ int buffer_copy_data(struct buffer * head, buf_end = buffer_seek(head, pos + len); if (buf_start == NULL || buf_end == NULL) { - LOG_DBGF("Index out of bounds %llu, %llu", pos, pos+len); + LOG_DBGF("Index out of bounds %llu, %llu", pos, pos + len); return -EINVAL; } -- cgit v1.2.3 From ef26d4303ed776578e6522fb9fc4ff7817d40dc1 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Wed, 24 Feb 2016 11:28:54 +0100 Subject: lib: further cleanup of du_buff du_buff.c : removed unnecessary variable for return values removed unnecessary functions --- include/ouroboros/du_buff.h | 3 --- src/lib/du_buff.c | 35 ++--------------------------------- 2 files changed, 2 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h index d23f4b09..92d0609d 100644 --- a/include/ouroboros/du_buff.h +++ b/include/ouroboros/du_buff.h @@ -39,9 +39,6 @@ int du_buff_init(du_buff_t * dub, uint8_t * data, size_t len); -uint8_t * du_buff_data_ptr_start(du_buff_t * dub); -uint8_t * du_buff_data_ptr_end(du_buff_t * dub); - int du_buff_head_alloc(du_buff_t * dub, size_t size); int du_buff_tail_alloc(du_buff_t * dub, size_t size); int du_buff_head_release(du_buff_t * dub, size_t size); diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index eace2d02..e530fcb7 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -263,8 +263,6 @@ int du_buff_init(du_buff_t * dub, uint8_t * data, size_t len) { - int ret = -EINVAL; - if (dub == NULL || data == NULL) { LOG_DBG("Bogus input, bugging out."); return -EINVAL; @@ -278,37 +276,7 @@ int du_buff_init(du_buff_t * dub, dub->du_start = start; dub->du_end = start + len; - ret = buffer_copy_data(dub->buffer, start, data, len); - - return ret; -} - -uint8_t * du_buff_data_ptr_start(du_buff_t * dub) -{ - uint8_t * ret = NULL; - - if (dub == NULL) { - LOG_DBGF("Bogus input, bugging out."); - return NULL; - } - - ret = buffer_seek_pos(dub->buffer, dub->du_start); - - return ret; -} - -uint8_t * du_buff_data_ptr_end(du_buff_t * dub) -{ - uint8_t * ret = NULL; - - if (dub == NULL) { - LOG_DBG("Bogus input, bugging out."); - return NULL; - } - - ret = buffer_seek_pos(dub->buffer, dub->du_end); - - return ret; + return buffer_copy_data(dub->buffer, start, data, len); } int du_buff_head_alloc(du_buff_t * dub, size_t size) @@ -327,6 +295,7 @@ int du_buff_head_alloc(du_buff_t * dub, size_t size) return 0; } + int du_buff_tail_alloc(du_buff_t * dub, size_t size) { if (dub == NULL) { -- cgit v1.2.3