Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libslirp for openSUSE:Factory 
checked in at 2026-06-27 18:03:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libslirp (Old)
 and      /work/SRC/openSUSE:Factory/.libslirp.new.11887 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libslirp"

Sat Jun 27 18:03:31 2026 rev:14 rq:1361611 version:4.9.3+4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libslirp/libslirp.changes        2025-06-11 
16:21:28.103812451 +0200
+++ /work/SRC/openSUSE:Factory/.libslirp.new.11887/libslirp.changes     
2026-06-27 18:03:50.243423169 +0200
@@ -1,0 +2,25 @@
+Wed Jun 24 11:22:12 UTC 2026 - [email protected]
+
+- Update to version 4.9.3+4:
+  * Add CVE information
+  * slirp: permit guestfwd to vhost_addr/vnameserver_addr
+  * Test qemu migration support
+  * Release v4.9.3
+  * slirp: Fix migration break on incorrect vmstate retcode
+  * Add missing diff url
+  * Release v4.9.2
+  * tcp_sockclosed: Set linger timer on remaining closing states
+  * oob: cap urgent data count to what is actually available
+  * bootp: allow https for UEFI HTTP boot
+  * ncsi: Document the Get Version ID (GVI) packet handler
+  * ncsi: Document why we fix memory alignment by adding 2-byte padding
+  * ncsi: add documentation comments to the packet handler table for improved 
readability
+  * Fix byte order
+  * SO_ERROR: take the errno as error hint
+  * vmstate: pass on read/write errors for state
+  * cope with SO_ERROR possibly failing
+  * Move the modified 3-Clause BSD text into LICENSE
+  * fix: honor dns server port number on macos
+- fixes CVE-2026-9539 [bsc#1268903]
+
+-------------------------------------------------------------------

Old:
----
  libslirp-4.9.1+1.obscpio
  libslirp-4.9.1+1.tar.xz

New:
----
  libslirp-4.9.3+4.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libslirp.spec ++++++
--- /var/tmp/diff_new_pack.vQUwuo/_old  2026-06-27 18:03:52.735506710 +0200
+++ /var/tmp/diff_new_pack.vQUwuo/_new  2026-06-27 18:03:52.755507380 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package libslirp
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %define libname libslirp0
 
 Name:           libslirp
-Version:        4.9.1+1
+Version:        4.9.3+4
 Release:        0
 Summary:        A general purpose TCP-IP emulator
 License:        MIT

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.vQUwuo/_old  2026-06-27 18:03:53.191521997 +0200
+++ /var/tmp/diff_new_pack.vQUwuo/_new  2026-06-27 18:03:53.231523338 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gitlab.freedesktop.org/slirp/libslirp.git</param>
-              <param 
name="changesrevision">5e171598422f816555bee331f18a6adbe1291b1a</param></service></servicedata>
+              <param 
name="changesrevision">d82ac5a853813d70cb990bc31d6faeffe8e4dc51</param></service></servicedata>
 (No newline at EOF)
 

++++++ libslirp-4.9.1+1.obscpio -> libslirp-4.9.3+4.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/.gitlab-ci.yml 
new/libslirp-4.9.3+4/.gitlab-ci.yml
--- old/libslirp-4.9.1+1/.gitlab-ci.yml 2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/.gitlab-ci.yml 2026-06-24 02:54:42.000000000 +0200
@@ -108,3 +108,22 @@
   - make benchmark MTU=1500
   - make benchmark MTU=512
   - make benchmark MTU=65520
+
+migration-test:
+  variables:
+    QEMU_VERSION: "11.0.0"
+  script:
+  # Install libslirp
+  - meson build
+  - ninja -C build install
+  # Register the path of libslirp.so.0
+  - echo /usr/local/lib64 >/etc/ld.so.conf.d/libslirp.conf
+  - ldconfig
+  # Build and run qemu
+  - dnf install -y wget diff
+  - wget "https://download.qemu.org/qemu-${QEMU_VERSION}.tar.xz";
+  - tar xvf "qemu-${QEMU_VERSION}.tar.xz"
+  - cd "qemu-${QEMU_VERSION}"
+  - ./configure --target-list=x86_64-softmmu
+  - make
+  - QTEST_QEMU_BINARY=./build/qemu-system-x86_64 
./build/tests/qtest/migration-test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/CHANGELOG.md 
new/libslirp-4.9.3+4/CHANGELOG.md
--- old/libslirp-4.9.1+1/CHANGELOG.md   2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/CHANGELOG.md   2026-06-24 02:54:42.000000000 +0200
@@ -5,6 +5,30 @@
 The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic 
Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [4.9.3] - 2026-05-26
+
+### Fixed
+
+  - Fix migration break on incorrect vmstate retcode #94 !157
+
+## [4.9.2] - 2026-05-23
+
+## Security
+
+  - oob: cap urgent data count to what is actually available #93 
(CVE-2026-9539)
+
+### Fixed
+
+  - honor dns server port number on macos !153
+  - cope with SO_ERROR possibly failing
+  - vmstate: pass on read/write errors for state
+  - fix port conflict #92
+  - tcp_sockclosed: Set linger timer on remaining closing states
+
+### Changed
+
+  - bootp: allow https for UEFI HTTP boot !156
+
 ## [4.9.1] - 2025-05-28
 
 ### Fixed
@@ -265,7 +289,9 @@
  - Standalone project, removing any QEMU dependency.
  - License clarifications.
 
-[Unreleased]: 
https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.9.1...master
+[Unreleased]: 
https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.9.3...master
+[4.9.3]: https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.9.2...v4.9.3
+[4.9.2]: https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.9.1...v4.9.2
 [4.9.1]: https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.9.0...v4.9.1
 [4.9.0]: https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.8.0...v4.9.0
 [4.8.0]: https://gitlab.freedesktop.org/slirp/libslirp/compare/v4.7.0...v4.8.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/COPYRIGHT 
new/libslirp-4.9.3+4/COPYRIGHT
--- old/libslirp-4.9.1+1/COPYRIGHT      2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/COPYRIGHT      2026-06-24 02:54:42.000000000 +0200
@@ -9,38 +9,9 @@
 favorite charity (for example, GreenPeace).  This is not a requirement, but
 a suggestion from someone who highly values the service they provide.
 
-The copyright terms and conditions:
+See LICENSE for the full copyright terms and conditions.
 
----BEGIN---
-
- Copyright (c) 1995,1996 Danny Gasparovski.  All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
- 3. Neither the name of the copyright holder nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
- DANNY GASPAROVSKI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----END---
-
-This basically means you can do anything you want with the software, except
+They basically mean you can do anything you want with the software, except
 1) call it your own, and 2) claim warranty on it.  There is no warranty for
 this software.  None.  Nada.  If you lose a million dollars while using
 Slirp, that's your loss not mine.  So, ***USE AT YOUR OWN RISK!***.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/LICENSE new/libslirp-4.9.3+4/LICENSE
