From a59cd22479058fa28226a7e1b21c3699b414d94a Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 29 Jan 2013 22:05:32 -0500 Subject: [PATCH] merge bencode from kamailio --- daemon/bencode.c | 28 ++++++++++++++++++++++------ daemon/bencode.h | 1 + 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/daemon/bencode.c b/daemon/bencode.c index dd417602b..fb6f8a9a8 100644 --- a/daemon/bencode.c +++ b/daemon/bencode.c @@ -85,6 +85,7 @@ int bencode_buffer_init(bencode_buffer_t *buf) { if (!buf->pieces) return -1; buf->free_list = NULL; + buf->error = 0; return 0; } @@ -92,14 +93,19 @@ static void *__bencode_alloc(bencode_buffer_t *buf, unsigned int size) { struct __bencode_buffer_piece *piece; void *ret; + if (buf->error) + return NULL; + piece = buf->pieces; if (size <= piece->left) goto alloc; piece = __bencode_piece_new(size); - if (!piece) + if (!piece) { + buf->error = 1; return NULL; + } piece->next = buf->pieces; buf->pieces = piece; @@ -157,6 +163,11 @@ bencode_item_t *bencode_list(bencode_buffer_t *buf) { } static void __bencode_container_add(bencode_item_t *parent, bencode_item_t *child) { + if (!parent) + return; + if (!child) + return; + assert(child->parent == NULL); assert(child->sibling == NULL); @@ -221,9 +232,9 @@ bencode_item_t *bencode_integer(bencode_buffer_t *buf, long long int i) { bencode_item_t *bencode_dictionary_add_len(bencode_item_t *dict, const char *key, int keylen, bencode_item_t *val) { bencode_item_t *str; - assert(dict->type == BENCODE_DICTIONARY); - if (!val) + if (!dict || !val) return NULL; + assert(dict->type == BENCODE_DICTIONARY); str = bencode_string_len(dict->buffer, key, keylen); if (!str) @@ -234,6 +245,8 @@ bencode_item_t *bencode_dictionary_add_len(bencode_item_t *dict, const char *key } bencode_item_t *bencode_list_add(bencode_item_t *list, bencode_item_t *item) { + if (!list || !item) + return NULL; assert(list->type == BENCODE_LIST); __bencode_container_add(list, item); return item; @@ -309,7 +322,8 @@ static int __bencode_str_dump(char *out, bencode_item_t *item) { struct iovec *bencode_iovec(bencode_item_t *root, int *cnt, unsigned int head, unsigned int tail) { struct iovec *ret; - assert(root != NULL); + if (!root) + return NULL; assert(cnt != NULL); assert(root->iov_cnt > 0); @@ -324,7 +338,8 @@ char *bencode_collapse(bencode_item_t *root, int *len) { char *ret; int l; - assert(root != NULL); + if (!root) + return NULL; assert(root->str_len > 0); ret = __bencode_alloc(root->buffer, root->str_len + 1); @@ -340,7 +355,8 @@ char *bencode_collapse_dup(bencode_item_t *root, int *len) { char *ret; int l; - assert(root != NULL); + if (!root) + return NULL; assert(root->str_len > 0); ret = BENCODE_MALLOC(root->str_len + 1); diff --git a/daemon/bencode.h b/daemon/bencode.h index d31167133..3c6ba750a 100644 --- a/daemon/bencode.h +++ b/daemon/bencode.h @@ -54,6 +54,7 @@ struct bencode_item { struct bencode_buffer { struct __bencode_buffer_piece *pieces; struct __bencode_free_list *free_list; + int error:1; };