diff options
author | Thomas Haller <thaller@redhat.com> | 2019-02-04 09:36:17 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-02-04 09:47:00 +0100 |
commit | 51c682df38fa032599c6c0e4556136c7d6d7c504 (patch) | |
tree | 11f4dc96846d173690d464e702e27b3845574ea5 /src/basic/hashmap.c | |
parent | hashmap: avoid uninitialized variable warning in internal_hashmap_clear() (diff) | |
download | systemd-51c682df38fa032599c6c0e4556136c7d6d7c504.tar.xz systemd-51c682df38fa032599c6c0e4556136c7d6d7c504.zip |
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.c | 5 |
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; |