Browse Source

merge bencode from kamailio

git.mgm/mediaproxy-ng/2.2
Richard Fuchs 13 years ago
parent
commit
a59cd22479
2 changed files with 23 additions and 6 deletions
  1. +22
    -6
      daemon/bencode.c
  2. +1
    -0
      daemon/bencode.h

+ 22
- 6
daemon/bencode.c View File

@ -85,6 +85,7 @@ int bencode_buffer_init(bencode_buffer_t *buf) {
if (!buf->pieces) if (!buf->pieces)
return -1; return -1;
buf->free_list = NULL; buf->free_list = NULL;
buf->error = 0;
return 0; return 0;
} }
@ -92,14 +93,19 @@ static void *__bencode_alloc(bencode_buffer_t *buf, unsigned int size) {
struct __bencode_buffer_piece *piece; struct __bencode_buffer_piece *piece;
void *ret; void *ret;
if (buf->error)
return NULL;
piece = buf->pieces; piece = buf->pieces;
if (size <= piece->left) if (size <= piece->left)
goto alloc; goto alloc;
piece = __bencode_piece_new(size); piece = __bencode_piece_new(size);
if (!piece)
if (!piece) {
buf->error = 1;
return NULL; return NULL;
}
piece->next = buf->pieces; piece->next = buf->pieces;
buf->pieces = piece; 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) { 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->parent == NULL);
assert(child->sibling == 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 *bencode_dictionary_add_len(bencode_item_t *dict, const char *key, int keylen, bencode_item_t *val) {
bencode_item_t *str; bencode_item_t *str;
assert(dict->type == BENCODE_DICTIONARY);
if (!val)
if (!dict || !val)
return NULL; return NULL;
assert(dict->type == BENCODE_DICTIONARY);
str = bencode_string_len(dict->buffer, key, keylen); str = bencode_string_len(dict->buffer, key, keylen);
if (!str) 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) { bencode_item_t *bencode_list_add(bencode_item_t *list, bencode_item_t *item) {
if (!list || !item)
return NULL;
assert(list->type == BENCODE_LIST); assert(list->type == BENCODE_LIST);
__bencode_container_add(list, item); __bencode_container_add(list, item);
return 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 *bencode_iovec(bencode_item_t *root, int *cnt, unsigned int head, unsigned int tail) {
struct iovec *ret; struct iovec *ret;
assert(root != NULL);
if (!root)
return NULL;
assert(cnt != NULL); assert(cnt != NULL);
assert(root->iov_cnt > 0); assert(root->iov_cnt > 0);
@ -324,7 +338,8 @@ char *bencode_collapse(bencode_item_t *root, int *len) {
char *ret; char *ret;
int l; int l;
assert(root != NULL);
if (!root)
return NULL;
assert(root->str_len > 0); assert(root->str_len > 0);
ret = __bencode_alloc(root->buffer, root->str_len + 1); 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; char *ret;
int l; int l;
assert(root != NULL);
if (!root)
return NULL;
assert(root->str_len > 0); assert(root->str_len > 0);
ret = BENCODE_MALLOC(root->str_len + 1); ret = BENCODE_MALLOC(root->str_len + 1);


+ 1
- 0
daemon/bencode.h View File

@ -54,6 +54,7 @@ struct bencode_item {
struct bencode_buffer { struct bencode_buffer {
struct __bencode_buffer_piece *pieces; struct __bencode_buffer_piece *pieces;
struct __bencode_free_list *free_list; struct __bencode_free_list *free_list;
int error:1;
}; };


Loading…
Cancel
Save