--- old/libslirp-4.9.1+1/LICENSE        1970-01-01 01:00:00.000000000 +0100
+++ new/libslirp-4.9.3+4/LICENSE        2026-06-24 02:54:42.000000000 +0200
@@ -0,0 +1,24 @@
+Copyright (c) 1995,1996 Danny Gasparovski.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+DANNY GASPAROVSKI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/meson.build 
new/libslirp-4.9.3+4/meson.build
--- old/libslirp-4.9.1+1/meson.build    2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/meson.build    2026-06-24 02:54:42.000000000 +0200
@@ -1,5 +1,5 @@
 project('libslirp', 'c',
-  version : '4.9.1',
+  version : '4.9.3',
   license : 'BSD-3-Clause',
   default_options : ['warning_level=1', 'c_std=gnu99'],
   meson_version : '>= 0.60',
@@ -238,6 +238,16 @@
 
 test('ncsi', ncsitest)
 
+guestfwdtest = executable('guestfwdtest', 'test/guestfwdtest.c',
+  link_with: [lib],
+  c_args : cargs,
+  link_args : vflag,
+  include_directories: ['src'],
+  dependencies: libslirp_deps
+)
+
+test('guestfwd', guestfwdtest)
+
 if install_devel
   install_headers(['src/libslirp.h'], subdir : 'slirp')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/bootp.c 
new/libslirp-4.9.3+4/src/bootp.c
--- old/libslirp-4.9.1+1/src/bootp.c    2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/bootp.c    2026-06-24 02:54:42.000000000 +0200
@@ -369,7 +369,8 @@
            we assume that, if the bootfile parameter was configured as an http
            URL, the user intends to perform UEFI HTTP boot, so send this option
            automatically */
-        if (slirp->bootp_filename && g_str_has_prefix(slirp->bootp_filename, 
"http://";)) {
+        if (slirp->bootp_filename && (g_str_has_prefix(slirp->bootp_filename, 
"http://";) ||
+                                      g_str_has_prefix(slirp->bootp_filename, 
"https://";))) {
             val = strlen(UEFI_HTTP_VENDOR_CLASS_ID);
             if (q + val + 2 >= end) {
                 g_warning("DHCP packet size exceeded, "
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/ip6_icmp.c 
new/libslirp-4.9.3+4/src/ip6_icmp.c
--- old/libslirp-4.9.1+1/src/ip6_icmp.c 2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/ip6_icmp.c 2026-06-24 02:54:42.000000000 +0200
@@ -286,6 +286,7 @@
     struct ip6 *rip = mtod(t, struct ip6 *);
     size_t pl_size = 0;
     struct in6_addr addr;
+    uint16_t port;
     uint32_t scope_id;
 
     rip->ip_src = (struct in6_addr)LINKLOCAL_ADDR;
@@ -334,7 +335,7 @@
     pl_size += NDPOPT_PREFIXINFO_LEN;
 
     /* Prefix information (NDP option) */
-    if (get_dns6_addr(&addr, &scope_id) >= 0) {
+    if (get_dns6_addr(&addr, &port, &scope_id) >= 0) {
         /* Host system does have an IPv6 DNS server, announce our proxy.  */
         struct ndpopt *opt3 = mtod(t, struct ndpopt *);
         opt3->ndpopt_type = NDPOPT_RDNSS;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/misc.h 
new/libslirp-4.9.3+4/src/misc.h
--- old/libslirp-4.9.1+1/src/misc.h     2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/misc.h     2026-06-24 02:54:42.000000000 +0200
@@ -12,7 +12,7 @@
     SlirpWriteCb write_cb;
     void *opaque;
     struct in_addr ex_addr; /* Server address */
-    int ex_fport; /* Port to telnet to */
+    int ex_fport; /* Port to telnet to (network order) */
     char *ex_exec; /* Command line of what to exec */
     char *ex_unix; /* unix socket */
     struct gfwd_list *ex_next;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/ncsi.c 
new/libslirp-4.9.3+4/src/ncsi.c
--- old/libslirp-4.9.1+1/src/ncsi.c     2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/ncsi.c     2026-06-24 02:54:42.000000000 +0200
@@ -175,8 +175,8 @@
 {
     struct ncsi_rsp_gvi_pkt *rsp = (struct ncsi_rsp_gvi_pkt *)rnh;
 
-    rsp->ncsi_version = htonl(0xF1F0F000);
-    rsp->mf_id = htonl(slirp->mfr_id);
+    rsp->ncsi_version = htonl(0xF1F0F000);  /* NCSI version 1.0.0 */
+    rsp->mf_id = htonl(slirp->mfr_id);      /* Manufacturer ID */
 
     return 0;
 }
@@ -227,27 +227,27 @@
     int payload;
     int (*handler)(Slirp *slirp, const struct ncsi_pkt_hdr *nh,
                    struct ncsi_rsp_pkt_hdr *rnh);
-} ncsi_rsp_handlers[] = { { NCSI_PKT_RSP_CIS, 4, NULL },
-                          { NCSI_PKT_RSP_SP, 4, NULL },
-                          { NCSI_PKT_RSP_DP, 4, NULL },
-                          { NCSI_PKT_RSP_EC, 4, NULL },
+} ncsi_rsp_handlers[] = { { NCSI_PKT_RSP_CIS, 4, NULL },     /* Clear Initial 
State */
+                          { NCSI_PKT_RSP_SP, 4, NULL },      /* Select Package 
*/
+                          { NCSI_PKT_RSP_DP, 4, NULL },      /* Deselect 
Package */
+                          { NCSI_PKT_RSP_EC, 4, NULL },      /* Enable Channel 
*/
                           { NCSI_PKT_RSP_DC, 4, NULL },
                           { NCSI_PKT_RSP_RC, 4, NULL },
-                          { NCSI_PKT_RSP_ECNT, 4, NULL },
+                          { NCSI_PKT_RSP_ECNT, 4, NULL },    /* Enable Channel 
TX */
                           { NCSI_PKT_RSP_DCNT, 4, NULL },
-                          { NCSI_PKT_RSP_AE, 4, NULL },
+                          { NCSI_PKT_RSP_AE, 4, NULL },      /* Enable AEN */
                           { NCSI_PKT_RSP_SL, 4, NULL },
                           { NCSI_PKT_RSP_GLS, 16, ncsi_rsp_handler_gls },
-                          { NCSI_PKT_RSP_SVF, 4, NULL },
-                          { NCSI_PKT_RSP_EV, 4, NULL },
-                          { NCSI_PKT_RSP_DV, 4, NULL },
-                          { NCSI_PKT_RSP_SMA, 4, NULL },
-                          { NCSI_PKT_RSP_EBF, 4, NULL },
+                          { NCSI_PKT_RSP_SVF, 4, NULL },     /* Set VLAN 
Filter */
+                          { NCSI_PKT_RSP_EV, 4, NULL },      /* Enable VLAN */
+                          { NCSI_PKT_RSP_DV, 4, NULL },      /* Disable VLAN */
+                          { NCSI_PKT_RSP_SMA, 4, NULL },     /* Set MAC 
Address */
+                          { NCSI_PKT_RSP_EBF, 4, NULL },     /* Enable 
Broadcast Filter */
                           { NCSI_PKT_RSP_DBF, 4, NULL },
                           { NCSI_PKT_RSP_EGMF, 4, NULL },
-                          { NCSI_PKT_RSP_DGMF, 4, NULL },
+                          { NCSI_PKT_RSP_DGMF, 4, NULL },    /* Disable Global 
Multicast Filter */
                           { NCSI_PKT_RSP_SNFC, 4, NULL },
-                          { NCSI_PKT_RSP_GVI, 40, ncsi_rsp_handler_gvi },
+                          { NCSI_PKT_RSP_GVI, 40, ncsi_rsp_handler_gvi },  /* 
Get Version ID */
                           { NCSI_PKT_RSP_GC, 32, ncsi_rsp_handler_gc },
                           { NCSI_PKT_RSP_GP, 40, ncsi_rsp_handler_gp },
                           { NCSI_PKT_RSP_GCPS, 172, NULL },
@@ -268,6 +268,12 @@
 {
     const struct ncsi_pkt_hdr *nh =
         (const struct ncsi_pkt_hdr *)(pkt + ETH_HLEN);
+    /*
+     * Add 2-byte padding at start of buffer for proper alignment of IP header
+     * after 14-byte Ethernet header. This ensures the IP payload starts on a
+     * 4-byte boundary, which is required for optimal performance on many
+     * architectures and expected by slirp's packet handling code.
+     */
     uint8_t ncsi_reply[2 + ETH_HLEN + NCSI_MAX_LEN];
     struct ethhdr *reh = (struct ethhdr *)(ncsi_reply + 2);
     struct ncsi_rsp_pkt_hdr *rnh =
@@ -322,5 +328,6 @@
     *pchecksum = htonl(checksum);
     ncsi_rsp_len += 4;
 
+    /* Skip the 2-byte padding when sending the packet */
     slirp_send_packet_all(slirp, ncsi_reply + 2, ETH_HLEN + ncsi_rsp_len);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/slirp.c 
new/libslirp-4.9.3+4/src/slirp.c
--- old/libslirp-4.9.1+1/src/slirp.c    2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/slirp.c    2026-06-24 02:54:42.000000000 +0200
@@ -87,6 +87,8 @@
 
 static struct in_addr dns_addr;
 static struct in6_addr dns6_addr;
+static uint16_t dns_port;
+static uint16_t dns6_port;
 static uint32_t dns6_scope_id;
 static unsigned dns_addr_time;
 static unsigned dns6_addr_time;
@@ -98,7 +100,7 @@
 
 #if defined(_WIN32)
 
-int get_dns_addr(struct in_addr *pdns_addr)
+int get_dns_addr(struct in_addr *pdns_addr, uint16_t *pdns_port)
 {
     FIXED_INFO *FixedInfo = NULL;
     ULONG BufLen;
@@ -134,6 +136,7 @@
     pIPAddr = &(FixedInfo->DnsServerList);
     inet_aton(pIPAddr->IpAddress.String, &tmp_addr);
     *pdns_addr = tmp_addr;
+    *pdns_port = dns_port = htons(53); // TODO: honor custom port
     dns_addr = tmp_addr;
     dns_addr_time = curtime;
     if (FixedInfo) {
@@ -230,16 +233,19 @@
     return -1;
 }
 
-int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id)
+int get_dns6_addr(struct in6_addr *pdns6_addr, uint16_t *pdns6_port,
+                  uint32_t *scope_id)
 {
     if (!in6_zero(&dns6_addr) && (curtime - dns6_addr_time) < TIMEOUT_DEFAULT) 
{
         *pdns6_addr = dns6_addr;
+        *pdns6_port = dns6_port;
         *scope_id = dns6_scope_id;
         return 0;
     }
 
     if (get_ipv6_dns_server(pdns6_addr, scope_id) == 0) {
         dns6_addr = *pdns6_addr;
+        *pdns6_port = dns6_port = htons(53); // TODO: honor custom port
         dns6_addr_time = curtime;
         dns6_scope_id = *scope_id;
         return 0;
@@ -258,10 +264,13 @@
 #include <resolv.h>
 
 static int get_dns_addr_cached(void *pdns_addr, void *cached_addr,
-                               socklen_t addrlen, unsigned *cached_time)
+                               socklen_t addrlen,
+                               uint16_t *pdns_port, uint16_t cached_port,
+                               unsigned *cached_time)
 {
     if (curtime - *cached_time < TIMEOUT_DEFAULT) {
         memcpy(pdns_addr, cached_addr, addrlen);
+        *pdns_port = cached_port;
         return 0;
     }
     return 1;
@@ -269,6 +278,7 @@
 
 static int get_dns_addr_libresolv(int af, void *pdns_addr, void *cached_addr,
                                   socklen_t addrlen,
+                                  uint16_t *pdns_port, uint16_t *cached_port,
                                   uint32_t *scope_id, uint32_t 
*cached_scope_id,
                                   unsigned *cached_time)
 {
@@ -277,6 +287,7 @@
     int count;
     int found;
     void *addr;
+    uint16_t port;
 
     // we only support IPv4 and IPv4, we assume it's one or the other
     assert(af == AF_INET || af == AF_INET6);
@@ -297,14 +308,17 @@
 
         if (af == AF_INET) {
             addr = &servers[i].sin.sin_addr;
+            port = servers[i].sin.sin_port;
         } else { // af == AF_INET6
             addr = &servers[i].sin6.sin6_addr;
+            port = servers[i].sin6.sin6_port;
         }
 
         // we use the first found entry
         if (found == 1) {
             memcpy(pdns_addr, addr, addrlen);
             memcpy(cached_addr, addr, addrlen);
+            *pdns_port = *cached_port = port;
             if (scope_id) {
                 *scope_id = 0;
             }
@@ -323,7 +337,7 @@
             if (!res) {
                 res = "  (string conversion error)";
             }
-            DEBUG_MISC("  %s", res);
+            DEBUG_MISC("  %s, port %d", res, ntohs(port));
         }
     }
 
@@ -333,26 +347,29 @@
     return 0;
 }
 
-int get_dns_addr(struct in_addr *pdns_addr)
+int get_dns_addr(struct in_addr *pdns_addr, uint16_t *pdns_port)
 {
     if (dns_addr.s_addr != 0) {
         int ret;
         ret = get_dns_addr_cached(pdns_addr, &dns_addr, sizeof(dns_addr),
-                                  &dns_addr_time);
+                                  pdns_port, dns_port, &dns_addr_time);
         if (ret <= 0) {
             return ret;
         }
     }
     return get_dns_addr_libresolv(AF_INET, pdns_addr, &dns_addr,
-                                  sizeof(dns_addr), NULL, NULL, 
&dns_addr_time);
+                                  sizeof(dns_addr),
+                                  pdns_port, &dns_port,
+                                  NULL, NULL, &dns_addr_time);
 }
 
-int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id)
+int get_dns6_addr(struct in6_addr *pdns6_addr, uint16_t *pdns6_port,
+                  uint32_t *scope_id)
 {
     if (!in6_zero(&dns6_addr)) {
         int ret;
         ret = get_dns_addr_cached(pdns6_addr, &dns6_addr, sizeof(dns6_addr),
-                                  &dns6_addr_time);
+                                  pdns6_port, dns6_port, &dns6_addr_time);
         if (ret == 0) {
             *scope_id = dns6_scope_id;
         }
@@ -362,6 +379,7 @@
     }
     return get_dns_addr_libresolv(AF_INET6, pdns6_addr, &dns6_addr,
                                   sizeof(dns6_addr),
+                                  pdns6_port, &dns6_port,
                                   scope_id, &dns6_scope_id, &dns6_addr_time);
 }
 
@@ -440,6 +458,7 @@
 
 static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr,
                                     socklen_t addrlen,
+                                    uint16_t *pdns_port, uint16_t *cached_port,
                                     uint32_t *scope_id, uint32_t 
*cached_scope_id,
                                     unsigned *cached_time)
 {
@@ -488,10 +507,13 @@
                        cached_scope_id, cached_time);
     }
 
+    if (found)
+        *pdns_port = *cached_port = htons(53); // TODO: honor custom port
+
     return found ? 0 : -1;
 }
 
-int get_dns_addr(struct in_addr *pdns_addr)
+int get_dns_addr(struct in_addr *pdns_addr, uint16_t *pdns_port)
 {
     static struct stat dns_addr_stat;
 
@@ -505,10 +527,12 @@
     }
     return get_dns_addr_resolv_conf(AF_INET, pdns_addr, &dns_addr,
                                     sizeof(dns_addr),
+                                    pdns_port, &dns_port,
                                     NULL, NULL, &dns_addr_time);
 }
 
-int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id)
+int get_dns6_addr(struct in6_addr *pdns6_addr, uint16_t *pdns6_port,
+                  uint32_t *scope_id)
 {
     static struct stat dns6_addr_stat;
 
@@ -525,6 +549,7 @@
     }
     return get_dns_addr_resolv_conf(AF_INET6, pdns6_addr, &dns6_addr,
                                     sizeof(dns6_addr),
+                                    pdns6_port, &dns6_port,
                                     scope_id, &dns6_scope_id, &dns6_addr_time);
 }
 
