18.08.2015 21:03, Josef Bacik пишет:
If we cannot open a connection to our dns server we will have NULL sockets in our array, so don't do the cleanup on any sockets that didn't get created.
We can avoid having holes to start with. Could you test attached patch?
Signed-off-by: Josef Bacik <jba...@fb.com> --- grub-core/net/dns.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/grub-core/net/dns.c b/grub-core/net/dns.c index 9d0c8fc..c356318 100644 --- a/grub-core/net/dns.c +++ b/grub-core/net/dns.c @@ -601,7 +601,10 @@ grub_net_dns_lookup (const char *name, grub_free (data.name); grub_netbuff_free (nb); for (j = 0; j < send_servers; j++) - grub_net_udp_close (sockets[j]); + { + if (sockets[j]) + grub_net_udp_close (sockets[j]); + } grub_free (sockets);
From: Andrei Borzenkov <arvidj...@gmail.com> Subject: [PATCH] net: avoid closing NULL socket in DNS lookup Refactor code so that we do not store NULL pointers in array of in-flight DNS servers. Reported-By: Josef Bacik <jba...@fb.com> --- grub-core/net/dns.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/grub-core/net/dns.c b/grub-core/net/dns.c index 9d0c8fc..953f3be 100644 --- a/grub-core/net/dns.c +++ b/grub-core/net/dns.c @@ -437,7 +437,7 @@ grub_net_dns_lookup (const char *name, struct recv_data data = {naddresses, addresses, cache, grub_cpu_to_be16 (id++), 0, 0, name, 0}; grub_uint8_t *nbd; - int have_server = 0; + grub_size_t try_server = 0; if (!servers) { @@ -543,33 +543,31 @@ grub_net_dns_lookup (const char *name, for (i = 0; i < n_servers * 4; i++) { /* Connect to a next server. */ - while (!(i & 1) && send_servers < n_servers) + while (!(i & 1) && try_server < n_servers) { - sockets[send_servers] = grub_net_udp_open (servers[send_servers], + sockets[send_servers] = grub_net_udp_open (servers[try_server++], DNS_PORT, recv_hook, &data); - send_servers++; - if (!sockets[send_servers - 1]) + if (!sockets[send_servers]) { err = grub_errno; grub_errno = GRUB_ERR_NONE; } else { - have_server = 1; + send_servers++; break; } } - if (!have_server) + if (!send_servers) goto out; if (*data.naddresses) goto out; for (j = 0; j < send_servers; j++) { grub_err_t err2; - if (!sockets[j]) - continue; + nb->data = nbd; grub_size_t t = 0; -- tg: (ba218c1..) u/dns-NULL-dereference (depends on: master)
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel