I noticed when debugging a problem that we'd corrupt memory if our dns server didn't respond fast enough and we ended up asking for both an AAAA and A record for a server. The problem is we alloc data->addresses based on the number of addresses in the packet, but we populate it based on data->naddresses. So we get the AAAA record with one address, and we add that, then we get the A record with one address and now data->naddresses == 1 but the ancount is 1, so we allocate data->addresses to hold one address but write the new address outside the array. We also leak the old addresses memory. So fix this by noticing if we already have an address and free the old memory and reset naddresses so we don't overflow our new array.
Signed-off-by: Josef Bacik <jba...@fb.com> --- grub-core/net/dns.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/grub-core/net/dns.c b/grub-core/net/dns.c index 86e609b..7a6c4b4 100644 --- a/grub-core/net/dns.c +++ b/grub-core/net/dns.c @@ -276,6 +276,9 @@ recv_hook (grub_net_udp_socket_t sock __attribute__ ((unused)), ptr++; ptr += 4; } + if (*data->naddresses) + grub_free (*data->addresses); + *data->naddresses = 0; *data->addresses = grub_malloc (sizeof ((*data->addresses)[0]) * grub_be_to_cpu16 (head->ancount)); if (!*data->addresses) -- 1.8.1 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel