From 0d757a7fa6596dc307bd98cda2121329f121c5ce Mon Sep 17 00:00:00 2001 From: Andrzej Kacprowski Date: Fri, 21 Apr 2017 09:20:38 +0200 Subject: [PATCH 247/261] Use xid to match DHCP replies Transaction identifier (xid) from DHCP request packet is stored in network level interface and used to match request with the responses it generates. Resolves: rhbz#1370642 Signed-off-by: Andrzej Kacprowski --- grub-core/net/bootp.c | 3 ++- grub-core/net/ip.c | 1 + include/grub/net.h | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c index 7df7f5511..dfdf7e08d 100644 --- a/grub-core/net/bootp.c +++ b/grub-core/net/bootp.c @@ -769,7 +769,8 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), grub_errno = GRUB_ERR_NONE; t = 0; } - pack->ident = grub_cpu_to_be32 (t); + pack->xid = grub_cpu_to_be32 (t); + ifaces[j].dhcp_xid = pack->xid; pack->seconds = grub_cpu_to_be16 (t); grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, 6); diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c index 5a6095444..9e7930caa 100644 --- a/grub-core/net/ip.c +++ b/grub-core/net/ip.c @@ -271,6 +271,7 @@ handle_dgram (struct grub_net_buff *nb, FOR_NET_NETWORK_LEVEL_INTERFACES (inf) if (inf->card == card && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV + && inf->dhcp_xid == bootp->xid && inf->hwaddress.type == GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET && grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, sizeof (inf->hwaddress.mac)) == 0) diff --git a/include/grub/net.h b/include/grub/net.h index bd930f4dd..b1bc23048 100644 --- a/include/grub/net.h +++ b/include/grub/net.h @@ -279,6 +279,7 @@ struct grub_net_network_level_interface grub_net_interface_flags_t flags; struct grub_net_bootp_packet *dhcp_ack; grub_size_t dhcp_acklen; + grub_uint32_t dhcp_xid; void *data; }; @@ -405,7 +406,7 @@ struct grub_net_bootp_packet grub_uint8_t hw_type; /* hardware type. */ grub_uint8_t hw_len; /* hardware addr len. */ grub_uint8_t gate_hops; /* zero it. */ - grub_uint32_t ident; /* random number chosen by client. */ + grub_uint32_t xid; /* transaction id chosen by client. */ grub_uint16_t seconds; /* seconds since did initial bootstrap. */ grub_uint16_t flags; grub_uint32_t client_ip; -- 2.13.5