[pkg-dhcp-devel] Bug#858580: isc-dhcp-client: dhclient does not properly support interface names with length > 13

Jon Seymour jon.seymour at gmail.com
Fri Mar 24 01:18:53 UTC 2017


Package: isc-dhcp-client
Version: 4.3.1-6+deb8u2
Severity: normal
Tags: upstream

Dear Maintainer,

dhclient does not cleanly support interface names with lengths > 13.

debian's packaging of systemd can routinely generate interface names with length 15.

If the length is 15, dhclient fails with messages like this:

	debian at beaglebone:~/isc-dhcp-client/isc-dhcp-4.3.1$ sudo dhclient -d enxe46f13f3df43
	Internet Systems Consortium DHCP Client 4.3.1
	Copyright 2004-2014 Internet Systems Consortium.
	All rights reserved.
	For info, please visit https://www.isc.org/software/dhcp/

	Bind socket to interface: No such device

	If you think you have received this message due to a bug rather
	than a configuration issue please read the section on submitting
	bugs on either our web page at www.isc.org or in the README file
	before submitting a bug.  These pages explain the proper
	process and the information we find helpful for debugging..

	exiting.

If the length is 14, dhclient fails with messages like this:

	debian at beaglebone:~/isc-dhcp-client/isc-dhcp-4.3.1$ sudo dhclient -d enxe46f13f3df4
	Internet Systems Consortium DHCP Client 4.3.1
	Copyright 2004-2014 Internet Systems Consortium.
	All rights reserved.
	For info, please visit https://www.isc.org/software/dhcp/

	Listening on LPF/enxe46f13f3df4/e4:6f:13:f3:df:43
	Sending on   LPF/enxe46f13f3df4/e4:6f:13:f3:df:43
	Sending on   Socket/fallback
	DHCPDISCOVER on enxe46f13f3df4 to 255.255.255.255 port 67 interval 3
	send_packet: No such device
	dhclient.c:1966: Failed to send 300 byte long packet over enxe46f13f3df4 interface.
	DHCPDISCOVER on enxe46f13f3df4 to 255.255.255.255 port 67 interval 6
	send_packet: No such device
	dhclient.c:1966: Failed to send 300 byte long packet over enxe46f13f3df4 interface.

Interface names lengths of no more than 13 worked as expected:

	debian at beaglebone:~/isc-dhcp-client/isc-dhcp-4.3.1$ sudo dhclient -d enxe46f13f3df
	Internet Systems Consortium DHCP Client 4.3.1
	Copyright 2004-2014 Internet Systems Consortium.
	All rights reserved.
	For info, please visit https://www.isc.org/software/dhcp/

	Listening on LPF/enxe46f13f3df/e4:6f:13:f3:df:43
	Sending on   LPF/enxe46f13f3df/e4:6f:13:f3:df:43
	Sending on   Socket/fallback
	DHCPDISCOVER on enxe46f13f3df to 255.255.255.255 port 67 interval 7
	DHCPDISCOVER on enxe46f13f3df to 255.255.255.255 port 67 interval 14
	DHCPREQUEST on enxe46f13f3df to 255.255.255.255 port 67
	DHCPOFFER from 192.168.1.1
	DHCPACK from 192.168.1.1
	bound to 192.168.1.159 -- renewal in 35492 seconds.
	The difference in behaviour is apparently caused by the name being truncated before the trailing
	nul in the first case, but being truncated immediately prior to the trailing nul in the second case.

The root cause is a strncpy in common/lpf.c:

      /* Bind to the interface name */
        memset (&sa, 0, sizeof sa);
        sa.sa_family = AF_PACKET;
        strncpy (sa.sa_data, (const char *)info -> ifp, sizeof sa.sa_data);
        if (bind (sock, &sa, sizeof sa)) {
        	....

which silently performs a truncated copy of 16 byte structure (info->lfp) into a 14 byte structure.

Since the results of silently truncating the name are undefined, it would be better 
if dhclient instead aborted with an error message indicating that the long interface name
cannot be successfully copied. 

Note that systemd can generate 15 character interface names derived from a mac address of the 
underlying device though, by default, it does not.

However, debian's packaging of udevd includes  /lib/udev/rules.d/73-usb-net-by-mac.rules which 
causes USB ethernet devices on at least some platforms, BeagleBone, to generate long
MAC-address based device names using the net_id udev plugin.

To experiment with different interface name lengths, I added /etc/udev/rules.d/99-local.rules 

#
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="ax88179_178a", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="enxe46f13f3df43"

To test different lengths, I truncated NAME to different lengths, then re-hotplugged the relevant device.


-- System Information:
Debian Release: 8.7
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: armhf (armv7l)

Kernel: Linux 4.4.26-ti-r59 (SMP w/1 CPU core)
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages isc-dhcp-client depends on:
ii  debianutils       4.4+b1
ii  iproute2          3.16.0-2
ii  isc-dhcp-common   4.3.1-6+deb8u2
ii  libc6             2.19-18+deb8u7
ii  libdns-export100  1:9.9.5.dfsg-9+deb8u10
ii  libirs-export91   1:9.9.5.dfsg-9+deb8u10
ii  libisc-export95   1:9.9.5.dfsg-9+deb8u10

isc-dhcp-client recommends no packages.

Versions of packages isc-dhcp-client suggests:
pn  avahi-autoipd  <none>
pn  resolvconf     <none>

-- debconf information:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "en_AU.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory



More information about the pkg-dhcp-devel mailing list