Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
ether_addmulti/delmulti error handling fix
To:
tech@openbsd.org
Date:
Tue, 1 Apr 2025 10:49:11 +0200

Download raw body.

Thread
  • Stefan Sperling:

    ether_addmulti/delmulti error handling fix

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;