Index | Thread | Search

From:
Brad Smith <brad@comstyle.com>
Subject:
Re: net/libslirp: update to 4.9.3; backport guestfwd fix
To:
ports@openbsd.org
Date:
Sun, 14 Jun 2026 21:18:11 -0400

Download raw body.

Thread
On 2026-06-14 9:20 a.m., Kirill A. Korinsky wrote:
> 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?
OK. Comment below.
>
> 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

Use the commit URL like as is done below.

> +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

Use the same patches as was commited.

> +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),
>
>