@@ -1556,15 +1581,18 @@
                              (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;
     }
 
     /* check if the port is "bound" */
     for (tmp_ptr = slirp->guestfwd_list; tmp_ptr; tmp_ptr = tmp_ptr->ex_next) {
-        if (guest_port == tmp_ptr->ex_fport &&
+        if (guest_port == ntohs(tmp_ptr->ex_fport) &&
             guest_addr->s_addr == tmp_ptr->ex_addr.s_addr)
             return false;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/slirp.h 
new/libslirp-4.9.3+4/src/slirp.h
--- old/libslirp-4.9.1+1/src/slirp.h    2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/slirp.h    2026-06-24 02:54:42.000000000 +0200
@@ -231,11 +231,12 @@
  */
 void if_start(Slirp *);
 
-/* Get the address of the DNS server on the host side */
-int get_dns_addr(struct in_addr *pdns_addr);
+/* Get the IPv4 address and port of the DNS server on the host side */
+int get_dns_addr(struct in_addr *pdns_addr, uint16_t *pdns_port);
 
-/* Get the IPv6 address of the DNS server on the host side */
-int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
+/* Get the IPv6 address and port of the DNS server on the host side */
+int get_dns6_addr(struct in6_addr *pdns6_addr, uint16_t *pdns_port,
+                  uint32_t *scope_id);
 
 /* ncsi.c */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/socket.c 
new/libslirp-4.9.3+4/src/socket.c
--- old/libslirp-4.9.1+1/src/socket.c   2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/socket.c   2026-06-24 02:54:42.000000000 +0200
@@ -209,7 +209,9 @@
                 if (!shutdown_wr && getpeername(so->s, paddr, &alen) < 0) {
                     err = errno;
                 } else {
-                    getsockopt(so->s, SOL_SOCKET, SO_ERROR, &err, &elen);
+                    if (getsockopt(so->s, SOL_SOCKET, SO_ERROR, &err, &elen) < 
0) {
+                        err = errno;
+                    }
                 }
             }
 
@@ -337,7 +339,8 @@
 int sosendoob(struct socket *so)
 {
     struct sbuf *sb = &so->so_rcv;
-    char buff[2048]; /* XXX Shouldn't be sending more oob data than this */
+    uint32_t urgc = so->so_urgc;
+    char buff[2048];
 
     int n;
 
@@ -345,12 +348,15 @@
     DEBUG_ARG("so = %p", so);
     DEBUG_ARG("sb->sb_cc = %d", sb->sb_cc);
 
-    if (so->so_urgc > sizeof(buff))
-        so->so_urgc = sizeof(buff); /* XXXX */
+    if (urgc > sizeof(buff))
+        urgc = sizeof(buff);
+
+    if (urgc > sb->sb_cc)
+        urgc = sb->sb_cc;
 
     if (sb->sb_rptr < sb->sb_wptr) {
         /* We can send it directly */
-        n = slirp_send(so, sb->sb_rptr, so->so_urgc,
+        n = slirp_send(so, sb->sb_rptr, urgc,
                        (MSG_OOB)); /* |MSG_DONTWAIT)); */
     } else {
         /*
@@ -358,7 +364,6 @@
          * we must copy all data to a linear buffer then
          * send it all
          */
-        uint32_t urgc = so->so_urgc; /* Amount of room left in buff */
         int len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr;
         if (len > urgc) {
             len = urgc;
@@ -403,7 +408,7 @@
  */
 int sowrite(struct socket *so)
 {
-    int n, nn;
+    int n, nn, noob = 0;
     struct sbuf *sb = &so->so_rcv;
     int len = sb->sb_cc;
     struct iovec iov[2];
@@ -413,16 +418,20 @@
 
     if (so->so_urgc) {
         uint32_t expected = so->so_urgc;
-        if (sosendoob(so) < expected) {
-            /* Treat a short write as a fatal error too,
-             * rather than continuing on and sending the urgent
-             * data as if it were non-urgent and leaving the
-             * so_urgc count wrong.
-             */
+        int noob = sosendoob(so);
+
+        if (noob <= 0)
             goto err_disconnected;
-        }
+
+        if (noob < expected)
+            /* Short write: either we have not yet received all
+             * urgent data, or the socket buffers are full. Leave
+             * it for later when we have data or have room.  */
+            return noob;
+
         if (sb->sb_cc == 0)
-            return 0;
+            /* Nothing left to write actually */
+            return noob;
     }
 
     /*
@@ -453,12 +462,11 @@
         } else
             n = 1;
     }
-    /* Check if there's urgent data to send, and if so, send it */
 
     nn = slirp_send(so, iov[0].iov_base, iov[0].iov_len, 0);
     /* This should never happen, but people tell me it does *shrug* */
     if (nn < 0 && (errno == EAGAIN || errno == EINTR))
-        return 0;
+        return noob;
 
     if (nn <= 0) {
         goto err_disconnected;
@@ -485,7 +493,7 @@
     if ((so->so_state & SS_FWDRAIN) && sb->sb_cc == 0)
         sofcantsendmore(so);
 
-    return nn;
+    return noob + nn;
 
 err_disconnected:
     DEBUG_MISC(" --- sowrite disconnected, so->so_state = %x, errno = %d",
@@ -968,7 +976,8 @@
 static bool sotranslate_out4(Slirp *s, struct socket *so, struct sockaddr_in 
*sin)
 {
     if (!s->disable_dns && so->so_faddr.s_addr == s->vnameserver_addr.s_addr) {
-        return so->so_fport == htons(53) && get_dns_addr(&sin->sin_addr) >= 0;
+        return (so->so_fport == htons(53) &&
+                get_dns_addr(&sin->sin_addr, &sin->sin_port) >= 0);
     }
 
     if (so->so_faddr.s_addr == s->vhost_addr.s_addr ||
@@ -987,7 +996,8 @@
 {
     if (!s->disable_dns && in6_equal(&so->so_faddr6, &s->vnameserver_addr6)) {
         uint32_t scope_id;
-        if (so->so_fport == htons(53) && get_dns6_addr(&sin->sin6_addr, 
&scope_id) >= 0) {
+        if (so->so_fport == htons(53) &&
+                get_dns6_addr(&sin->sin6_addr, &sin->sin6_port, &scope_id) >= 
0) {
             sin->sin6_scope_id = scope_id;
             return true;
         }
@@ -1034,6 +1044,8 @@
     struct sockaddr_in *sin = (struct sockaddr_in *)addr;
     struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
 
+    uint16_t dns_port;
+
     switch (addr->ss_family) {
     case AF_INET:
         if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
@@ -1047,6 +1059,13 @@
                 sin->sin_addr = so->so_faddr;
             }
         }
+
+        struct in_addr sin_addr;
+        if (get_dns_addr(&sin_addr, &dns_port) >= 0 &&
+                sin->sin_port == dns_port &&
+                sin->sin_addr.s_addr == sin_addr.s_addr)
+            sin->sin_port = htons(53);
+
         break;
 
     case AF_INET6:
@@ -1057,6 +1076,15 @@
                 sin6->sin6_addr = so->so_faddr6;
             }
         }
+
+        struct in6_addr sin6_addr;
+        uint32_t scope_id;
+        if (get_dns6_addr(&sin6_addr, &dns_port, &scope_id) >= 0 &&
+                sin6->sin6_port == dns_port &&
+                sin6->sin6_scope_id == scope_id &&
+                in6_equal(&sin6->sin6_addr, &sin6_addr))
+            sin6->sin6_port = htons(53);
+
         break;
 
     default:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/tcp_input.c 
new/libslirp-4.9.3+4/src/tcp_input.c
--- old/libslirp-4.9.1+1/src/tcp_input.c        2025-06-06 13:14:15.000000000 
+0200
+++ new/libslirp-4.9.3+4/src/tcp_input.c        2026-06-24 02:54:42.000000000 
+0200
@@ -600,21 +600,18 @@
         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;
-                    }
-                }
-                if (so->so_state & SS_CTL) {
-                    goto cont_input;
+            /* 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;
+            }
             /* CTL_ALIAS: Do nothing, tcp_fconnect will be called on it */
         }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/tcp_subr.c 
new/libslirp-4.9.3+4/src/tcp_subr.c
--- old/libslirp-4.9.1+1/src/tcp_subr.c 2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/tcp_subr.c 2026-06-24 02:54:42.000000000 +0200
@@ -362,7 +362,11 @@
     case TCPS_CLOSE_WAIT:
         tp->t_state = TCPS_LAST_ACK;
         break;
+    case TCPS_FIN_WAIT_1:
+    case TCPS_CLOSING:
+    case TCPS_LAST_ACK:
     case TCPS_FIN_WAIT_2:
+    case TCPS_TIME_WAIT:
         /*
          * If we can't receive any more
          * data, then closing user can proceed.
@@ -988,22 +992,20 @@
     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),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/udp.c 
new/libslirp-4.9.3+4/src/udp.c
--- old/libslirp-4.9.1+1/src/udp.c      2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/udp.c      2026-06-24 02:54:42.000000000 +0200
@@ -263,6 +263,8 @@
     DEBUG_ARG("m = %p", m);
     DEBUG_ARG("saddr = %s", inet_ntop(AF_INET, &saddr->sin_addr, addr, 
sizeof(addr)));
     DEBUG_ARG("daddr = %s", inet_ntop(AF_INET, &daddr->sin_addr, addr, 
sizeof(addr)));
+    DEBUG_ARG("s_inport = %d", ntohs(saddr->sin_port));
+    DEBUG_ARG("d_inport = %d", ntohs(daddr->sin_port));
 
     /*
      * Adjust for header
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/src/vmstate.c 
new/libslirp-4.9.3+4/src/vmstate.c
--- old/libslirp-4.9.1+1/src/vmstate.c  2025-06-06 13:14:15.000000000 +0200
+++ new/libslirp-4.9.3+4/src/vmstate.c  2026-06-24 02:54:42.000000000 +0200
@@ -240,15 +240,13 @@
 static int get_buffer(SlirpIStream *f, void *pv, size_t size,
                       const VMStateField *field)
 {
-    slirp_istream_read(f, pv, size);
-    return 0;
+    return !slirp_istream_read(f, pv, size);
 }
 
 static int put_buffer(SlirpOStream *f, void *pv, size_t size,
                       const VMStateField *field)
 {
-    slirp_ostream_write(f, pv, size);
-    return 0;
+    return !slirp_ostream_write(f, pv, size);
 }
 
 const VMStateInfo slirp_vmstate_info_buffer = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libslirp-4.9.1+1/test/guestfwdtest.c 
new/libslirp-4.9.3+4/test/guestfwdtest.c
--- old/libslirp-4.9.1+1/test/guestfwdtest.c    1970-01-01 01:00:00.000000000 
+0100
+++ new/libslirp-4.9.3+4/test/guestfwdtest.c    2026-06-24 02:54:42.000000000 
+0200
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#include <assert.h>
+#include <stddef.h>
+
+#include "libslirp.h"
+
+static slirp_ssize_t guestfwd_write(const void *buf, size_t len, void *opaque)
+{
+    return len;
+}
+
+static SlirpCb callbacks;
+
+static struct in_addr in_addr4(uint32_t addr)
+{
+    struct in_addr ret = { .s_addr = htonl(addr) };
+
+    return ret;
+}
+
+static Slirp *guestfwd_slirp(bool disable_dns)
+{
+    SlirpConfig config = {
+        .version = SLIRP_CONFIG_VERSION_MAX,
+        .in_enabled = true,
+        .vnetwork = in_addr4(0x0a000200),
+        .vnetmask = in_addr4(0xffffff00),
+        .vhost = in_addr4(0x0a000202),
+        .vdhcp_start = in_addr4(0x0a00020f),
+        .vnameserver = in_addr4(0x0a000203),
+        .disable_dns = disable_dns,
+    };
+
+    return slirp_new(&config, &callbacks, NULL);
+}
+
+static void assert_guestfwd(Slirp *slirp, struct in_addr addr, int port,
+                            bool expect_ok)
+{
+    int ret;
+
+    ret = slirp_add_guestfwd(slirp, guestfwd_write, NULL, &addr, port);
+    assert((ret == 0) == expect_ok);
+
+    if (ret == 0) {
+        assert(slirp_remove_guestfwd(slirp, addr, port) == 0);
+    }
+}
+
+static void test_guestfwd_validation(void)
+{
+    struct in_addr vhost = in_addr4(0x0a000202);
+    struct in_addr vnameserver = in_addr4(0x0a000203);
+    Slirp *slirp;
+
+    slirp = guestfwd_slirp(false);
+    assert_guestfwd(slirp, vhost, 8080, true);
+    assert_guestfwd(slirp, vnameserver, 8080, true);
+    assert_guestfwd(slirp, vhost, 67, true);
+    assert_guestfwd(slirp, vhost, 69, true);
+    assert_guestfwd(slirp, vnameserver, 53, false);
+    slirp_cleanup(slirp);
+
+    slirp = guestfwd_slirp(true);
+    assert_guestfwd(slirp, vnameserver, 53, true);
+    slirp_cleanup(slirp);
+}
+
+int main(int argc, char *argv[])
+{
+    test_guestfwd_validation();
+}

++++++ libslirp.obsinfo ++++++
--- /var/tmp/diff_new_pack.vQUwuo/_old  2026-06-27 18:03:57.891679558 +0200
+++ /var/tmp/diff_new_pack.vQUwuo/_new  2026-06-27 18:03:57.915680363 +0200
@@ -1,5 +1,5 @@
 name: libslirp
-version: 4.9.1+1
-mtime: 1749208455
-commit: 5e171598422f816555bee331f18a6adbe1291b1a
+version: 4.9.3+4
+mtime: 1782262482
+commit: d82ac5a853813d70cb990bc31d6faeffe8e4dc51
 

Reply via email to