diff options
Diffstat (limited to 'main/dhcpcd/fix-3f10c9b871.patch')
| -rw-r--r-- | main/dhcpcd/fix-3f10c9b871.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/main/dhcpcd/fix-3f10c9b871.patch b/main/dhcpcd/fix-3f10c9b871.patch new file mode 100644 index 0000000000..903d843a2e --- /dev/null +++ b/main/dhcpcd/fix-3f10c9b871.patch @@ -0,0 +1,79 @@ +http://roy.marples.name/projects/dhcpcd/tktview?name=3f10c9b871 + +Index: dhcp.c +================================================================== +--- a/dhcp.c ++++ b/dhcp.c +@@ -1082,13 +1082,16 @@ + } + + *p++ = DHO_END; + len = (size_t)(p - (uint8_t *)bootp); + +- /* Pad out to the BOOTP minimum message length. +- * Some DHCP servers incorrectly require this. */ +- while (len < BOOTP_MESSAGE_LENTH_MIN) { ++ /* Pad out to the BOOTP message length. ++ * Even if we send a DHCP packet with a variable length vendor area, ++ * some servers / relay agents don't like packets smaller than ++ * a BOOTP message which is fine because that's stipulated ++ * in RFC1542 section 2.1. */ ++ while (len < sizeof(*bootp)) { + *p++ = DHO_PAD; + len++; + } + + if (ifo->auth.options & DHCPCD_AUTH_SEND && auth_len != 0) +@@ -3134,18 +3137,30 @@ + { + logger(ifp->ctx, LOG_WARNING, + "%s: server %s is not destination", + ifp->name, inet_ntoa(from)); + } +- ++ /* ++ * DHCP has a variable option area rather than a fixed ++ * vendor area. ++ * Because DHCP uses the BOOTP protocol it should ++ * still send BOOTP sized packets to be RFC compliant. ++ * However some servers send a truncated vendor area. ++ * dhcpcd can work fine without the vendor area being sent. ++ */ + bytes = get_udp_data(&bootp, buf); +- if (bytes < sizeof(struct bootp)) { ++ if (bytes < offsetof(struct bootp, vend)) { + logger(ifp->ctx, LOG_ERR, + "%s: truncated packet (%zu) from %s", + ifp->name, bytes, inet_ntoa(from)); + continue; + } ++ /* But to make our IS_DHCP macro easy, ensure the vendor ++ * area has at least 4 octets. */ ++ while (bytes < offsetof(struct bootp, vend) + 4) ++ bootp[bytes++] = '\0'; ++ + dhcp_handledhcp(ifp, (struct bootp *)bootp, bytes, &from); + if (state->raw_fd == -1) + break; + } + } + +Index: dhcp.h +================================================================== +--- a/dhcp.h ++++ b/dhcp.h +@@ -129,13 +129,10 @@ + FQDN_NONE = 0x18, + FQDN_PTR = 0x20, + FQDN_BOTH = 0x31 + }; + +-/* Some crappy DHCP servers require the BOOTP minimum length */ +-#define BOOTP_MESSAGE_LENTH_MIN 300 +- + /* Don't import common.h as that defines __unused which causes problems + * on some Linux systems which define it as part of a structure */ + #if __GNUC__ > 2 || defined(__INTEL_COMPILER) + # ifndef __packed + # define __packed __attribute__((__packed__)) + |
