chiark / gitweb /
sd-resolve: fix allocation if query ids, never reuse them
authorLennart Poettering <lennart@poettering.net>
Tue, 12 Aug 2014 17:29:27 +0000 (19:29 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 12 Aug 2014 17:29:27 +0000 (19:29 +0200)
src/libsystemd/sd-resolve/sd-resolve.c

index df63f1de9e407c39d373a5f5829e23e55008d686..15f19386393ef212c304394c010439f48880befc 100644 (file)
@@ -85,7 +85,7 @@ struct sd_resolve {
         pthread_t workers[WORKERS_MAX];
         unsigned n_valid_workers;
 
         pthread_t workers[WORKERS_MAX];
         unsigned n_valid_workers;
 
-        unsigned current_id, current_index;
+        unsigned current_id;
         sd_resolve_query* query_array[QUERIES_MAX];
         unsigned n_queries, n_done;
 
         sd_resolve_query* query_array[QUERIES_MAX];
         unsigned n_queries, n_done;
 
@@ -1024,21 +1024,17 @@ static int alloc_query(sd_resolve *resolve, bool floating, sd_resolve_query **_q
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
-        while (resolve->query_array[resolve->current_index]) {
-                resolve->current_index++;
+        while (resolve->query_array[resolve->current_id % QUERIES_MAX])
                 resolve->current_id++;
 
                 resolve->current_id++;
 
-                resolve->current_index %= QUERIES_MAX;
-        }
-
-        q = resolve->query_array[resolve->current_index] = new0(sd_resolve_query, 1);
+        q = resolve->query_array[resolve->current_id % QUERIES_MAX] = new0(sd_resolve_query, 1);
         if (!q)
                 return -ENOMEM;
 
         q->n_ref = 1;
         q->resolve = resolve;
         q->floating = floating;
         if (!q)
                 return -ENOMEM;
 
         q->n_ref = 1;
         q->resolve = resolve;
         q->floating = floating;
-        q->id = resolve->current_id;
+        q->id = resolve->current_id++;
 
         if (!floating)
                 sd_resolve_ref(resolve);
 
         if (!floating)
                 sd_resolve_ref(resolve);