From: Kirill A. Korinsky Subject: net/libslirp: update to 4.9.3; backport guestfwd fix To: OpenBSD ports Cc: Brad Smith Date: Sun, 14 Jun 2026 15:20:32 +0200 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