]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemd-udevd: fix speed/duplex processing with valid .link files (#7808)
authorBruce A. Johnson <bajhn@users.noreply.github.com>
Fri, 5 Jan 2018 09:02:38 +0000 (04:02 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 5 Jan 2018 09:02:38 +0000 (10:02 +0100)
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.

src/udev/net/ethtool-util.c

index 3ed8a51fd45015ea6753f7b1275b55f210a1e829..8921ca92900eb41a89f70ff1c9b900b70f5d9c80 100644 (file)
@@ -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);