git: 9a8a26aefb36 - stable/14 - if: guard against if_ioctl being NULL

From: Kristof Provost <kp_at_FreeBSD.org>
Date: Sun, 12 May 2024 16:12:19 UTC
The branch stable/14 has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=9a8a26aefb366ef6f497d48547a1562a1de566c1

commit 9a8a26aefb366ef6f497d48547a1562a1de566c1
Author:     Kristof Provost <kp@FreeBSD.org>
AuthorDate: 2024-05-06 09:39:08 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2024-05-12 16:12:04 +0000

    if: guard against if_ioctl being NULL
    
    There are situations where an struct ifnet has a NULL if_ioctl pointer.
    
    For example, e6000sw creates such struct ifnets for each of its ports so it can
    call into the MII code.
    
    If there is then a link state event this calls do_link_state_change()
    -> rtnl_handle_ifevent() -> dump_iface() -> get_operstate() ->
    get_operstate_ether(). That wants to know if the link is up or down, so it tries
    to ioctl(SIOCGIFMEDIA), which doesn't go well if if_ioctl is NULL.
    
    Guard against this, and return EOPNOTSUPP.
    
    PR:             275920
    MFC ater:       3 days
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    
    (cherry picked from commit 43387b4e574043b78a58c8bcb7575161b055fce1)
---
 sys/net/if.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sys/net/if.c b/sys/net/if.c
index 0128fb8039ee..1ca0893eb724 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -4873,6 +4873,9 @@ if_resolvemulti(if_t ifp, struct sockaddr **srcs, struct sockaddr *dst)
 int
 if_ioctl(if_t ifp, u_long cmd, void *data)
 {
+	if (ifp->if_ioctl == NULL)
+		return (EOPNOTSUPP);
+
 	return (ifp->if_ioctl(ifp, cmd, data));
 }