summaryrefslogtreecommitdiff
path: root/src/basic/hashmap.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-02-04 09:36:17 +0100
committerThomas Haller <thaller@redhat.com>2019-02-04 09:47:00 +0100
commit51c682df38fa032599c6c0e4556136c7d6d7c504 (patch)
tree11f4dc96846d173690d464e702e27b3845574ea5 /src/basic/hashmap.c
parentca3237150e965c33863addb9e89100030692d36d (diff)
downloadsystemd-51c682df38fa032599c6c0e4556136c7d6d7c504.tar.gz
hashmap: always set key output argument of internal_hashmap_first_key_and_value()
internal_hashmap_first_key_and_value() returns the first value, or %NULL if the hashmap is empty. However, hashmaps may contain %NULL values. That means, a caller getting %NULL doesn't know whether the hashmap is empty or whether the first value is %NULL. For example, a caller may be tempted to do something like: if ((val = hashmap_steal_first_key_and_value (h, (void **) key))) { // process first entry. } But this is only correct if the caller made sure that the hash is either not empty or contains no NULL values. Anyway, since a %NULL return value can signal an empty hash or a %NULL value, it seems error prone to leave the key output argument uninitialized in situations that the caller cannot clearly distinguish (without making additional assumptions).
Diffstat (limited to 'src/basic/hashmap.c')
-rw-r--r--src/basic/hashmap.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c
index 80fec8fb53..66e9e0046b 100644
--- a/src/basic/hashmap.c
+++ b/src/basic/hashmap.c
@@ -1516,8 +1516,11 @@ void *internal_hashmap_first_key_and_value(HashmapBase *h, bool remove, void **r
unsigned idx;
idx = find_first_entry(h);
- if (idx == IDX_NIL)
+ if (idx == IDX_NIL) {
+ if (ret_key)
+ *ret_key = NULL;
return NULL;
+ }
e = bucket_at(h, idx);
key = (void*) e->key;