The configuration IDs assigned to individual sources (used when they
don't have a resolved IP address) and pools of sources are 32-bit. The
ID could overflow if some sources were very frequently removed and added
again. Two unrelated sources could end up with the same ID, causing some
operations to unexpectedly impact only one or both sources.
Make sure the ID is currently unused before assigning it to a new source.
static uint32_t
get_next_conf_id(uint32_t *conf_id)
{
+ SourceRecord *record;
+ unsigned int i;
+
+again:
last_conf_id++;
+ /* Make sure the ID is not already used (after 32-bit wraparound) */
+ for (i = 0; i < ARR_GetSize(records); i++) {
+ record = get_record(i);
+ if (record->remote_addr && record->conf_id == last_conf_id)
+ goto again;
+ }
+
if (conf_id)
*conf_id = last_conf_id;