mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-21 18:03:41 +03:00
99573ebca6
In 0e0fd08fc832b8f42e567d722d388eba086da5ff I added reference counts to keep track of the DnsQueryCandidate objects. Unfortunately, dns_query_unref_candidates() was written as while (q->candidates) dns_query_candidate_unref(q->candidates); i.e. it would keep dropping the reference count as many times as needed for it to hit 0, making the patch less than fully effective. dns_query_unref_candidates() is renamed to dns_query_detach_candidates() and changed to drop exactly one reference from each of the linked candidates. Example failure: ==463== Invalid read of size 8 ==463== at 0x419C93: dns_query_candidate_go (resolved-dns-query.c:159) ==463== by 0x41A143: dns_query_candidate_notify (resolved-dns-query.c:304) ==463== by 0x434BD6: dns_transaction_complete (resolved-dns-transaction.c:437) ==463== by 0x436A0F: dns_transaction_process_dnssec (resolved-dns-transaction.c:976) ==463== by 0x4378C1: dns_transaction_process_reply (resolved-dns-transaction.c:1387) ==463== by 0x437CE9: on_dns_packet (resolved-dns-transaction.c:1444) ==463== by 0x4B2DC9B: source_dispatch (sd-event.c:3512) ==463== by 0x4B2FB1F: sd_event_dispatch (sd-event.c:4077) ==463== by 0x4B2FFFA: sd_event_run (sd-event.c:4138) ==463== by 0x4B301D6: sd_event_loop (sd-event.c:4159) ==463== by 0x464A24: run (resolved.c:92) ==463== by 0x464B3C: main (resolved.c:99) ==463== Address 0x5f409d0 is 32 bytes inside a block of size 72 free'd ==463== at 0x48410E4: free (vg_replace_malloc.c:755) ==463== by 0x418EDF: mfree (alloc-util.h:48) ==463== by 0x4197E8: dns_query_candidate_free (resolved-dns-query.c:67) ==463== by 0x4198B7: dns_query_candidate_unref (resolved-dns-query.c:70) ==463== by 0x41A2E3: dns_query_unref_candidates (resolved-dns-query.c:337) ==463== by 0x41C5FE: dns_query_cname_redirect (resolved-dns-query.c:1028) ==463== by 0x41CA04: dns_query_process_cname_one (resolved-dns-query.c:1128) ==463== by 0x41CA80: dns_query_process_cname_many (resolved-dns-query.c:1157) ==463== by 0x40C0BD: bus_method_resolve_hostname_complete (resolved-bus.c:198) ==463== by 0x41B312: dns_query_complete (resolved-dns-query.c:562) ==463== by 0x41C1AC: dns_query_accept (resolved-dns-query.c:922) ==463== by 0x41C2C4: dns_query_ready (resolved-dns-query.c:955) ==463== by 0x41A162: dns_query_candidate_notify (resolved-dns-query.c:314) ==463== by 0x434BD6: dns_transaction_complete (resolved-dns-transaction.c:437) ==463== by 0x438995: dns_transaction_prepare (resolved-dns-transaction.c:1728) ==463== by 0x43921D: dns_transaction_go (resolved-dns-transaction.c:1928) ==463== by 0x419C7C: dns_query_candidate_go (resolved-dns-query.c:163) ==463== by 0x41A143: dns_query_candidate_notify (resolved-dns-query.c:304) ==463== by 0x434BD6: dns_transaction_complete (resolved-dns-transaction.c:437) ==463== by 0x436A0F: dns_transaction_process_dnssec (resolved-dns-transaction.c:976) ==463== by 0x4378C1: dns_transaction_process_reply (resolved-dns-transaction.c:1387) ==463== by 0x437CE9: on_dns_packet (resolved-dns-transaction.c:1444) ==463== by 0x4B2DC9B: source_dispatch (sd-event.c:3512) ==463== by 0x4B2FB1F: sd_event_dispatch (sd-event.c:4077) ==463== by 0x4B2FFFA: sd_event_run (sd-event.c:4138) ==463== by 0x4B301D6: sd_event_loop (sd-event.c:4159) ==463== by 0x464A24: run (resolved.c:92) ==463== by 0x464B3C: main (resolved.c:99) ==463== Block was alloc'd at ==463== at 0x483E86F: malloc (vg_replace_malloc.c:380) ==463== by 0x418F81: malloc_multiply (alloc-util.h:96) ==463== by 0x419378: dns_query_candidate_new (resolved-dns-query.c:23) ==463== by 0x41B42C: dns_query_add_candidate (resolved-dns-query.c:582) ==463== by 0x41BB7A: dns_query_go (resolved-dns-query.c:762) ==463== by 0x40CE3A: bus_method_resolve_hostname (resolved-bus.c:464) ==463== by 0x4A84B86: method_callbacks_run (bus-objects.c:414) ==463== by 0x4A87961: object_find_and_run (bus-objects.c:1323) ==463== by 0x4A87FEE: bus_process_object (bus-objects.c:1443) ==463== by 0x4AA3434: process_message (sd-bus.c:2964) ==463== by 0x4AA3623: process_running (sd-bus.c:3006) ==463== by 0x4AA4110: bus_process_internal (sd-bus.c:3226) ==463== by 0x4AA41EF: sd_bus_process (sd-bus.c:3253) ==463== by 0x4AA5343: io_callback (sd-bus.c:3604) ==463== by 0x4B2DC9B: source_dispatch (sd-event.c:3512) ==463== by 0x4B2FB1F: sd_event_dispatch (sd-event.c:4077) ==463== by 0x4B2FFFA: sd_event_run (sd-event.c:4138) ==463== by 0x4B301D6: sd_event_loop (sd-event.c:4159) ==463== by 0x464A24: run (resolved.c:92) ==463== by 0x464B3C: main (resolved.c:99) Fixes #19376. (cherry picked from commit c856ef0457c35e9edfdbf085b69ec81c126d48e5) (cherry picked from commit 89324e233eef767334d9bfe5eed96956c973c2ad) (cherry picked from commit c8d7fab2286384b19ff6328cece107c4c02d7bb8)