From 4176afdfab8726c3597c7efba76e58d5a50a74da Mon Sep 17 00:00:00 2001 From: Renato Aguiar Date: Thu, 12 May 2016 02:30:08 -0700 Subject: [PATCH] dhcpcd: Fix truncated packets issue (#4180) Add a patch with the upstream fix for the truncated packets issue. http://roy.marples.name/projects/dhcpcd/info/3fd740f3ed --- .../patches/fix-truncated-packets.patch | 77 +++++++++++++++++++ srcpkgs/dhcpcd/template | 2 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/dhcpcd/patches/fix-truncated-packets.patch diff --git a/srcpkgs/dhcpcd/patches/fix-truncated-packets.patch b/srcpkgs/dhcpcd/patches/fix-truncated-packets.patch new file mode 100644 index 00000000000..c21fd605047 --- /dev/null +++ b/srcpkgs/dhcpcd/patches/fix-truncated-packets.patch @@ -0,0 +1,77 @@ +Index: dhcp.c +================================================================== +--- dhcp.c ++++ 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 +================================================================== +--- dhcp.h ++++ 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__)) + diff --git a/srcpkgs/dhcpcd/template b/srcpkgs/dhcpcd/template index 846b18618ec..04d8ae92b36 100644 --- a/srcpkgs/dhcpcd/template +++ b/srcpkgs/dhcpcd/template @@ -1,7 +1,7 @@ # Template file for 'dhcpcd' pkgname=dhcpcd version=6.11.0 -revision=1 +revision=2 lib32disabled=yes build_style=configure configure_args="--prefix=/usr --sbindir=/usr/bin --sysconfdir=/etc --rundir=/run"