diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-01-04 14:16:57 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-01-04 14:19:17 +0100 |
commit | 8da00687d65f06160827e4cd469c330d3a73a9d9 (patch) | |
tree | 3a96c0c925cdb0a3262f7d41be74e686bc3f24e7 /src/sync-notrack.c | |
parent | 7bb73190b8702a57041ea7280455b078c987d886 (diff) | |
download | conntrack-tools-8da00687d65f06160827e4cd469c330d3a73a9d9.tar.gz conntrack-tools-8da00687d65f06160827e4cd469c330d3a73a9d9.zip |
conntrackd: fix checking of return value of queue_add()
Most callers of queue_add() assume that it returns != 0 in case of
success. However, it may return -1 in case that the queue gets full.
In that case, most callers have to:
- release the object that they want to enqueue.
- decrement the refcount, in case they have bumped it.
However, most of these callers are using the tx_queue which currently
has no limit in size at all. This fix is necessary in case that I
decide to limit the size of the transmission queue in the future
(which makes a lot of sense indeed).
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/sync-notrack.c')
-rw-r--r-- | src/sync-notrack.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/sync-notrack.c b/src/sync-notrack.c index c4ad941..06af58b 100644 --- a/src/sync-notrack.c +++ b/src/sync-notrack.c @@ -68,7 +68,8 @@ static void tx_queue_add_ctlmsg(uint32_t flags, uint32_t from, uint32_t to) ack->from = from; ack->to = to; - queue_add(STATE_SYNC(tx_queue), &qobj->qnode); + if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) + queue_object_free(qobj); } static int do_cache_to_tx(void *data1, void *data2) @@ -76,7 +77,7 @@ static int do_cache_to_tx(void *data1, void *data2) struct cache_object *obj = data2; struct cache_notrack *cn = cache_get_extra(STATE(mode)->internal->data, obj); - if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) + if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0) cache_object_get(obj); return 0; } @@ -219,7 +220,7 @@ static void notrack_enqueue(struct cache_object *obj, int query) { struct cache_notrack *cn = cache_get_extra(STATE(mode)->internal->data, obj); - if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) + if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0) cache_object_get(obj); } @@ -236,7 +237,8 @@ static void tx_queue_add_ctlmsg2(uint32_t flags) ctl->type = NET_T_CTL; ctl->flags = flags; - queue_add(STATE_SYNC(tx_queue), &qobj->qnode); + if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) + queue_object_free(qobj); } static void do_alive_alarm(struct alarm_block *a, void *data) |