summaryrefslogtreecommitdiff
path: root/src/sync-ftfw.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2012-01-04 14:16:57 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2012-01-04 14:19:17 +0100
commit8da00687d65f06160827e4cd469c330d3a73a9d9 (patch)
tree3a96c0c925cdb0a3262f7d41be74e686bc3f24e7 /src/sync-ftfw.c
parent7bb73190b8702a57041ea7280455b078c987d886 (diff)
downloadconntrack-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-ftfw.c')
-rw-r--r--src/sync-ftfw.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/sync-ftfw.c b/src/sync-ftfw.c
index 86edeab..581b5ca 100644
--- a/src/sync-ftfw.c
+++ b/src/sync-ftfw.c
@@ -107,7 +107,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 void tx_queue_add_ctlmsg2(uint32_t flags)
@@ -123,7 +124,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);
}
/* this function is called from the alarm framework */
@@ -173,7 +175,7 @@ static int do_cache_to_tx(void *data1, void *data2)
queue_del(&cn->qnode);
queue_add(STATE_SYNC(tx_queue), &cn->qnode);
} else {
- 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;
@@ -554,7 +556,7 @@ static void ftfw_enqueue(struct cache_object *obj, int type)
queue_del(&cn->qnode);
queue_add(STATE_SYNC(tx_queue), &cn->qnode);
} else {
- if (queue_add(STATE_SYNC(tx_queue), &cn->qnode))
+ if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0)
cache_object_get(obj);
}
}