From: Stefan Sperling Subject: ether_addmulti/delmulti error handling fix To: tech@openbsd.org Date: Tue, 1 Apr 2025 10:49:11 +0200 While porting some ixl(4) code to ice(4) I noticed that some drivers are hiding errors from ether_addmulti() and ether_delmulti(). Shouldn't an error be returned to userland if these functions fail in ways other than ENETRESET? Other possible errors include EAFNOSUPPORT, EINVAL (not a multicast address), and ENOBUFS. Currently, such errors result in userland assuming that the operation did succeed. diff /usr/src path + /usr/src commit - 909c4a09d503cfafb89794cd88cab47a94a6bad5 blob - 703096356465279f43ac54c6f5a8ff68cd5d1b4f file + sys/dev/pci/if_iavf.c --- sys/dev/pci/if_iavf.c +++ sys/dev/pci/if_iavf.c @@ -1005,7 +1005,8 @@ iavf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data break; case SIOCADDMULTI: - if (ether_addmulti(ifr, &sc->sc_ac) == ENETRESET) { + error = ether_addmulti(ifr, &sc->sc_ac); + if (error == ENETRESET) { error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi); if (error != 0) return (error); @@ -1021,7 +1022,8 @@ iavf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data break; case SIOCDELMULTI: - if (ether_delmulti(ifr, &sc->sc_ac) == ENETRESET) { + error = ether_delmulti(ifr, &sc->sc_ac); + if (error == ENETRESET) { error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi); if (error != 0) return (error); commit - 909c4a09d503cfafb89794cd88cab47a94a6bad5 blob - 12c84ba2c7939499681f847274306f21a8a4f8c0 file + sys/dev/pci/if_ixl.c --- sys/dev/pci/if_ixl.c +++ sys/dev/pci/if_ixl.c @@ -2137,7 +2137,8 @@ ixl_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case SIOCADDMULTI: - if (ether_addmulti(ifr, &sc->sc_ac) == ENETRESET) { + error = ether_addmulti(ifr, &sc->sc_ac); + if (error == ENETRESET) { error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi); if (error != 0) return (error); @@ -2157,7 +2158,8 @@ ixl_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case SIOCDELMULTI: - if (ether_delmulti(ifr, &sc->sc_ac) == ENETRESET) { + error = ether_delmulti(ifr, &sc->sc_ac); + if (error == ENETRESET) { error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi); if (error != 0) return (error); commit - 909c4a09d503cfafb89794cd88cab47a94a6bad5 blob - b3b0e18458d2d740c1f2b8b8c552e8f0b6c81ca9 file + sys/dev/pci/if_mcx.c --- sys/dev/pci/if_mcx.c +++ sys/dev/pci/if_mcx.c @@ -7626,7 +7626,8 @@ mcx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case SIOCADDMULTI: - if (ether_addmulti(ifr, &sc->sc_ac) == ENETRESET) { + error = ether_addmulti(ifr, &sc->sc_ac); + if (error == ENETRESET) { error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi); if (error != 0) break; @@ -7664,7 +7665,8 @@ mcx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case SIOCDELMULTI: - if (ether_delmulti(ifr, &sc->sc_ac) == ENETRESET) { + error = ether_delmulti(ifr, &sc->sc_ac); + if (error == ENETRESET) { error = ether_multiaddr(&ifr->ifr_addr, addrlo, addrhi); if (error != 0) break;