From: Bruce A. Johnson Date: Fri, 5 Jan 2018 09:02:38 +0000 (-0500) Subject: systemd-udevd: fix speed/duplex processing with valid .link files (#7808) X-Git-Tag: v237~143 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94d4acbe4b496c0f0c4e5e2143426751c8c5f9a9;p=thirdparty%2Fsystemd.git systemd-udevd: fix speed/duplex processing with valid .link files (#7808) Including BitsPerSecond or Duplex values in .link files did not work when set_slinksettings was called because the routine was not copying the base parameters to the structure given to ioctl. As a result, EINVAL was always reported, and no change occurred on the Ethernet device. --- diff --git a/src/udev/net/ethtool-util.c b/src/udev/net/ethtool-util.c index 3ed8a51fd45..8921ca92900 100644 --- a/src/udev/net/ethtool-util.c +++ b/src/udev/net/ethtool-util.c @@ -473,15 +473,15 @@ static int set_slinksettings(int *fd, struct ifreq *ifr, const struct ethtool_li struct { struct ethtool_link_settings req; __u32 link_mode_data[3 * ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32]; - } ecmd = { - .req.cmd = ETHTOOL_SLINKSETTINGS, - }; + } ecmd = {}; unsigned int offset; int r; if (u->base.cmd != ETHTOOL_GLINKSETTINGS || u->base.link_mode_masks_nwords <= 0) return -EINVAL; + memcpy(&ecmd.req, &u->base, sizeof(ecmd.req)); + ecmd.req.cmd = ETHTOOL_SLINKSETTINGS; offset = 0; memcpy(&ecmd.link_mode_data[offset], u->link_modes.supported, 4 * ecmd.req.link_mode_masks_nwords);