Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
net/libslirp: update to 4.9.3; backport guestfwd fix
To:
OpenBSD ports <ports@openbsd.org>
Cc:
Brad Smith <brad@comstyle.com>
Date:
Sun, 14 Jun 2026 15:20:32 +0200

Download raw body.

Thread
ports@, Brad,

I'd like to update net/libslirp to 4.9.3 and backport from future release
guestfwd fix which allows to bind on vhost IP.

Tested with qemu on -current, no regression to report.

Ok?


Index: Makefile
===================================================================
RCS file: /home/cvs/ports/net/libslirp/Makefile,v
diff -u -p -r1.3 Makefile
--- Makefile	27 Sep 2023 14:18:16 -0000	1.3
+++ Makefile	10 Jun 2026 10:10:44 -0000
@@ -1,13 +1,13 @@
 COMMENT=	general purpose TCP-IP emulator library
 
-VER=		4.7.0
+VER=		4.9.3
 DISTNAME=	libslirp-v${VER}
 PKGNAME=	libslirp-${VER}
 CATEGORIES=	net
 SITES=		https://gitlab.freedesktop.org/slirp/libslirp/-/archive/v${VER}/
 EXTRACT_SUFX=	.tar.bz2
 
-SHARED_LIBS+=	slirp	0.1
+SHARED_LIBS+=	slirp	0.2
 
 HOMEPAGE=	https://gitlab.freedesktop.org/slirp/libslirp
 
Index: distinfo
===================================================================
RCS file: /home/cvs/ports/net/libslirp/distinfo,v
diff -u -p -r1.2 distinfo
--- distinfo	2 May 2022 07:33:55 -0000	1.2
+++ distinfo	10 Jun 2026 10:10:07 -0000
@@ -1,2 +1,2 @@
-SHA256 (libslirp-v4.7.0.tar.bz2) = NYzotupZ7J3qyTfMdU8BFbmSg557DN3zD/uPd9wh2oI=
-SIZE (libslirp-v4.7.0.tar.bz2) = 109085
+SHA256 (libslirp-v4.9.3.tar.bz2) = yC4ixzvcPywDjlONTwycIWbe+yQCIS1hu3yxtTC6lS8=
+SIZE (libslirp-v4.9.3.tar.bz2) = 133720
Index: patches/patch-src_slirp_c
===================================================================
RCS file: patches/patch-src_slirp_c
diff -N patches/patch-src_slirp_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_slirp_c	10 Jun 2026 10:13:43 -0000
@@ -0,0 +1,21 @@
+https://gitlab.freedesktop.org/slirp/libslirp/-/merge_requests/158
+
+Index: src/slirp.c
+--- src/slirp.c.orig
++++ src/slirp.c
+@@ -1581,9 +1581,12 @@ static bool check_guestfwd(Slirp *slirp, struct in_add
+                              (htonl(0x0204) & ~slirp->vnetwork_mask.s_addr);
+     }
+     if ((guest_addr->s_addr & slirp->vnetwork_mask.s_addr) !=
+-            slirp->vnetwork_addr.s_addr ||
+-        guest_addr->s_addr == slirp->vhost_addr.s_addr ||
+-        guest_addr->s_addr == slirp->vnameserver_addr.s_addr) {
++            slirp->vnetwork_addr.s_addr) {
++        return false;
++    }
++    if (!slirp->disable_dns &&
++        guest_addr->s_addr == slirp->vnameserver_addr.s_addr &&
++        guest_port == 53) {
+         return false;
+     }
+ 
Index: patches/patch-src_tcp_input_c
===================================================================
RCS file: patches/patch-src_tcp_input_c
diff -N patches/patch-src_tcp_input_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tcp_input_c	10 Jun 2026 21:15:48 -0000
@@ -0,0 +1,36 @@
+https://gitlab.freedesktop.org/slirp/libslirp/-/commit/3e6e68e779c9051590250a87214dabf91e70949a
+
+Index: src/tcp_input.c
+--- src/tcp_input.c.orig
++++ src/tcp_input.c
+@@ -600,20 +600,17 @@ findso:
+         if (af == AF_INET &&
+             (so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
+                 slirp->vnetwork_addr.s_addr) {
+-            if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr &&
+-                so->so_faddr.s_addr != slirp->vnameserver_addr.s_addr) {
+-                /* May be an add exec */
+-                for (ex_ptr = slirp->guestfwd_list; ex_ptr;
+-                     ex_ptr = ex_ptr->ex_next) {
+-                    if (ex_ptr->ex_fport == so->so_fport &&
+-                        so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
+-                        so->so_state |= SS_CTL;
+-                        break;
+-                    }
++            /* May be an add exec */
++            for (ex_ptr = slirp->guestfwd_list; ex_ptr;
++                 ex_ptr = ex_ptr->ex_next) {
++                if (ex_ptr->ex_fport == so->so_fport &&
++                    so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
++                    so->so_state |= SS_CTL;
++                    break;
+                 }
+-                if (so->so_state & SS_CTL) {
+-                    goto cont_input;
+-                }
++            }
++            if (so->so_state & SS_CTL) {
++                goto cont_input;
+             }
+             /* CTL_ALIAS: Do nothing, tcp_fconnect will be called on it */
+         }
Index: patches/patch-src_tcp_subr_c
===================================================================
RCS file: patches/patch-src_tcp_subr_c
diff -N patches/patch-src_tcp_subr_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_tcp_subr_c	10 Jun 2026 21:15:56 -0000
@@ -0,0 +1,41 @@
+https://gitlab.freedesktop.org/slirp/libslirp/-/commit/3e6e68e779c9051590250a87214dabf91e70949a
+
+Index: src/tcp_subr.c
+--- src/tcp_subr.c.orig
++++ src/tcp_subr.c
+@@ -992,22 +992,20 @@ int tcp_ctl(struct socket *so)
+     DEBUG_ARG("so = %p", so);
+ 
+     /* TODO: IPv6 */
+-    if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr) {
+-        /* Check if it's pty_exec */
+-        for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
+-            if (ex_ptr->ex_fport == so->so_fport &&
+-                so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
+-                if (ex_ptr->write_cb) {
+-                    so->s = SLIRP_INVALID_SOCKET;
+-                    so->guestfwd = ex_ptr;
+-                    return 1;
+-                }
+-                DEBUG_MISC(" executing %s", ex_ptr->ex_exec);
+-                if (ex_ptr->ex_unix)
+-                    return open_unix(so, ex_ptr->ex_unix);
+-                else
+-                    return fork_exec(so, ex_ptr->ex_exec);
++    /* Check if it's pty_exec */
++    for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
++        if (ex_ptr->ex_fport == so->so_fport &&
++            so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
++            if (ex_ptr->write_cb) {
++                so->s = SLIRP_INVALID_SOCKET;
++                so->guestfwd = ex_ptr;
++                return 1;
+             }
++            DEBUG_MISC(" executing %s", ex_ptr->ex_exec);
++            if (ex_ptr->ex_unix)
++                return open_unix(so, ex_ptr->ex_unix);
++            else
++                return fork_exec(so, ex_ptr->ex_exec);
+         }
+     }
+     sb->sb_cc = slirp_fmt(sb->sb_wptr, sb->sb_datalen - (sb->sb_wptr - sb->sb_data),


-- 
wbr, Kirill