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 <jbacik@fb.com>
This commit is contained in:
Andrei Borzenkov 2015-10-12 23:16:23 +03:00
parent 76197d9be6
commit a01ab69848

View file

@ -437,7 +437,7 @@ grub_net_dns_lookup (const char *name,
struct recv_data data = {naddresses, addresses, cache, struct recv_data data = {naddresses, addresses, cache,
grub_cpu_to_be16 (id++), 0, 0, name, 0}; grub_cpu_to_be16 (id++), 0, 0, name, 0};
grub_uint8_t *nbd; grub_uint8_t *nbd;
int have_server = 0; grub_size_t try_server = 0;
if (!servers) if (!servers)
{ {
@ -543,33 +543,31 @@ grub_net_dns_lookup (const char *name,
for (i = 0; i < n_servers * 4; i++) for (i = 0; i < n_servers * 4; i++)
{ {
/* Connect to a next server. */ /* 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, DNS_PORT,
recv_hook, recv_hook,
&data); &data);
send_servers++; if (!sockets[send_servers])
if (!sockets[send_servers - 1])
{ {
err = grub_errno; err = grub_errno;
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
} }
else else
{ {
have_server = 1; send_servers++;
break; break;
} }
} }
if (!have_server) if (!send_servers)
goto out; goto out;
if (*data.naddresses) if (*data.naddresses)
goto out; goto out;
for (j = 0; j < send_servers; j++) for (j = 0; j < send_servers; j++)
{ {
grub_err_t err2; grub_err_t err2;
if (!sockets[j])
continue;
nb->data = nbd; nb->data = nbd;
grub_size_t t = 0; grub_size_t t = 0;