git: c5a92616c41f - main - if_gre(4): Fix gre_clone_dump_nl address dump

From: Pouria Mousavizadeh Tehrani <pouria_at_FreeBSD.org>
Date: Wed, 29 Apr 2026 18:59:48 UTC
The branch main has been updated by pouria:

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

commit c5a92616c41f9132d585c533e66dee88e98c73f2
Author:     Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
AuthorDate: 2026-04-29 17:42:27 +0000
Commit:     Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
CommitDate: 2026-04-29 18:57:46 +0000

    if_gre(4): Fix gre_clone_dump_nl address dump
    
    Fix stack overflow by passing in_aliasreq instead of ifr
    during netlink dump.
    
    Fixes:  e1e18cc12e68 ("if_gre: Add netlink support with tests")
---
 sys/net/if_gre.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c
index f8036bf4446d..563478eb67f8 100644
--- a/sys/net/if_gre.c
+++ b/sys/net/if_gre.c
@@ -297,7 +297,6 @@ gre_clone_dump_nl(struct ifnet *ifp, struct nl_writer *nw)
 {
 	GRE_RLOCK_TRACKER;
 	struct gre_softc *sc;
-	struct ifreq ifr;
 
 	nlattr_add_u32(nw, IFLA_LINK, ifp->if_index);
 	nlattr_add_string(nw, IFLA_IFNAME, ifp->if_xname);
@@ -318,21 +317,23 @@ gre_clone_dump_nl(struct ifnet *ifp, struct nl_writer *nw)
 
 	if (sc->gre_family == AF_INET) {
 #ifdef INET
-		if (in_gre_ioctl(sc, SIOCGIFPSRCADDR, (caddr_t)&ifr) == 0)
-			nlattr_add_in_addr(nw, IFLA_GRE_LOCAL,
-			    (const struct in_addr *)&ifr.ifr_addr);
-		if (in_gre_ioctl(sc, SIOCGIFPDSTADDR, (caddr_t)&ifr) == 0)
+		struct in_aliasreq in;
+		if (in_gre_ioctl(sc, SIOCGIFPSRCADDR, (caddr_t)&in) == 0)
 			nlattr_add_in_addr(nw, IFLA_GRE_LOCAL,
-			    (const struct in_addr *)&ifr.ifr_dstaddr);
+			    &in.ifra_addr.sin_addr);
+		if (in_gre_ioctl(sc, SIOCGIFPDSTADDR, (caddr_t)&in) == 0)
+			nlattr_add_in_addr(nw, IFLA_GRE_REMOTE,
+			    &in.ifra_addr.sin_addr);
 #endif
 	} else if (sc->gre_family == AF_INET6) {
 #ifdef INET6
-		if (in6_gre_ioctl(sc, SIOCGIFPSRCADDR_IN6, (caddr_t)&ifr) == 0)
-			nlattr_add_in6_addr(nw, IFLA_GRE_LOCAL,
-			    (const struct in6_addr *)&ifr.ifr_addr);
-		if (in6_gre_ioctl(sc, SIOCGIFPDSTADDR_IN6, (caddr_t)&ifr) == 0)
+		struct in6_aliasreq in6;
+		if (in6_gre_ioctl(sc, SIOCGIFPSRCADDR_IN6, (caddr_t)&in6) == 0)
 			nlattr_add_in6_addr(nw, IFLA_GRE_LOCAL,
-			    (const struct in6_addr *)&ifr.ifr_dstaddr);
+			    &in6.ifra_addr.sin6_addr);
+		if (in6_gre_ioctl(sc, SIOCGIFPDSTADDR_IN6, (caddr_t)&in6) == 0)
+			nlattr_add_in6_addr(nw, IFLA_GRE_REMOTE,
+			    &in6.ifra_addr.sin6_addr);
 #endif
 	}