resolved: when adding names to packet fails, remove them from label compression hash table again

let's make sure we undo any pollution of the label compression hash
table.

Fixes: #33671
This commit is contained in:
Lennart Poettering
2024-10-23 10:22:28 +02:00
parent 8ed2c62d46
commit 360105f1e7
+15 -2
View File
@@ -557,7 +557,8 @@ int dns_packet_append_name(
bool canonical_candidate,
size_t *start) {
size_t saved_size;
_cleanup_free_ char **added_entries = NULL; /* doesn't own the strings! this is just regular pointer array, not a NULL-terminated strv! */
size_t n_added_entries = 0, saved_size;
int r;
assert(p);
@@ -598,6 +599,11 @@ int dns_packet_append_name(
if (allow_compression) {
_cleanup_free_ char *s = NULL;
if (!GREEDY_REALLOC(added_entries, n_added_entries + 1)) {
r = -ENOMEM;
goto fail;
}
s = strdup(z);
if (!s) {
r = -ENOMEM;
@@ -608,7 +614,8 @@ int dns_packet_append_name(
if (r < 0)
goto fail;
TAKE_PTR(s);
/* Keep track of the entries we just added (note that the string is owned by the hashtable, not this array!) */
added_entries[n_added_entries++] = TAKE_PTR(s);
}
}
@@ -623,6 +630,12 @@ done:
return 0;
fail:
/* Remove all label compression names we added again */
FOREACH_ARRAY(s, added_entries, n_added_entries) {
hashmap_remove(p->names, *s);
free(*s);
}
dns_packet_truncate(p, saved_size);
return r;
}