diff options
-rw-r--r-- | src/lib/rib.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/lib/rib.c b/src/lib/rib.c index 3839849c..31ab372f 100644 --- a/src/lib/rib.c +++ b/src/lib/rib.c @@ -259,7 +259,7 @@ static int rnode_add_child(struct rnode * node, break; } - list_add(&c->next, p); + list_add_tail(&c->next, p); ++node->chlen; @@ -1216,10 +1216,11 @@ static ro_msg_t * rnode_pack(struct rnode * node, } msg->n_children = node->chlen; + list_for_each(p, &node->children) { struct child * c = list_entry(p, struct child, next); msgs[n] = rnode_pack(c->node, flags, false); - if (msgs[n++] == NULL) { + if (msgs[n] == NULL) { int i; for (i = 0; i < n; ++i) free(msgs[i]); @@ -1227,6 +1228,7 @@ static ro_msg_t * rnode_pack(struct rnode * node, free(msg); return NULL; } + ++n; } msg->children = msgs; } @@ -1264,28 +1266,29 @@ ssize_t rib_pack(const char * path, } msg = rnode_pack(node, flags, true); - - pthread_rwlock_unlock(&rib.lock); - if (msg == NULL) { - free_ro_msg(msg); + pthread_rwlock_unlock(&rib.lock); return -EPERM; } len = ro_msg__get_packed_size(msg); if (len == 0) { + pthread_rwlock_unlock(&rib.lock); free_ro_msg(msg); return 0; } *buf = malloc(len); if (*buf == NULL) { + pthread_rwlock_unlock(&rib.lock); free_ro_msg(msg); return -ENOMEM; } ro_msg__pack(msg, *buf); + pthread_rwlock_unlock(&rib.lock); + free_ro_msg(msg); return len; @@ -1375,8 +1378,10 @@ int rib_unpack(uint8_t * packed, if (ret == 0 && msg->has_hash) { root = rnode_get_child(root, msg->name); - if (memcmp(msg->hash.data, root->sha3, sha3_256_hash_size)) - ret = -EFAULT; + if (memcmp(msg->hash.data, root->sha3, sha3_256_hash_size)) { + ro_msg__free_unpacked(msg, NULL); + return -EFAULT; + } } ro_msg__free_unpacked(msg, NULL); |