Birdlib: Do cleanups after remove/free
To avoid byzantine behavior in case of some errors, linked lists are cleared after rem_node() and resource headers are cleared after rfree().
This commit is contained in:
parent
39a6b19d6d
commit
665b8e5283
4 changed files with 5 additions and 29 deletions
19
lib/lists.c
19
lib/lists.c
|
@ -88,7 +88,7 @@ insert_node(node *n, node *after)
|
|||
* rem_node - remove a node from a list
|
||||
* @n: node to be removed
|
||||
*
|
||||
* Removes a node @n from the list it's linked in.
|
||||
* Removes a node @n from the list it's linked in. Afterwards, node @n is cleared.
|
||||
*/
|
||||
LIST_INLINE void
|
||||
rem_node(node *n)
|
||||
|
@ -96,23 +96,6 @@ rem_node(node *n)
|
|||
node *z = n->prev;
|
||||
node *x = n->next;
|
||||
|
||||
z->next = x;
|
||||
x->prev = z;
|
||||
}
|
||||
|
||||
/**
|
||||
* rem2_node - remove a node from a list, with cleanup
|
||||
* @n: node to be removed
|
||||
*
|
||||
* Removes a node @n from the list it's linked in and resets its pointers to NULL.
|
||||
* Useful if you want to distinguish between linked and unlinked nodes.
|
||||
*/
|
||||
LIST_INLINE void
|
||||
rem2_node(node *n)
|
||||
{
|
||||
node *z = n->prev;
|
||||
node *x = n->next;
|
||||
|
||||
z->next = x;
|
||||
x->prev = z;
|
||||
n->next = NULL;
|
||||
|
|
|
@ -61,7 +61,6 @@ typedef struct list { /* In fact two overlayed nodes */
|
|||
void add_tail(list *, node *);
|
||||
void add_head(list *, node *);
|
||||
void rem_node(node *);
|
||||
void rem2_node(node *);
|
||||
void add_tail_list(list *, list *);
|
||||
void init_list(list *);
|
||||
void insert_node(node *, node *);
|
||||
|
|
|
@ -163,6 +163,7 @@ rfree(void *res)
|
|||
if (r->n.next)
|
||||
rem_node(&r->n);
|
||||
r->class->free(r);
|
||||
r->class = NULL;
|
||||
xfree(r);
|
||||
}
|
||||
|
||||
|
@ -383,16 +384,9 @@ mb_allocz(pool *p, unsigned size)
|
|||
void *
|
||||
mb_realloc(void *m, unsigned size)
|
||||
{
|
||||
struct mblock *ob = NULL;
|
||||
struct mblock *b = SKIP_BACK(struct mblock, data, m);
|
||||
|
||||
if (m)
|
||||
{
|
||||
ob = SKIP_BACK(struct mblock, data, m);
|
||||
if (ob->r.n.next)
|
||||
rem_node(&ob->r.n);
|
||||
}
|
||||
|
||||
struct mblock *b = xrealloc(ob, sizeof(struct mblock) + size);
|
||||
b = xrealloc(b, sizeof(struct mblock) + size);
|
||||
replace_node(&b->r.n, &b->r.n);
|
||||
b->size = size;
|
||||
return b->data;
|
||||
|
|
|
@ -872,7 +872,7 @@ bfd_notify_hook(sock *sk, int len)
|
|||
WALK_LIST_FIRST(s, tmp_list)
|
||||
{
|
||||
bfd_lock_sessions(p);
|
||||
rem2_node(&s->n);
|
||||
rem_node(&s->n);
|
||||
state = s->loc_state;
|
||||
diag = s->loc_diag;
|
||||
bfd_unlock_sessions(p);
|
||||
|
|
Loading…
Reference in a new issue