All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups
@ 2018-11-10 13:45 Marc-André Lureau
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context Marc-André Lureau
                   ` (14 more replies)
  0 siblings, 15 replies; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Hi,

Here is a bunch of slirp cleanups for 3.2.

Marc-André Lureau (13):
  slirp: associate slirp_output callback with the Slirp context
  slirp: remove do_pty from fork_exec()
  slirp: replace ex_pty with ex_chardev
  slirp: use a dedicated field for chardev pointer
  slirp: remove unused EMU_RSH
  slirp: rename /extra/chardev
  slirp: move internal function declarations
  slirp: remove Monitor dependency, return a string for info
  slirp: fix slirp_add_exec() leaks
  slirp: improve subprocess socket creation
  slirp: replace the poor-man string split with g_strsplit()
  glib-compat: add g_spawn_async_with_fds() fallback
  slirp: simplify fork_exec()

 include/glib-compat.h |  56 ++++++++++
 slirp/libslirp.h      |  14 ++-
 slirp/misc.h          |   9 +-
 slirp/slirp.h         |   4 +
 slirp/socket.h        |   2 +-
 net/slirp.c           |  20 ++--
 slirp/misc.c          | 240 +++++++++++++++++++-----------------------
 slirp/ncsi.c          |   2 +-
 slirp/slirp.c         |  34 +++---
 slirp/socket.c        |   4 -
 slirp/tcp_subr.c      |   9 +-
 11 files changed, 216 insertions(+), 178 deletions(-)

-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:11   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 02/13] slirp: remove do_pty from fork_exec() Marc-André Lureau
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Let's make the slirp interface a bit more library-like.
Associate the slirp_output() with a Slirp context.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/libslirp.h |  9 +++++----
 slirp/slirp.h    |  1 +
 net/slirp.c      |  5 +++--
 slirp/ncsi.c     |  2 +-
 slirp/slirp.c    | 11 +++++++----
 5 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 42e42e9a2a..52dbb9feb5 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -5,6 +5,8 @@
 
 typedef struct Slirp Slirp;
 
+typedef void (*slirp_output)(void *opaque, const uint8_t *pkt, int pkt_len);
+
 int get_dns_addr(struct in_addr *pdns_addr);
 int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
 
@@ -17,7 +19,9 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
                   const char *tftp_path, const char *bootfile,
                   struct in_addr vdhcp_start, struct in_addr vnameserver,
                   struct in6_addr vnameserver6, const char **vdnssearch,
-                  const char *vdomainname, void *opaque);
+                  const char *vdomainname,
+                  slirp_output output,
+                  void *opaque);
 void slirp_cleanup(Slirp *slirp);
 
 void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
@@ -26,9 +30,6 @@ void slirp_pollfds_poll(GArray *pollfds, int select_error);
 
 void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
 
-/* you must provide the following functions: */
-void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len);
-
 int slirp_add_hostfwd(Slirp *slirp, int is_udp,
                       struct in_addr host_addr, int host_port,
                       struct in_addr guest_addr, int guest_port);
diff --git a/slirp/slirp.h b/slirp/slirp.h
index b80725a0d6..e3d65d68ec 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -220,6 +220,7 @@ struct Slirp {
     GRand *grand;
     QEMUTimer *ra_timer;
 
+    slirp_output output;
     void *opaque;
 };
 
diff --git a/net/slirp.c b/net/slirp.c
index f6dc03963a..1dbd34a9da 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -99,7 +99,7 @@ static void slirp_smb_cleanup(SlirpState *s);
 static inline void slirp_smb_cleanup(SlirpState *s) { }
 #endif
 
-void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
+static void net_slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
 {
     SlirpState *s = opaque;
 
@@ -378,7 +378,8 @@ static int net_slirp_init(NetClientState *peer, const char *model,
                           ipv6, ip6_prefix, vprefix6_len, ip6_host,
                           vhostname, tftp_server_name,
                           tftp_export, bootfile, dhcp,
-                          dns, ip6_dns, dnssearch, vdomainname, s);
+                          dns, ip6_dns, dnssearch, vdomainname,
+                          net_slirp_output, s);
     QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
 
     for (config = slirp_configs; config; config = config->next) {
diff --git a/slirp/ncsi.c b/slirp/ncsi.c
index 7116034afc..d7701f7785 100644
--- a/slirp/ncsi.c
+++ b/slirp/ncsi.c
@@ -163,5 +163,5 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
     *pchecksum = htonl(checksum);
     ncsi_rsp_len += 4;
 
-    slirp_output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
+    slirp->output(slirp->opaque, ncsi_reply, ETH_HLEN + ncsi_rsp_len);
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 51de41fc02..878d6174a2 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -287,12 +287,15 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
                   const char *tftp_path, const char *bootfile,
                   struct in_addr vdhcp_start, struct in_addr vnameserver,
                   struct in6_addr vnameserver6, const char **vdnssearch,
-                  const char *vdomainname, void *opaque)
+                  const char *vdomainname,
+                  slirp_output output,
+                  void *opaque)
 {
     Slirp *slirp = g_malloc0(sizeof(Slirp));
 
     slirp_init_once();
 
+    slirp->output = output;
     slirp->grand = g_rand_new();
     slirp->restricted = restricted;
 
@@ -832,7 +835,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
             rah->ar_sip = ah->ar_tip;
             memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN);
             rah->ar_tip = ah->ar_sip;
-            slirp_output(slirp->opaque, arp_reply, sizeof(arp_reply));
+            slirp->output(slirp->opaque, arp_reply, sizeof(arp_reply));
         }
         break;
     case ARPOP_REPLY:
@@ -932,7 +935,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh,
             /* target IP */
             rah->ar_tip = iph->ip_dst.s_addr;
             slirp->client_ipaddr = iph->ip_dst;
-            slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
+            slirp->output(slirp->opaque, arp_req, sizeof(arp_req));
             ifm->resolution_requested = true;
 
             /* Expire request and drop outgoing packet after 1 second */
@@ -1018,7 +1021,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
                 eh->h_dest[0], eh->h_dest[1], eh->h_dest[2],
                 eh->h_dest[3], eh->h_dest[4], eh->h_dest[5]));
     memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len);
-    slirp_output(slirp->opaque, buf, ifm->m_len + ETH_HLEN);
+    slirp->output(slirp->opaque, buf, ifm->m_len + ETH_HLEN);
     return 1;
 }
 
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 02/13] slirp: remove do_pty from fork_exec()
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:21   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 03/13] slirp: replace ex_pty with ex_chardev Marc-André Lureau
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

QEMU uses fork_exec() with do_pty values 0 or 3.
Let's clean up some unused code.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.h     |  2 +-
 slirp/misc.c     | 55 ++++++++++++++----------------------------------
 slirp/tcp_subr.c |  2 +-
 3 files changed, 18 insertions(+), 41 deletions(-)

diff --git a/slirp/misc.h b/slirp/misc.h
index 5211bbd30a..897650aea1 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -53,6 +53,6 @@ struct slirp_quehead {
 void slirp_insque(void *, void *);
 void slirp_remque(void *);
 int add_exec(struct ex_list **, int, char *, struct in_addr, int);
-int fork_exec(struct socket *so, const char *ex, int do_pty);
+int fork_exec(struct socket *so, const char *ex);
 
 #endif
diff --git a/slirp/misc.c b/slirp/misc.c
index 260187b6b6..ec5d5ec073 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -63,7 +63,7 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
 #ifdef _WIN32
 
 int
-fork_exec(struct socket *so, const char *ex, int do_pty)
+fork_exec(struct socket *so, const char *ex)
 {
     /* not implemented */
     return 0;
@@ -77,13 +77,9 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
  * process, which connects to this socket, after which we
  * exec the wanted program.  If something (strange) happens,
  * the accept() call could block us forever.
- *
- * do_pty = 0   Fork/exec inetd style
- * do_pty = 1   Fork/exec using slirp.telnetd
- * do_ptr = 2   Fork/exec using pty
  */
 int
-fork_exec(struct socket *so, const char *ex, int do_pty)
+fork_exec(struct socket *so, const char *ex)
 {
 	int s;
 	struct sockaddr_in addr;
@@ -99,26 +95,20 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
 	DEBUG_CALL("fork_exec");
 	DEBUG_ARG("so = %p", so);
 	DEBUG_ARG("ex = %p", ex);
-	DEBUG_ARG("do_pty = %x", do_pty);
-
-	if (do_pty == 2) {
-                return 0;
-	} else {
-		addr.sin_family = AF_INET;
-		addr.sin_port = 0;
-		addr.sin_addr.s_addr = INADDR_ANY;
 
-		if ((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
-		    bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
-		    listen(s, 1) < 0) {
-			error_report("Error: inet socket: %s", strerror(errno));
-			if (s >= 0) {
-			    closesocket(s);
-			}
+    addr.sin_family = AF_INET;
+    addr.sin_port = 0;
+    addr.sin_addr.s_addr = INADDR_ANY;
 
-			return 0;
-		}
-	}
+    s = qemu_socket(AF_INET, SOCK_STREAM, 0);
+    if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
+        listen(s, 1) < 0) {
+        error_report("Error: inet socket: %s", strerror(errno));
+        if (s >= 0) {
+            closesocket(s);
+        }
+        return 0;
+    }
 
 	pid = fork();
 	switch(pid) {
@@ -151,13 +141,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
 
 		i = 0;
 		bptr = g_strdup(ex); /* No need to free() this */
-		if (do_pty == 1) {
-			/* Setup "slirp.telnetd -x" */
-			argv[i++] = "slirp.telnetd";
-			argv[i++] = "-x";
-			argv[i++] = bptr;
-		} else
-		   do {
+        do {
 			/* Change the string into argv[] */
 			curarg = bptr;
 			while (*bptr != ' ' && *bptr != (char)0)
@@ -165,7 +149,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
 			c = *bptr;
 			*bptr++ = (char)0;
 			argv[i++] = g_strdup(curarg);
-		   } while (c);
+        } while (c);
 
                 argv[i] = NULL;
 		execvp(argv[0], (char **)argv);
@@ -193,13 +177,6 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
                 opt = 1;
                 qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
 		qemu_set_nonblock(so->s);
-
-		/* Append the telnet options now */
-                if (so->so_m != NULL && do_pty == 1)  {
-			sbappend(so, so->so_m);
-                        so->so_m = NULL;
-		}
-
 		return 1;
 	}
 }
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index 8d0f94b75f..a82efe78d7 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -973,7 +973,7 @@ int tcp_ctl(struct socket *so)
                 }
                 do_pty = ex_ptr->ex_pty;
                 DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
-                return fork_exec(so, ex_ptr->ex_exec, do_pty);
+                return fork_exec(so, ex_ptr->ex_exec);
             }
         }
     }
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 03/13] slirp: replace ex_pty with ex_chardev
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context Marc-André Lureau
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 02/13] slirp: remove do_pty from fork_exec() Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:26   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer Marc-André Lureau
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

do_pty == 3 means to talk to a chardev.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.h     | 2 +-
 slirp/misc.c     | 2 +-
 slirp/slirp.c    | 4 ++--
 slirp/tcp_subr.c | 4 +---
 4 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/slirp/misc.h b/slirp/misc.h
index 897650aea1..1f8d11def6 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -9,7 +9,7 @@
 #define MISC_H
 
 struct ex_list {
-	int ex_pty;			/* Do we want a pty? */
+	int ex_chardev;
 	struct in_addr ex_addr;		/* Server address */
 	int ex_fport;                   /* Port to telnet to */
 	const char *ex_exec;            /* Command line of what to exec */
diff --git a/slirp/misc.c b/slirp/misc.c
index ec5d5ec073..aa3c4b9771 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -53,7 +53,7 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
 	*ex_ptr = g_new(struct ex_list, 1);
 	(*ex_ptr)->ex_fport = port;
 	(*ex_ptr)->ex_addr = addr;
-	(*ex_ptr)->ex_pty = do_pty;
+	(*ex_ptr)->ex_chardev = do_pty == 3;
 	(*ex_ptr)->ex_exec = (do_pty == 3) ? exec : g_strdup(exec);
 	(*ex_ptr)->ex_next = tmp_ptr;
 	return 0;
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 878d6174a2..eb468facb1 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1444,7 +1444,7 @@ static void slirp_state_save(QEMUFile *f, void *opaque)
     struct ex_list *ex_ptr;
 
     for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
-        if (ex_ptr->ex_pty == 3) {
+        if (ex_ptr->ex_chardev) {
             struct socket *so;
             so = slirp_find_ctl_socket(slirp, ex_ptr->ex_addr,
                                        ntohs(ex_ptr->ex_fport));
@@ -1482,7 +1482,7 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
             return -EINVAL;
         }
         for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) {
-            if (ex_ptr->ex_pty == 3 &&
+            if (ex_ptr->ex_chardev &&
                 so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr &&
                 so->so_fport == ex_ptr->ex_fport) {
                 break;
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index a82efe78d7..c534b0224b 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -956,7 +956,6 @@ int tcp_ctl(struct socket *so)
     Slirp *slirp = so->slirp;
     struct sbuf *sb = &so->so_snd;
     struct ex_list *ex_ptr;
-    int do_pty;
 
     DEBUG_CALL("tcp_ctl");
     DEBUG_ARG("so = %p", so);
@@ -966,12 +965,11 @@ int tcp_ctl(struct socket *so)
         for (ex_ptr = slirp->exec_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->ex_pty == 3) {
+                if (ex_ptr->ex_chardev) {
                     so->s = -1;
                     so->extra = (void *)ex_ptr->ex_exec;
                     return 1;
                 }
-                do_pty = ex_ptr->ex_pty;
                 DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
                 return fork_exec(so, ex_ptr->ex_exec);
             }
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (2 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 03/13] slirp: replace ex_pty with ex_chardev Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:28   ` Samuel Thibault
  2018-11-15 13:13   ` Paolo Bonzini
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH Marc-André Lureau
                   ` (10 subsequent siblings)
  14 siblings, 2 replies; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Let's not mix command line and chardev pointers.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/libslirp.h |  2 +-
 slirp/misc.h     |  4 ++--
 net/slirp.c      |  8 ++++----
 slirp/misc.c     | 11 +++++++----
 slirp/slirp.c    |  5 +++--
 slirp/tcp_subr.c |  2 +-
 6 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 52dbb9feb5..3e88dbaa01 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -35,7 +35,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp,
                       struct in_addr guest_addr, int guest_port);
 int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
                          struct in_addr host_addr, int host_port);
-int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
+int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
                    struct in_addr *guest_addr, int guest_port);
 
 void slirp_connection_info(Slirp *slirp, Monitor *mon);
diff --git a/slirp/misc.h b/slirp/misc.h
index 1f8d11def6..64ca88c3b7 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -9,7 +9,7 @@
 #define MISC_H
 
 struct ex_list {
-	int ex_chardev;
+	void *ex_chardev;
 	struct in_addr ex_addr;		/* Server address */
 	int ex_fport;                   /* Port to telnet to */
 	const char *ex_exec;            /* Command line of what to exec */
@@ -52,7 +52,7 @@ struct slirp_quehead {
 
 void slirp_insque(void *, void *);
 void slirp_remque(void *);
-int add_exec(struct ex_list **, int, char *, struct in_addr, int);
+int add_exec(struct ex_list **, void *, const char *, struct in_addr, int);
 int fork_exec(struct socket *so, const char *ex);
 
 #endif
diff --git a/net/slirp.c b/net/slirp.c
index 1dbd34a9da..0bb12567fe 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -709,8 +709,8 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
              CONFIG_SMBD_COMMAND, s->smb_dir, smb_conf);
     g_free(smb_conf);
 
-    if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0 ||
-        slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 445) < 0) {
+    if (slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 139) < 0 ||
+        slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 445) < 0) {
         slirp_smb_cleanup(s);
         g_free(smb_cmdline);
         error_setg(errp, "Conflicting/invalid smbserver address");
@@ -774,7 +774,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
     snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port);
 
     if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) {
-        if (slirp_add_exec(s->slirp, 0, &p[4], &server, port) < 0) {
+        if (slirp_add_exec(s->slirp, NULL, &p[4], &server, port) < 0) {
             error_setg(errp, "Conflicting/invalid host:port in guest "
                        "forwarding rule '%s'", config_str);
             return -1;
@@ -801,7 +801,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
             return -1;
         }
 
-        if (slirp_add_exec(s->slirp, 3, &fwd->hd, &server, port) < 0) {
+        if (slirp_add_exec(s->slirp, &fwd->hd, NULL, &server, port) < 0) {
             error_setg(errp, "Conflicting/invalid host:port in guest "
                        "forwarding rule '%s'", config_str);
             g_free(fwd);
diff --git a/slirp/misc.c b/slirp/misc.c
index aa3c4b9771..1e9415e729 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -37,7 +37,7 @@ remque(void *a)
   element->qh_rlink = NULL;
 }
 
-int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
+int add_exec(struct ex_list **ex_ptr, void *chardev, const char *cmdline,
              struct in_addr addr, int port)
 {
 	struct ex_list *tmp_ptr;
@@ -50,11 +50,14 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
 	}
 
 	tmp_ptr = *ex_ptr;
-	*ex_ptr = g_new(struct ex_list, 1);
+	*ex_ptr = g_new0(struct ex_list, 1);
 	(*ex_ptr)->ex_fport = port;
 	(*ex_ptr)->ex_addr = addr;
-	(*ex_ptr)->ex_chardev = do_pty == 3;
-	(*ex_ptr)->ex_exec = (do_pty == 3) ? exec : g_strdup(exec);
+	if (chardev) {
+		(*ex_ptr)->ex_chardev = chardev;
+	} else {
+		(*ex_ptr)->ex_exec = g_strdup(cmdline);
+	}
 	(*ex_ptr)->ex_next = tmp_ptr;
 	return 0;
 }
diff --git a/slirp/slirp.c b/slirp/slirp.c
index eb468facb1..58d1ef64e9 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1068,7 +1068,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
     return 0;
 }
 
-int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
+int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
                    struct in_addr *guest_addr, int guest_port)
 {
     if (!guest_addr->s_addr) {
@@ -1081,7 +1081,8 @@ int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
         guest_addr->s_addr == slirp->vnameserver_addr.s_addr) {
         return -1;
     }
-    return add_exec(&slirp->exec_list, do_pty, (char *)args, *guest_addr,
+
+    return add_exec(&slirp->exec_list, chardev, cmdline, *guest_addr,
                     htons(guest_port));
 }
 
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index c534b0224b..e0bf7ad070 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -967,7 +967,7 @@ int tcp_ctl(struct socket *so)
                 so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
                 if (ex_ptr->ex_chardev) {
                     so->s = -1;
-                    so->extra = (void *)ex_ptr->ex_exec;
+                    so->extra = ex_ptr->ex_chardev;
                     return 1;
                 }
                 DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (3 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:30   ` Samuel Thibault
  2018-11-15 13:15   ` Paolo Bonzini
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 06/13] slirp: rename /extra/chardev Marc-André Lureau
                   ` (9 subsequent siblings)
  14 siblings, 2 replies; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

EMU_RSH handling was dropped in commit
0d62c4cfe21752df4c1d6e2c2398f15d5eaa794a.

The assignment, and subsequent free() of ex_ptr->ex_exec to so->extra
looks unsafe (double free is likely to occur).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.h     | 1 -
 slirp/slirp.c    | 2 --
 slirp/socket.c   | 4 ----
 slirp/tcp_subr.c | 1 -
 4 files changed, 8 deletions(-)

diff --git a/slirp/misc.h b/slirp/misc.h
index 64ca88c3b7..94829722cd 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -26,7 +26,6 @@ struct ex_list {
 #define EMU_REALAUDIO 0x5
 #define EMU_RLOGIN 0x6
 #define EMU_IDENT 0x7
-#define EMU_RSH 0x8
 
 #define EMU_NOCONNECT 0x10	/* Don't connect */
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 58d1ef64e9..daa0d5d4bd 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1491,8 +1491,6 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
         }
         if (!ex_ptr)
             return -EINVAL;
-
-        so->extra = (void *)ex_ptr->ex_exec;
     }
 
     return vmstate_load_state(f, &vmstate_slirp, slirp, version_id);
diff --git a/slirp/socket.c b/slirp/socket.c
index 322383a1f9..ff6ef1e334 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -91,10 +91,6 @@ sofree(struct socket *so)
   soqfree(so, &slirp->if_fastq);
   soqfree(so, &slirp->if_batchq);
 
-  if (so->so_emu==EMU_RSH && so->extra) {
-	sofree(so->extra);
-	so->extra=NULL;
-  }
   if (so == slirp->tcp_last_so) {
       slirp->tcp_last_so = &slirp->tcb;
   } else if (so == slirp->udp_last_so) {
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index e0bf7ad070..eb894b6527 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -546,7 +546,6 @@ static const struct tos_t tcptos[] = {
 	  {0, 23, IPTOS_LOWDELAY, 0},	/* telnet */
 	  {0, 80, IPTOS_THROUGHPUT, 0},	/* WWW */
 	  {0, 513, IPTOS_LOWDELAY, EMU_RLOGIN|EMU_NOCONNECT},	/* rlogin */
-	  {0, 514, IPTOS_LOWDELAY, EMU_RSH|EMU_NOCONNECT},	/* shell */
 	  {0, 544, IPTOS_LOWDELAY, EMU_KSH},		/* kshell */
 	  {0, 543, IPTOS_LOWDELAY, 0},	/* klogin */
 	  {0, 6667, IPTOS_THROUGHPUT, EMU_IRC},	/* IRC */
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 06/13] slirp: rename /extra/chardev
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (4 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:30   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 07/13] slirp: move internal function declarations Marc-André Lureau
                   ` (8 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Now it's only used for the chardev pointer.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/socket.h   | 2 +-
 slirp/slirp.c    | 4 ++--
 slirp/tcp_subr.c | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/slirp/socket.h b/slirp/socket.h
index 2f224bc34f..930ed95972 100644
--- a/slirp/socket.h
+++ b/slirp/socket.h
@@ -67,7 +67,7 @@ struct socket {
 
   struct sbuf so_rcv;		/* Receive buffer */
   struct sbuf so_snd;		/* Send buffer */
-  void * extra;			/* Extra pointer */
+  void * chardev;
 };
 
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index daa0d5d4bd..d6623a2bbf 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -1088,10 +1088,10 @@ int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
 
 ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags)
 {
-    if (so->s == -1 && so->extra) {
+    if (so->s == -1 && so->chardev) {
         /* XXX this blocks entire thread. Rewrite to use
          * qemu_chr_fe_write and background I/O callbacks */
-        qemu_chr_fe_write_all(so->extra, buf, len);
+        qemu_chr_fe_write_all(so->chardev, buf, len);
         return len;
     }
 
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index eb894b6527..9b8a11159d 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -966,7 +966,7 @@ int tcp_ctl(struct socket *so)
                 so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
                 if (ex_ptr->ex_chardev) {
                     so->s = -1;
-                    so->extra = ex_ptr->ex_chardev;
+                    so->chardev = ex_ptr->ex_chardev;
                     return 1;
                 }
                 DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 07/13] slirp: move internal function declarations
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (5 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 06/13] slirp: rename /extra/chardev Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:31   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 08/13] slirp: remove Monitor dependency, return a string for info Marc-André Lureau
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Clarify that those functions are internal to slirp.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/libslirp.h | 3 ---
 slirp/slirp.h    | 3 +++
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 3e88dbaa01..a4f390ee89 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -7,9 +7,6 @@ typedef struct Slirp Slirp;
 
 typedef void (*slirp_output)(void *opaque, const uint8_t *pkt, int pkt_len);
 
-int get_dns_addr(struct in_addr *pdns_addr);
-int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
-
 Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
                   struct in_addr vnetmask, struct in_addr vhost,
                   bool in6_enabled,
diff --git a/slirp/slirp.h b/slirp/slirp.h
index e3d65d68ec..de299aa36c 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -232,6 +232,9 @@ extern Slirp *slirp_instance;
 
 void if_start(Slirp *);
 
+int get_dns_addr(struct in_addr *pdns_addr);
+int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id);
+
 /* ncsi.c */
 void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len);
 
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 08/13] slirp: remove Monitor dependency, return a string for info
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (6 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 07/13] slirp: move internal function declarations Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:35   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 09/13] slirp: fix slirp_add_exec() leaks Marc-André Lureau
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

There is nothing performance-sensitive in returning an allocated
string for info, and handling the monitor_printf() on the caller side.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/libslirp.h |  2 +-
 net/slirp.c      |  7 ++++---
 slirp/misc.c     | 23 +++++++++++++----------
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index a4f390ee89..04b6db9f49 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -35,7 +35,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
 int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
                    struct in_addr *guest_addr, int guest_port);
 
-void slirp_connection_info(Slirp *slirp, Monitor *mon);
+char *slirp_connection_info(Slirp *slirp);
 
 void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr,
                        int guest_port, const uint8_t *buf, int size);
diff --git a/net/slirp.c b/net/slirp.c
index 0bb12567fe..dfc72cfc2e 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -828,10 +828,11 @@ void hmp_info_usernet(Monitor *mon, const QDict *qdict)
     QTAILQ_FOREACH(s, &slirp_stacks, entry) {
         int id;
         bool got_hub_id = net_hub_id_for_client(&s->nc, &id) == 0;
-        monitor_printf(mon, "Hub %d (%s):\n",
+        char *info = slirp_connection_info(s->slirp);
+        monitor_printf(mon, "Hub %d (%s):\n%s",
                        got_hub_id ? id : -1,
-                       s->nc.name);
-        slirp_connection_info(s->slirp, mon);
+                       s->nc.name, info);
+        g_free(info);
     }
 }
 
diff --git a/slirp/misc.c b/slirp/misc.c
index 1e9415e729..54edc0b0b9 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -8,7 +8,6 @@
 #include "qemu/osdep.h"
 #include "slirp.h"
 #include "libslirp.h"
-#include "monitor/monitor.h"
 #include "qemu/error-report.h"
 #include "qemu/main-loop.h"
 
@@ -185,8 +184,9 @@ fork_exec(struct socket *so, const char *ex)
 }
 #endif
 
-void slirp_connection_info(Slirp *slirp, Monitor *mon)
+char *slirp_connection_info(Slirp *slirp)
 {
+    GString *str = g_string_new(NULL);
     const char * const tcpstates[] = {
         [TCPS_CLOSED]       = "CLOSED",
         [TCPS_LISTEN]       = "LISTEN",
@@ -208,8 +208,9 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
     const char *state;
     char buf[20];
 
-    monitor_printf(mon, "  Protocol[State]    FD  Source Address  Port   "
-                        "Dest. Address  Port RecvQ SendQ\n");
+    g_string_append_printf(str,
+        "  Protocol[State]    FD  Source Address  Port   "
+        "Dest. Address  Port RecvQ SendQ\n");
 
     for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) {
         if (so->so_state & SS_HOSTFWD) {
@@ -231,10 +232,10 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
             dst_port = so->so_fport;
         }
         snprintf(buf, sizeof(buf), "  TCP[%s]", state);
-        monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
+        g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s,
                        src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
                        ntohs(src.sin_port));
-        monitor_printf(mon, "%15s %5d %5d %5d\n",
+        g_string_append_printf(str, "%15s %5d %5d %5d\n",
                        inet_ntoa(dst_addr), ntohs(dst_port),
                        so->so_rcv.sb_cc, so->so_snd.sb_cc);
     }
@@ -254,10 +255,10 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
             dst_addr = so->so_faddr;
             dst_port = so->so_fport;
         }
-        monitor_printf(mon, "%-19s %3d %15s %5d ", buf, so->s,
+        g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s,
                        src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*",
                        ntohs(src.sin_port));
-        monitor_printf(mon, "%15s %5d %5d %5d\n",
+        g_string_append_printf(str, "%15s %5d %5d %5d\n",
                        inet_ntoa(dst_addr), ntohs(dst_port),
                        so->so_rcv.sb_cc, so->so_snd.sb_cc);
     }
@@ -267,9 +268,11 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon)
                      (so->so_expire - curtime) / 1000);
         src.sin_addr = so->so_laddr;
         dst_addr = so->so_faddr;
-        monitor_printf(mon, "%-19s %3d %15s  -    ", buf, so->s,
+        g_string_append_printf(str, "%-19s %3d %15s  -    ", buf, so->s,
                        src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*");
-        monitor_printf(mon, "%15s  -    %5d %5d\n", inet_ntoa(dst_addr),
+        g_string_append_printf(str, "%15s  -    %5d %5d\n", inet_ntoa(dst_addr),
                        so->so_rcv.sb_cc, so->so_snd.sb_cc);
     }
+
+    return g_string_free(str, FALSE);
 }
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 09/13] slirp: fix slirp_add_exec() leaks
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (7 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 08/13] slirp: remove Monitor dependency, return a string for info Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:37   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation Marc-André Lureau
                   ` (5 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Free the list elements allocated in add_exec().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.h  | 2 +-
 slirp/slirp.c | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/slirp/misc.h b/slirp/misc.h
index 94829722cd..0bc5e74bc5 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -12,7 +12,7 @@ struct ex_list {
 	void *ex_chardev;
 	struct in_addr ex_addr;		/* Server address */
 	int ex_fport;                   /* Port to telnet to */
-	const char *ex_exec;            /* Command line of what to exec */
+	char *ex_exec;                  /* Command line of what to exec */
 	struct ex_list *ex_next;
 };
 
diff --git a/slirp/slirp.c b/slirp/slirp.c
index d6623a2bbf..29fe4702cc 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -342,6 +342,14 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
 
 void slirp_cleanup(Slirp *slirp)
 {
+    struct ex_list *e, *next;
+
+    for (e = slirp->exec_list; e; e = next) {
+        next = e->ex_next;
+        g_free(e->ex_exec);
+        g_free(e);
+    }
+
     QTAILQ_REMOVE(&slirp_instances, slirp, entry);
 
     unregister_savevm(NULL, "slirp", slirp);
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (8 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 09/13] slirp: fix slirp_add_exec() leaks Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 13:53   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 11/13] slirp: replace the poor-man string split with g_strsplit() Marc-André Lureau
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Fix a bunch of error handling issues by creating the "TCP socketpair"
from the parent process. (the code is currently disabled on Windows:
at first I thought a socketpair() could be used, but I realized that
slirp calls MSG_OOB on the socket, which isn't implemented on Linux)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.c | 133 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 72 insertions(+), 61 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index 54edc0b0b9..d9804f2a6d 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -73,42 +73,75 @@ fork_exec(struct socket *so, const char *ex)
 
 #else
 
-/*
- * XXX This is ugly
- * We create and bind a socket, then fork off to another
- * process, which connects to this socket, after which we
- * exec the wanted program.  If something (strange) happens,
- * the accept() call could block us forever.
- */
+static int
+slirp_socketpair_with_oob(int sv[2])
+{
+    struct sockaddr_in addr = {
+        .sin_family = AF_INET,
+        .sin_port = 0,
+        .sin_addr.s_addr = INADDR_ANY,
+    };
+    socklen_t addrlen = sizeof(addr);
+    int ret, s;
+
+    sv[1] = -1;
+    s = qemu_socket(AF_INET, SOCK_STREAM, 0);
+    if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
+        listen(s, 1) < 0 ||
+        getsockname(s, (struct sockaddr *)&addr, &addrlen) < 0) {
+        goto err;
+    }
+
+    sv[1] = qemu_socket(AF_INET, SOCK_STREAM, 0);
+    if (sv[1] < 0) {
+        goto err;
+    }
+
+    qemu_set_nonblock(sv[1]);
+    do {
+        ret = connect(sv[1], (struct sockaddr *)&addr, addrlen);
+    } while (ret < 0 && errno == EINTR);
+    if (ret == -1 && errno != EINPROGRESS) {
+        goto err;
+    }
+    qemu_set_block(sv[1]);
+
+    do {
+        sv[0] = accept(s, (struct sockaddr *)&addr, &addrlen);
+    } while (sv[0] < 0 && errno == EINTR);
+    if (sv[0] < 0) {
+        goto err;
+    }
+
+    closesocket(s);
+    return 0;
+
+err:
+    error_report("Error: slirp_socketpair(): %s", strerror(errno));
+    if (s >= 0) {
+        closesocket(s);
+    }
+    if (sv[1] >= 0) {
+        closesocket(sv[1]);
+    }
+    return -1;
+}
+
 int
 fork_exec(struct socket *so, const char *ex)
 {
-	int s;
-	struct sockaddr_in addr;
-	socklen_t addrlen = sizeof(addr);
-	int opt;
 	const char *argv[256];
 	/* don't want to clobber the original */
 	char *bptr;
 	const char *curarg;
-	int c, i, ret;
+	int opt, c, i, sp[2];
 	pid_t pid;
 
 	DEBUG_CALL("fork_exec");
 	DEBUG_ARG("so = %p", so);
 	DEBUG_ARG("ex = %p", ex);
 
-    addr.sin_family = AF_INET;
-    addr.sin_port = 0;
-    addr.sin_addr.s_addr = INADDR_ANY;
-
-    s = qemu_socket(AF_INET, SOCK_STREAM, 0);
-    if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
-        listen(s, 1) < 0) {
-        error_report("Error: inet socket: %s", strerror(errno));
-        if (s >= 0) {
-            closesocket(s);
-        }
+    if (slirp_socketpair_with_oob(sp) < 0) {
         return 0;
     }
 
@@ -116,30 +149,17 @@ fork_exec(struct socket *so, const char *ex)
 	switch(pid) {
 	 case -1:
 		error_report("Error: fork failed: %s", strerror(errno));
-		close(s);
+		closesocket(sp[0]);
+		closesocket(sp[1]);
 		return 0;
 
 	 case 0:
-                setsid();
-
-		/* Set the DISPLAY */
-                getsockname(s, (struct sockaddr *)&addr, &addrlen);
-                close(s);
-                /*
-                 * Connect to the socket
-                 * XXX If any of these fail, we're in trouble!
-                 */
-                s = qemu_socket(AF_INET, SOCK_STREAM, 0);
-                addr.sin_addr = loopback_addr;
-                do {
-                    ret = connect(s, (struct sockaddr *)&addr, addrlen);
-                } while (ret < 0 && errno == EINTR);
-
-		dup2(s, 0);
-		dup2(s, 1);
-		dup2(s, 2);
-		for (s = getdtablesize() - 1; s >= 3; s--)
-		   close(s);
+         setsid();
+		dup2(sp[1], 0);
+		dup2(sp[1], 1);
+		dup2(sp[1], 2);
+		for (c = getdtablesize() - 1; c >= 3; c--)
+		   close(c);
 
 		i = 0;
 		bptr = g_strdup(ex); /* No need to free() this */
@@ -163,23 +183,14 @@ fork_exec(struct socket *so, const char *ex)
 		exit(1);
 
 	 default:
-		qemu_add_child_watch(pid);
-                /*
-                 * XXX this could block us...
-                 * XXX Should set a timer here, and if accept() doesn't
-                 * return after X seconds, declare it a failure
-                 * The only reason this will block forever is if socket()
-                 * of connect() fail in the child process
-                 */
-                do {
-                    so->s = accept(s, (struct sockaddr *)&addr, &addrlen);
-                } while (so->s < 0 && errno == EINTR);
-                closesocket(s);
-                socket_set_fast_reuse(so->s);
-                opt = 1;
-                qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
-		qemu_set_nonblock(so->s);
-		return 1;
+         so->s = sp[0];
+         closesocket(sp[1]);
+         qemu_add_child_watch(pid);
+         socket_set_fast_reuse(so->s);
+         opt = 1;
+         qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+         qemu_set_nonblock(so->s);
+         return 1;
 	}
 }
 #endif
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 11/13] slirp: replace the poor-man string split with g_strsplit()
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (9 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 14:42   ` Samuel Thibault
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 12/13] glib-compat: add g_spawn_async_with_fds() fallback Marc-André Lureau
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Use the glib function for the work, fix a potential crash on >256 words.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.c | 21 +++------------------
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index d9804f2a6d..dedc9bf6c3 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -130,11 +130,8 @@ err:
 int
 fork_exec(struct socket *so, const char *ex)
 {
-	const char *argv[256];
-	/* don't want to clobber the original */
-	char *bptr;
-	const char *curarg;
-	int opt, c, i, sp[2];
+	char **argv;
+	int opt, c, sp[2];
 	pid_t pid;
 
 	DEBUG_CALL("fork_exec");
@@ -161,19 +158,7 @@ fork_exec(struct socket *so, const char *ex)
 		for (c = getdtablesize() - 1; c >= 3; c--)
 		   close(c);
 
-		i = 0;
-		bptr = g_strdup(ex); /* No need to free() this */
-        do {
-			/* Change the string into argv[] */
-			curarg = bptr;
-			while (*bptr != ' ' && *bptr != (char)0)
-			   bptr++;
-			c = *bptr;
-			*bptr++ = (char)0;
-			argv[i++] = g_strdup(curarg);
-        } while (c);
-
-                argv[i] = NULL;
+        argv = g_strsplit(ex, " ", -1);
 		execvp(argv[0], (char **)argv);
 
 		/* Ooops, failed, let's tell the user why */
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 12/13] glib-compat: add g_spawn_async_with_fds() fallback
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (10 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 11/13] slirp: replace the poor-man string split with g_strsplit() Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 13/13] slirp: simplify fork_exec() Marc-André Lureau
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/glib-compat.h | 56 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/include/glib-compat.h b/include/glib-compat.h
index fdf95a255d..4a10c9691f 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -83,6 +83,62 @@ static inline gboolean g_strv_contains_qemu(const gchar *const *strv,
 }
 #define g_strv_contains(a, b) g_strv_contains_qemu(a, b)
 
+#if !GLIB_CHECK_VERSION(2, 58, 0)
+typedef struct QemuGSpawnFds {
+    GSpawnChildSetupFunc child_setup;
+    gpointer user_data;
+    gint stdin_fd;
+    gint stdout_fd;
+    gint stderr_fd;
+} QemuGSpawnFds;
+
+static inline void
+qemu_gspawn_fds_setup(gpointer user_data)
+{
+    QemuGSpawnFds *q = user_data;
+
+    dup2(q->stdin_fd, 0);
+    dup2(q->stdout_fd, 1);
+    dup2(q->stderr_fd, 2);
+    q->child_setup(q->user_data);
+}
+#endif
+
+static inline gboolean
+g_spawn_async_with_fds_qemu(const gchar *working_directory,
+                            gchar **argv,
+                            gchar **envp,
+                            GSpawnFlags flags,
+                            GSpawnChildSetupFunc child_setup,
+                            gpointer user_data,
+                            GPid *child_pid,
+                            gint stdin_fd,
+                            gint stdout_fd,
+                            gint stderr_fd,
+                            GError **error)
+{
+#if GLIB_CHECK_VERSION(2, 58, 0)
+    return g_spawn_async_with_fds(working_directory, argv, envp, flags,
+                                  child_setup, user_data,
+                                  child_pid, stdin_fd, stdout_fd, stderr_fd,
+                                  error);
+#else
+    QemuGSpawnFds setup = {
+        .child_setup = child_setup,
+        .user_data = user_data,
+        .stdin_fd = stdin_fd,
+        .stdout_fd = stdout_fd,
+        .stderr_fd = stderr_fd,
+    };
+
+    return g_spawn_async(working_directory, argv, envp, flags,
+                         qemu_gspawn_fds_setup, &setup,
+                         child_pid, error);
+#endif
+}
+
+#define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \
+    g_spawn_async_with_fds_qemu(wd, argv, env, f, c, d, p, ifd, ofd, efd, err)
 
 #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
 /*
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [Qemu-devel] [PATCH for-3.2 13/13] slirp: simplify fork_exec()
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (11 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 12/13] glib-compat: add g_spawn_async_with_fds() fallback Marc-André Lureau
@ 2018-11-10 13:45 ` Marc-André Lureau
  2018-11-10 13:54   ` Samuel Thibault
  2018-11-10 20:19 ` [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups no-reply
  2018-11-10 20:48 ` no-reply
  14 siblings, 1 reply; 32+ messages in thread
From: Marc-André Lureau @ 2018-11-10 13:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jan Kiszka, Samuel Thibault, Jason Wang, Marc-André Lureau

Use g_spawn_async_with_fds() to setup the child.

GSpawn handles reaping the child, and closing parent file descriptors.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/misc.c | 77 +++++++++++++++++++++++++---------------------------
 1 file changed, 37 insertions(+), 40 deletions(-)

diff --git a/slirp/misc.c b/slirp/misc.c
index dedc9bf6c3..f99e3a8fcc 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -127,56 +127,53 @@ err:
     return -1;
 }
 
+static void
+fork_exec_child_setup(gpointer data)
+{
+    setsid();
+}
+
 int
 fork_exec(struct socket *so, const char *ex)
 {
-	char **argv;
-	int opt, c, sp[2];
-	pid_t pid;
+    GError *err = NULL;
+    char **argv;
+    int opt, sp[2];
 
-	DEBUG_CALL("fork_exec");
-	DEBUG_ARG("so = %p", so);
-	DEBUG_ARG("ex = %p", ex);
+    DEBUG_CALL("fork_exec");
+    DEBUG_ARG("so = %p", so);
+    DEBUG_ARG("ex = %p", ex);
 
     if (slirp_socketpair_with_oob(sp) < 0) {
         return 0;
     }
 
-	pid = fork();
-	switch(pid) {
-	 case -1:
-		error_report("Error: fork failed: %s", strerror(errno));
-		closesocket(sp[0]);
-		closesocket(sp[1]);
-		return 0;
-
-	 case 0:
-         setsid();
-		dup2(sp[1], 0);
-		dup2(sp[1], 1);
-		dup2(sp[1], 2);
-		for (c = getdtablesize() - 1; c >= 3; c--)
-		   close(c);
-
-        argv = g_strsplit(ex, " ", -1);
-		execvp(argv[0], (char **)argv);
-
-		/* Ooops, failed, let's tell the user why */
-        fprintf(stderr, "Error: execvp of %s failed: %s\n",
-                argv[0], strerror(errno));
-		close(0); close(1); close(2); /* XXX */
-		exit(1);
+    argv = g_strsplit(ex, " ", -1);
+    g_spawn_async_with_fds(NULL /* cwd */,
+                           argv,
+                           NULL /* env */,
+                           G_SPAWN_SEARCH_PATH,
+                           fork_exec_child_setup, NULL /* data */,
+                           NULL /* child_pid */,
+                           sp[1], sp[1], sp[1],
+                           &err);
+    g_strfreev(argv);
+
+    if (err) {
+        error_report("%s", err->message);
+        g_error_free(err);
+        closesocket(sp[0]);
+        closesocket(sp[1]);
+        return 0;
+    }
 
-	 default:
-         so->s = sp[0];
-         closesocket(sp[1]);
-         qemu_add_child_watch(pid);
-         socket_set_fast_reuse(so->s);
-         opt = 1;
-         qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
-         qemu_set_nonblock(so->s);
-         return 1;
-	}
+    so->s = sp[0];
+    closesocket(sp[1]);
+    socket_set_fast_reuse(so->s);
+    opt = 1;
+    qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+    qemu_set_nonblock(so->s);
+    return 1;
 }
 #endif
 
-- 
2.19.1.708.g4ede3d42df

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation Marc-André Lureau
@ 2018-11-10 13:53   ` Samuel Thibault
  2018-11-10 14:04     ` Peter Maydell
  0 siblings, 1 reply; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 13:53 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:45 +0400, a ecrit:
> @@ -163,23 +183,14 @@ fork_exec(struct socket *so, const char *ex)
>  		exit(1);
>  
>  	 default:
> -		qemu_add_child_watch(pid);
> -                /*
> -                 * XXX this could block us...
> -                 * XXX Should set a timer here, and if accept() doesn't
> -                 * return after X seconds, declare it a failure
> -                 * The only reason this will block forever is if socket()
> -                 * of connect() fail in the child process
> -                 */

At least this got fixed by Peter lately, so please rebase.

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 13/13] slirp: simplify fork_exec()
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 13/13] slirp: simplify fork_exec() Marc-André Lureau
@ 2018-11-10 13:54   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 13:54 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:48 +0400, a ecrit:
> Use g_spawn_async_with_fds() to setup the child.
> 
> GSpawn handles reaping the child, and closing parent file descriptors.

Similarly :)

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation
  2018-11-10 13:53   ` Samuel Thibault
@ 2018-11-10 14:04     ` Peter Maydell
  2018-11-10 14:07       ` Samuel Thibault
  0 siblings, 1 reply; 32+ messages in thread
From: Peter Maydell @ 2018-11-10 14:04 UTC (permalink / raw)
  To: Samuel Thibault
  Cc: Marc-André Lureau, Jan Kiszka, Jason Wang, QEMU Developers

On 10 November 2018 at 13:53, Samuel Thibault <samuel.thibault@gnu.org> wrote:
> Marc-André Lureau, le sam. 10 nov. 2018 17:45:45 +0400, a ecrit:
>> @@ -163,23 +183,14 @@ fork_exec(struct socket *so, const char *ex)
>>               exit(1);
>>
>>        default:
>> -             qemu_add_child_watch(pid);
>> -                /*
>> -                 * XXX this could block us...
>> -                 * XXX Should set a timer here, and if accept() doesn't
>> -                 * return after X seconds, declare it a failure
>> -                 * The only reason this will block forever is if socket()
>> -                 * of connect() fail in the child process
>> -                 */
>
> At least this got fixed by Peter lately, so please rebase.

My patches aren't in master yet, though -- do you have a
public slirp tree that slirp patches should be based on?
(I'm assuming you're planning a pull request too.)

thanks
-- PMM

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation
  2018-11-10 14:04     ` Peter Maydell
@ 2018-11-10 14:07       ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:07 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Marc-André Lureau, Jan Kiszka, Jason Wang, QEMU Developers

Peter Maydell, le sam. 10 nov. 2018 14:04:10 +0000, a ecrit:
> On 10 November 2018 at 13:53, Samuel Thibault <samuel.thibault@gnu.org> wrote:
> > Marc-André Lureau, le sam. 10 nov. 2018 17:45:45 +0400, a ecrit:
> >> @@ -163,23 +183,14 @@ fork_exec(struct socket *so, const char *ex)
> >>               exit(1);
> >>
> >>        default:
> >> -             qemu_add_child_watch(pid);
> >> -                /*
> >> -                 * XXX this could block us...
> >> -                 * XXX Should set a timer here, and if accept() doesn't
> >> -                 * return after X seconds, declare it a failure
> >> -                 * The only reason this will block forever is if socket()
> >> -                 * of connect() fail in the child process
> >> -                 */
> >
> > At least this got fixed by Peter lately, so please rebase.
> 
> My patches aren't in master yet, though -- do you have a
> public slirp tree that slirp patches should be based on?
> (I'm assuming you're planning a pull request too.)

Ah, right.
My tree is documented in MAINTAINERS :)
git https://people.debian.org/~sthibault/qemu.git slirp

Let me push that to master indeed.

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context Marc-André Lureau
@ 2018-11-10 14:11   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:11 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:36 +0400, a ecrit:
> Let's make the slirp interface a bit more library-like.
> Associate the slirp_output() with a Slirp context.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 02/13] slirp: remove do_pty from fork_exec()
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 02/13] slirp: remove do_pty from fork_exec() Marc-André Lureau
@ 2018-11-10 14:21   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:21 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:37 +0400, a ecrit:
> QEMU uses fork_exec() with do_pty values 0 or 3.
> Let's clean up some unused code.

Applied to my tree, thanks!

> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  slirp/misc.h     |  2 +-
>  slirp/misc.c     | 55 ++++++++++++++----------------------------------
>  slirp/tcp_subr.c |  2 +-
>  3 files changed, 18 insertions(+), 41 deletions(-)
> 
> diff --git a/slirp/misc.h b/slirp/misc.h
> index 5211bbd30a..897650aea1 100644
> --- a/slirp/misc.h
> +++ b/slirp/misc.h
> @@ -53,6 +53,6 @@ struct slirp_quehead {
>  void slirp_insque(void *, void *);
>  void slirp_remque(void *);
>  int add_exec(struct ex_list **, int, char *, struct in_addr, int);
> -int fork_exec(struct socket *so, const char *ex, int do_pty);
> +int fork_exec(struct socket *so, const char *ex);
>  
>  #endif
> diff --git a/slirp/misc.c b/slirp/misc.c
> index 260187b6b6..ec5d5ec073 100644
> --- a/slirp/misc.c
> +++ b/slirp/misc.c
> @@ -63,7 +63,7 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
>  #ifdef _WIN32
>  
>  int
> -fork_exec(struct socket *so, const char *ex, int do_pty)
> +fork_exec(struct socket *so, const char *ex)
>  {
>      /* not implemented */
>      return 0;
> @@ -77,13 +77,9 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
>   * process, which connects to this socket, after which we
>   * exec the wanted program.  If something (strange) happens,
>   * the accept() call could block us forever.
> - *
> - * do_pty = 0   Fork/exec inetd style
> - * do_pty = 1   Fork/exec using slirp.telnetd
> - * do_ptr = 2   Fork/exec using pty
>   */
>  int
> -fork_exec(struct socket *so, const char *ex, int do_pty)
> +fork_exec(struct socket *so, const char *ex)
>  {
>  	int s;
>  	struct sockaddr_in addr;
> @@ -99,26 +95,20 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
>  	DEBUG_CALL("fork_exec");
>  	DEBUG_ARG("so = %p", so);
>  	DEBUG_ARG("ex = %p", ex);
> -	DEBUG_ARG("do_pty = %x", do_pty);
> -
> -	if (do_pty == 2) {
> -                return 0;
> -	} else {
> -		addr.sin_family = AF_INET;
> -		addr.sin_port = 0;
> -		addr.sin_addr.s_addr = INADDR_ANY;
>  
> -		if ((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
> -		    bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
> -		    listen(s, 1) < 0) {
> -			error_report("Error: inet socket: %s", strerror(errno));
> -			if (s >= 0) {
> -			    closesocket(s);
> -			}
> +    addr.sin_family = AF_INET;
> +    addr.sin_port = 0;
> +    addr.sin_addr.s_addr = INADDR_ANY;
>  
> -			return 0;
> -		}
> -	}
> +    s = qemu_socket(AF_INET, SOCK_STREAM, 0);
> +    if (s < 0 || bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
> +        listen(s, 1) < 0) {
> +        error_report("Error: inet socket: %s", strerror(errno));
> +        if (s >= 0) {
> +            closesocket(s);
> +        }
> +        return 0;
> +    }
>  
>  	pid = fork();
>  	switch(pid) {
> @@ -151,13 +141,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
>  
>  		i = 0;
>  		bptr = g_strdup(ex); /* No need to free() this */
> -		if (do_pty == 1) {
> -			/* Setup "slirp.telnetd -x" */
> -			argv[i++] = "slirp.telnetd";
> -			argv[i++] = "-x";
> -			argv[i++] = bptr;
> -		} else
> -		   do {
> +        do {
>  			/* Change the string into argv[] */
>  			curarg = bptr;
>  			while (*bptr != ' ' && *bptr != (char)0)
> @@ -165,7 +149,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
>  			c = *bptr;
>  			*bptr++ = (char)0;
>  			argv[i++] = g_strdup(curarg);
> -		   } while (c);
> +        } while (c);
>  
>                  argv[i] = NULL;
>  		execvp(argv[0], (char **)argv);
> @@ -193,13 +177,6 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
>                  opt = 1;
>                  qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
>  		qemu_set_nonblock(so->s);
> -
> -		/* Append the telnet options now */
> -                if (so->so_m != NULL && do_pty == 1)  {
> -			sbappend(so, so->so_m);
> -                        so->so_m = NULL;
> -		}
> -
>  		return 1;
>  	}
>  }
> diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
> index 8d0f94b75f..a82efe78d7 100644
> --- a/slirp/tcp_subr.c
> +++ b/slirp/tcp_subr.c
> @@ -973,7 +973,7 @@ int tcp_ctl(struct socket *so)
>                  }
>                  do_pty = ex_ptr->ex_pty;
>                  DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
> -                return fork_exec(so, ex_ptr->ex_exec, do_pty);
> +                return fork_exec(so, ex_ptr->ex_exec);
>              }
>          }
>      }
> -- 
> 2.19.1.708.g4ede3d42df
> 

-- 
Samuel
gawk; talk; nice; date; wine; grep; touch; unzip; strip;  \
touch; gasp; finger; gasp; lyx; gasp; latex; mount; fsck; \
more; yes; gasp; umount; make clean; make mrproper; sleep

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 03/13] slirp: replace ex_pty with ex_chardev
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 03/13] slirp: replace ex_pty with ex_chardev Marc-André Lureau
@ 2018-11-10 14:26   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:26 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:38 +0400, a ecrit:
> do_pty == 3 means to talk to a chardev.

Applied to my tree, thanks!

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer Marc-André Lureau
@ 2018-11-10 14:28   ` Samuel Thibault
  2018-11-15 13:13   ` Paolo Bonzini
  1 sibling, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:28 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:39 +0400, a ecrit:
> Let's not mix command line and chardev pointers.

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH Marc-André Lureau
@ 2018-11-10 14:30   ` Samuel Thibault
  2018-11-15 13:15   ` Paolo Bonzini
  1 sibling, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:30 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:40 +0400, a ecrit:
> EMU_RSH handling was dropped in commit
> 0d62c4cfe21752df4c1d6e2c2398f15d5eaa794a.
> 
> The assignment, and subsequent free() of ex_ptr->ex_exec to so->extra
> looks unsafe (double free is likely to occur).

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 06/13] slirp: rename /extra/chardev
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 06/13] slirp: rename /extra/chardev Marc-André Lureau
@ 2018-11-10 14:30   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:30 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:41 +0400, a ecrit:
> Now it's only used for the chardev pointer.

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 07/13] slirp: move internal function declarations
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 07/13] slirp: move internal function declarations Marc-André Lureau
@ 2018-11-10 14:31   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:31 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:42 +0400, a ecrit:
> Clarify that those functions are internal to slirp.

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 08/13] slirp: remove Monitor dependency, return a string for info
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 08/13] slirp: remove Monitor dependency, return a string for info Marc-André Lureau
@ 2018-11-10 14:35   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:35 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:43 +0400, a ecrit:
> There is nothing performance-sensitive in returning an allocated
> string for info, and handling the monitor_printf() on the caller side.

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 09/13] slirp: fix slirp_add_exec() leaks
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 09/13] slirp: fix slirp_add_exec() leaks Marc-André Lureau
@ 2018-11-10 14:37   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:37 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:44 +0400, a ecrit:
> Free the list elements allocated in add_exec().

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 11/13] slirp: replace the poor-man string split with g_strsplit()
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 11/13] slirp: replace the poor-man string split with g_strsplit() Marc-André Lureau
@ 2018-11-10 14:42   ` Samuel Thibault
  0 siblings, 0 replies; 32+ messages in thread
From: Samuel Thibault @ 2018-11-10 14:42 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Jan Kiszka, Jason Wang

Marc-André Lureau, le sam. 10 nov. 2018 17:45:46 +0400, a ecrit:
> Use the glib function for the work, fix a potential crash on >256 words.

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (12 preceding siblings ...)
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 13/13] slirp: simplify fork_exec() Marc-André Lureau
@ 2018-11-10 20:19 ` no-reply
  2018-11-10 20:48 ` no-reply
  14 siblings, 0 replies; 32+ messages in thread
From: no-reply @ 2018-11-10 20:19 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: famz, qemu-devel, jan.kiszka, jasowang, samuel.thibault

Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Message-id: 20181110134548.14741-1-marcandre.lureau@redhat.com
Subject: [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups

=== TEST SCRIPT BEGIN ===
#!/bin/bash

BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0

git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram

commits="$(git log --format=%H --reverse $BASE..)"
for c in $commits; do
    echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
    if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
        failed=1
        echo
    fi
    n=$((n+1))
done

exit $failed
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
6e72a3d7d6 slirp: simplify fork_exec()
e4480abd5c glib-compat: add g_spawn_async_with_fds() fallback
05ec44d7a6 slirp: replace the poor-man string split with g_strsplit()
8b1f6fbfd4 slirp: improve subprocess socket creation
12e0630348 slirp: fix slirp_add_exec() leaks
402402c195 slirp: remove Monitor dependency, return a string for info
f16529aaa3 slirp: move internal function declarations
49749759e0 slirp: rename /extra/chardev
d4b52f3f73 slirp: remove unused EMU_RSH
738c429d7e slirp: use a dedicated field for chardev pointer
9cb6724b98 slirp: replace ex_pty with ex_chardev
ec0916fd51 slirp: remove do_pty from fork_exec()
588e3ea467 slirp: associate slirp_output callback with the Slirp context

=== OUTPUT BEGIN ===
Checking PATCH 1/13: slirp: associate slirp_output callback with the Slirp context...
Checking PATCH 2/13: slirp: remove do_pty from fork_exec()...
Checking PATCH 3/13: slirp: replace ex_pty with ex_chardev...
ERROR: code indent should never use tabs
#23: FILE: slirp/misc.c:56:
+^I(*ex_ptr)->ex_chardev = do_pty == 3;$

ERROR: code indent should never use tabs
#36: FILE: slirp/misc.h:12:
+^Iint ex_chardev;$

total: 2 errors, 0 warnings, 52 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 4/13: slirp: use a dedicated field for chardev pointer...
ERROR: code indent should never use tabs
#78: FILE: slirp/misc.c:53:
+^I*ex_ptr = g_new0(struct ex_list, 1);$

ERROR: code indent should never use tabs
#83: FILE: slirp/misc.c:56:
+^Iif (chardev) {$

ERROR: code indent should never use tabs
#84: FILE: slirp/misc.c:57:
+^I^I(*ex_ptr)->ex_chardev = chardev;$

ERROR: code indent should never use tabs
#85: FILE: slirp/misc.c:58:
+^I} else {$

ERROR: code indent should never use tabs
#86: FILE: slirp/misc.c:59:
+^I^I(*ex_ptr)->ex_exec = g_strdup(cmdline);$

ERROR: code indent should never use tabs
#87: FILE: slirp/misc.c:60:
+^I}$

ERROR: code indent should never use tabs
#100: FILE: slirp/misc.h:12:
+^Ivoid *ex_chardev;$

total: 7 errors, 0 warnings, 100 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 5/13: slirp: remove unused EMU_RSH...
Checking PATCH 6/13: slirp: rename /extra/chardev...
ERROR: "foo * bar" should be "foo *bar"
#40: FILE: slirp/socket.h:70:
+  void * chardev;

total: 1 errors, 0 warnings, 28 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 7/13: slirp: move internal function declarations...
Checking PATCH 8/13: slirp: remove Monitor dependency, return a string for info...
Checking PATCH 9/13: slirp: fix slirp_add_exec() leaks...
ERROR: code indent should never use tabs
#23: FILE: slirp/misc.h:15:
+^Ichar *ex_exec;                  /* Command line of what to exec */$

total: 1 errors, 0 warnings, 22 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 10/13: slirp: improve subprocess socket creation...
ERROR: code indent should never use tabs
#98: FILE: slirp/misc.c:137:
+^Iint opt, c, i, sp[2];$

ERROR: code indent should never use tabs
#125: FILE: slirp/misc.c:152:
+^I^Iclosesocket(sp[0]);$

ERROR: code indent should never use tabs
#126: FILE: slirp/misc.c:153:
+^I^Iclosesocket(sp[1]);$

ERROR: code indent should never use tabs
#151: FILE: slirp/misc.c:158:
+^I^Idup2(sp[1], 0);$

ERROR: code indent should never use tabs
#152: FILE: slirp/misc.c:159:
+^I^Idup2(sp[1], 1);$

ERROR: code indent should never use tabs
#153: FILE: slirp/misc.c:160:
+^I^Idup2(sp[1], 2);$

ERROR: code indent should never use tabs
#154: FILE: slirp/misc.c:161:
+^I^Ifor (c = getdtablesize() - 1; c >= 3; c--)$

ERROR: suspect code indent for conditional statements (16, 19)
#154: FILE: slirp/misc.c:161:
+		for (c = getdtablesize() - 1; c >= 3; c--)
+		   close(c);

ERROR: braces {} are necessary for all arms of this statement
#154: FILE: slirp/misc.c:161:
+		for (c = getdtablesize() - 1; c >= 3; c--)
[...]

ERROR: code indent should never use tabs
#155: FILE: slirp/misc.c:162:
+^I^I   close(c);$

total: 10 errors, 0 warnings, 167 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 11/13: slirp: replace the poor-man string split with g_strsplit()...
ERROR: code indent should never use tabs
#27: FILE: slirp/misc.c:133:
+^Ichar **argv;$

ERROR: code indent should never use tabs
#28: FILE: slirp/misc.c:134:
+^Iint opt, c, sp[2];$

total: 2 errors, 0 warnings, 33 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 12/13: glib-compat: add g_spawn_async_with_fds() fallback...
Checking PATCH 13/13: slirp: simplify fork_exec()...
=== OUTPUT END ===

Test command exited with code: 1


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups
  2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
                   ` (13 preceding siblings ...)
  2018-11-10 20:19 ` [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups no-reply
@ 2018-11-10 20:48 ` no-reply
  14 siblings, 0 replies; 32+ messages in thread
From: no-reply @ 2018-11-10 20:48 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: famz, qemu-devel, jan.kiszka, jasowang, samuel.thibault

Hi,

This series failed docker-mingw@fedora build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

Type: series
Message-id: 20181110134548.14741-1-marcandre.lureau@redhat.com
Subject: [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups

=== TEST SCRIPT BEGIN ===
#!/bin/bash
time make docker-test-mingw@fedora SHOW_ENV=1 J=8
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
6e72a3d7d6 slirp: simplify fork_exec()
e4480abd5c glib-compat: add g_spawn_async_with_fds() fallback
05ec44d7a6 slirp: replace the poor-man string split with g_strsplit()
8b1f6fbfd4 slirp: improve subprocess socket creation
12e0630348 slirp: fix slirp_add_exec() leaks
402402c195 slirp: remove Monitor dependency, return a string for info
f16529aaa3 slirp: move internal function declarations
49749759e0 slirp: rename /extra/chardev
d4b52f3f73 slirp: remove unused EMU_RSH
738c429d7e slirp: use a dedicated field for chardev pointer
9cb6724b98 slirp: replace ex_pty with ex_chardev
ec0916fd51 slirp: remove do_pty from fork_exec()
588e3ea467 slirp: associate slirp_output callback with the Slirp context

=== OUTPUT BEGIN ===
  BUILD   fedora
make[1]: Entering directory '/var/tmp/patchew-tester-tmp-fmasdvwt/src'
  GEN     /var/tmp/patchew-tester-tmp-fmasdvwt/src/docker-src.2018-11-10-15.45.22.4956/qemu.tar
Cloning into '/var/tmp/patchew-tester-tmp-fmasdvwt/src/docker-src.2018-11-10-15.45.22.4956/qemu.tar.vroot'...
done.
Your branch is up-to-date with 'origin/test'.
Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc'
Cloning into '/var/tmp/patchew-tester-tmp-fmasdvwt/src/docker-src.2018-11-10-15.45.22.4956/qemu.tar.vroot/dtc'...
Submodule path 'dtc': checked out '88f18909db731a627456f26d779445f84e449536'
Submodule 'ui/keycodemapdb' (git://git.qemu.org/keycodemapdb.git) registered for path 'ui/keycodemapdb'
Cloning into '/var/tmp/patchew-tester-tmp-fmasdvwt/src/docker-src.2018-11-10-15.45.22.4956/qemu.tar.vroot/ui/keycodemapdb'...
Submodule path 'ui/keycodemapdb': checked out '6b3d716e2b6472eb7189d3220552280ef3d832ce'
  COPY    RUNNER
    RUN test-mingw in qemu:fedora 
Packages installed:
SDL2-devel-2.0.8-5.fc28.x86_64
bc-1.07.1-5.fc28.x86_64
bison-3.0.4-9.fc28.x86_64
bluez-libs-devel-5.50-1.fc28.x86_64
brlapi-devel-0.6.7-19.fc28.x86_64
bzip2-1.0.6-26.fc28.x86_64
bzip2-devel-1.0.6-26.fc28.x86_64
ccache-3.4.2-2.fc28.x86_64
clang-6.0.1-1.fc28.x86_64
device-mapper-multipath-devel-0.7.4-3.git07e7bd5.fc28.x86_64
findutils-4.6.0-19.fc28.x86_64
flex-2.6.1-7.fc28.x86_64
gcc-8.1.1-5.fc28.x86_64
gcc-c++-8.1.1-5.fc28.x86_64
gettext-0.19.8.1-14.fc28.x86_64
git-2.17.1-3.fc28.x86_64
glib2-devel-2.56.1-4.fc28.x86_64
glusterfs-api-devel-4.1.2-2.fc28.x86_64
gnutls-devel-3.6.3-3.fc28.x86_64
gtk3-devel-3.22.30-1.fc28.x86_64
hostname-3.20-3.fc28.x86_64
libaio-devel-0.3.110-11.fc28.x86_64
libasan-8.1.1-5.fc28.x86_64
libattr-devel-2.4.48-3.fc28.x86_64
libcap-devel-2.25-9.fc28.x86_64
libcap-ng-devel-0.7.9-4.fc28.x86_64
libcurl-devel-7.59.0-6.fc28.x86_64
libfdt-devel-1.4.6-5.fc28.x86_64
libpng-devel-1.6.34-6.fc28.x86_64
librbd-devel-12.2.7-1.fc28.x86_64
libssh2-devel-1.8.0-7.fc28.x86_64
libubsan-8.1.1-5.fc28.x86_64
libusbx-devel-1.0.22-1.fc28.x86_64
libxml2-devel-2.9.8-4.fc28.x86_64
llvm-6.0.1-6.fc28.x86_64
lzo-devel-2.08-12.fc28.x86_64
make-4.2.1-6.fc28.x86_64
mingw32-SDL2-2.0.5-3.fc27.noarch
mingw32-bzip2-1.0.6-9.fc27.noarch
mingw32-curl-7.57.0-1.fc28.noarch
mingw32-glib2-2.56.1-1.fc28.noarch
mingw32-gmp-6.1.2-2.fc27.noarch
mingw32-gnutls-3.6.2-1.fc28.noarch
mingw32-gtk3-3.22.30-1.fc28.noarch
mingw32-libjpeg-turbo-1.5.1-3.fc27.noarch
mingw32-libpng-1.6.29-2.fc27.noarch
mingw32-libssh2-1.8.0-3.fc27.noarch
mingw32-libtasn1-4.13-1.fc28.noarch
mingw32-nettle-3.4-1.fc28.noarch
mingw32-pixman-0.34.0-3.fc27.noarch
mingw32-pkg-config-0.28-9.fc27.x86_64
mingw64-SDL2-2.0.5-3.fc27.noarch
mingw64-bzip2-1.0.6-9.fc27.noarch
mingw64-curl-7.57.0-1.fc28.noarch
mingw64-glib2-2.56.1-1.fc28.noarch
mingw64-gmp-6.1.2-2.fc27.noarch
mingw64-gnutls-3.6.2-1.fc28.noarch
mingw64-gtk3-3.22.30-1.fc28.noarch
mingw64-libjpeg-turbo-1.5.1-3.fc27.noarch
mingw64-libpng-1.6.29-2.fc27.noarch
mingw64-libssh2-1.8.0-3.fc27.noarch
mingw64-libtasn1-4.13-1.fc28.noarch
mingw64-nettle-3.4-1.fc28.noarch
mingw64-pixman-0.34.0-3.fc27.noarch
mingw64-pkg-config-0.28-9.fc27.x86_64
ncurses-devel-6.1-5.20180224.fc28.x86_64
nettle-devel-3.4-2.fc28.x86_64
nss-devel-3.38.0-1.0.fc28.x86_64
numactl-devel-2.0.11-8.fc28.x86_64
package PyYAML is not installed
package libjpeg-devel is not installed
perl-5.26.2-413.fc28.x86_64
pixman-devel-0.34.0-8.fc28.x86_64
python3-3.6.5-1.fc28.x86_64
snappy-devel-1.1.7-5.fc28.x86_64
sparse-0.5.2-1.fc28.x86_64
spice-server-devel-0.14.0-4.fc28.x86_64
systemtap-sdt-devel-3.3-1.fc28.x86_64
tar-1.30-3.fc28.x86_64
usbredir-devel-0.8.0-1.fc28.x86_64
virglrenderer-devel-0.6.0-4.20170210git76b3da97b.fc28.x86_64
vte3-devel-0.36.5-6.fc28.x86_64
which-2.21-8.fc28.x86_64
xen-devel-4.10.1-5.fc28.x86_64
zlib-devel-1.2.11-8.fc28.x86_64

Environment variables:
TARGET_LIST=
PACKAGES=bc     bison     bluez-libs-devel     brlapi-devel     bzip2     bzip2-devel     ccache     clang     device-mapper-multipath-devel     findutils     flex     gcc     gcc-c++     gettext     git     glib2-devel     glusterfs-api-devel     gnutls-devel     gtk3-devel     hostname     libaio-devel     libasan     libattr-devel     libcap-devel     libcap-ng-devel     libcurl-devel     libfdt-devel     libjpeg-devel     libpng-devel     librbd-devel     libssh2-devel     libubsan     libusbx-devel     libxml2-devel     llvm     lzo-devel     make     mingw32-bzip2     mingw32-curl     mingw32-glib2     mingw32-gmp     mingw32-gnutls     mingw32-gtk3     mingw32-libjpeg-turbo     mingw32-libpng     mingw32-libssh2     mingw32-libtasn1     mingw32-nettle     mingw32-pixman     mingw32-pkg-config     mingw32-SDL2     mingw64-bzip2     mingw64-curl     mingw64-glib2     mingw64-gmp     mingw64-gnutls     mingw64-gtk3     mingw64-libjpeg-turbo     mingw64-libpng     mingw64-libssh2     mingw64-libtasn1     mingw64-nettle     mingw64-pixman     mingw64-pkg-config     mingw64-SDL2     ncurses-devel     nettle-devel     nss-devel     numactl-devel     perl     pixman-devel     python3     PyYAML     SDL2-devel     snappy-devel     sparse     spice-server-devel     systemtap-sdt-devel     tar     usbredir-devel     virglrenderer-devel     vte3-devel     which     xen-devel     zlib-devel
J=8
V=
HOSTNAME=a2e59f115268
DEBUG=
SHOW_ENV=1
PWD=/
HOME=/home/patchew
CCACHE_DIR=/var/tmp/ccache
DISTTAG=f28container
QEMU_CONFIGURE_OPTS=--python=/usr/bin/python3
FGC=f28
TEST_DIR=/tmp/qemu-test
SHLVL=1
FEATURES=mingw clang pyyaml asan dtc
PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAKEFLAGS= -j8
EXTRA_CONFIGURE_OPTS=
_=/usr/bin/env

Configure options:
--enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/tmp/qemu-test/install --python=/usr/bin/python3 --cross-prefix=x86_64-w64-mingw32- --enable-trace-backends=simple --enable-gnutls --enable-nettle --enable-curl --enable-vnc --enable-bzip2 --enable-guest-agent --with-sdlabi=2.0
Install prefix    /tmp/qemu-test/install
BIOS directory    /tmp/qemu-test/install
firmware path     /tmp/qemu-test/install/share/qemu-firmware
binary directory  /tmp/qemu-test/install
library directory /tmp/qemu-test/install/lib
module directory  /tmp/qemu-test/install/lib
libexec directory /tmp/qemu-test/install/libexec
include directory /tmp/qemu-test/install/include
config directory  /tmp/qemu-test/install
local state directory   queried at runtime
Windows SDK       no
Source path       /tmp/qemu-test/src
GIT binary        git
GIT submodules    
C compiler        x86_64-w64-mingw32-gcc
Host C compiler   cc
C++ compiler      x86_64-w64-mingw32-g++
Objective-C compiler clang
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/pixman-1  -I$(SRC_PATH)/dtc/libfdt -Werror -DHAS_LIBSSH2_SFTP_FSYNC -I/usr/x86_64-w64-mingw32/sys-root/mingw/include  -mms-bitfields -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/x86_64-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include  -m64 -mcx16 -mthreads -D__USE_MINGW_ANSI_STDIO=1 -DWIN32_LEAN_AND_MEAN -DWINVER=0x501 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wexpansion-to-defined -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/x86_64-w64-mingw32/sys-root/mingw/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/p11-kit-1  -I/usr/x86_64-w64-mingw32/sys-root/mingw/include   -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/libpng16 
LDFLAGS           -Wl,--nxcompat -Wl,--no-seh -Wl,--dynamicbase -Wl,--warn-common -m64 -g 
QEMU_LDFLAGS      -L$(BUILD_DIR)/dtc/libfdt 
make              make
install           install
python            /usr/bin/python3 -B
smbd              /usr/sbin/smbd
module support    no
host CPU          x86_64
host big endian   no
target list       x86_64-softmmu aarch64-softmmu
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
SDL support       yes (2.0.5)
GTK support       yes (3.22.30)
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    yes
libgcrypt         no
nettle            yes (3.4)
libtasn1          yes
curses support    no
virgl support     no 
curl support      yes
mingw32 support   yes
Audio drivers     dsound
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    no
Multipath support no
VNC support       yes
VNC SASL support  no
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               no
vde support       no
netmap support    no
Linux AIO support no
ATTR/XATTR support no
Install blobs     yes
KVM support       no
HAX support       yes
HVF support       no
WHPX support      no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
malloc trim support no
RDMA support      no
PVRDMA support    no
fdt support       git
membarrier        no
preadv support    no
fdatasync         no
madvise           no
posix_madvise     no
posix_memalign    no
libcap-ng support no
vhost-net support no
vhost-crypto support no
vhost-scsi support no
vhost-vsock support no
vhost-user support no
Trace backends    simple
Trace output file trace-<pid>
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            no
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info yes
QGA MSI support   no
seccomp support   no
coroutine backend win32
coroutine pool    yes
debug stack usage no
mutex debugging   no
crypto afalg      no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   no
TPM emulator      no
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     yes
NUMA host support no
libxml2           no
tcmalloc support  no
jemalloc support  no
avx2 optimization yes
replication support yes
VxHS block device no
capstone          no
docker            no
libpmem support   no
libudev           no

NOTE: cross-compilers enabled:  'x86_64-w64-mingw32-gcc'
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     config-host.h
  GEN     qapi-gen
  GEN     qemu-options.def
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers.c
  GEN     module_block.h
  GEN     aarch64-softmmu/config-devices.mak
  GEN     ui/input-keymap-atset1-to-qcode.c
  GEN     ui/input-keymap-linux-to-qcode.c
  GEN     x86_64-softmmu/config-devices.mak
  GEN     ui/input-keymap-qcode-to-atset1.c
  GEN     ui/input-keymap-qcode-to-atset2.c
  GEN     ui/input-keymap-qcode-to-linux.c
  GEN     ui/input-keymap-qcode-to-atset3.c
  GEN     ui/input-keymap-qcode-to-qnum.c
  GEN     ui/input-keymap-qcode-to-sun.c
  GEN     ui/input-keymap-qnum-to-qcode.c
  GEN     ui/input-keymap-usb-to-qcode.c
  GEN     ui/input-keymap-win32-to-qcode.c
  GEN     ui/input-keymap-x11-to-qcode.c
  GEN     ui/input-keymap-xorgkbd-to-qcode.c
  GEN     ui/input-keymap-xorgevdev-to-qcode.c
  GEN     ui/input-keymap-xorgxquartz-to-qcode.c
  GEN     ui/input-keymap-xorgxwin-to-qcode.c
  GEN     ui/input-keymap-osx-to-qcode.c
  GEN     tests/test-qapi-gen
  GEN     trace-root.h
  GEN     accel/kvm/trace.h
  GEN     accel/tcg/trace.h
  GEN     audio/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     crypto/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/display/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/hppa/trace.h
  GEN     hw/i2c/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/ide/trace.h
  GEN     hw/input/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/misc/macio/trace.h
  GEN     hw/net/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/pci-host/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/rdma/trace.h
  GEN     hw/rdma/vmw/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sparc64/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/tpm/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/watchdog/trace.h
  GEN     hw/xen/trace.h
  GEN     io/trace.h
  GEN     linux-user/trace.h
  GEN     migration/trace.h
  GEN     nbd/trace.h
  GEN     net/trace.h
  GEN     qapi/trace.h
  GEN     qom/trace.h
  GEN     scsi/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/ppc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/sparc/trace.h
  GEN     ui/trace.h
  GEN     util/trace.h
  GEN     trace-root.c
  GEN     accel/kvm/trace.c
  GEN     accel/tcg/trace.c
  GEN     audio/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     crypto/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/display/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/hppa/trace.c
  GEN     hw/i2c/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/ide/trace.c
  GEN     hw/input/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/misc/macio/trace.c
  GEN     hw/net/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/pci-host/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/rdma/trace.c
  GEN     hw/rdma/vmw/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sparc64/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/tpm/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/watchdog/trace.c
  GEN     hw/xen/trace.c
  GEN     io/trace.c
  GEN     linux-user/trace.c
  GEN     migration/trace.c
  GEN     nbd/trace.c
  GEN     net/trace.c
  GEN     qapi/trace.c
  GEN     qom/trace.c
  GEN     scsi/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/ppc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/sparc/trace.c
  GEN     ui/trace.c
  GEN     util/trace.c
  GEN     config-all-devices.mak
	 DEP /tmp/qemu-test/src/dtc/tests/dumptrees.c
	 DEP /tmp/qemu-test/src/dtc/tests/trees.S
	 DEP /tmp/qemu-test/src/dtc/tests/testutils.c
	 DEP /tmp/qemu-test/src/dtc/tests/value-labels.c
	 DEP /tmp/qemu-test/src/dtc/tests/asm_tree_dump.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_memrsv.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_string.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_full.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_header.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay_bad_fixup.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/property_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/integer-expressions.c
	 DEP /tmp/qemu-test/src/dtc/tests/utilfdt_test.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset_aliases.c
	 DEP /tmp/qemu-test/src/dtc/tests/add_subnode_with_nops.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_unordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtb_reverse.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_ordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/extra-terminating-null.c
	 DEP /tmp/qemu-test/src/dtc/tests/incbin.c
	 DEP /tmp/qemu-test/src/dtc/tests/boot-cpuid.c
	 DEP /tmp/qemu-test/src/dtc/tests/phandle_format.c
	 DEP /tmp/qemu-test/src/dtc/tests/references.c
	 DEP /tmp/qemu-test/src/dtc/tests/path-references.c
	 DEP /tmp/qemu-test/src/dtc/tests/string_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/propname_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop2.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop1.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/set_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/rw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/open_pack.c
	 DEP /tmp/qemu-test/src/dtc/tests/nopulate.c
	 DEP /tmp/qemu-test/src/dtc/tests/mangle-layout.c
	 DEP /tmp/qemu-test/src/dtc/tests/move_and_save.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_states.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop_inplace.c
	 DEP /tmp/qemu-test/src/dtc/tests/stringlist.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells2.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/notfound.c
	 DEP /tmp/qemu-test/src/dtc/tests/sized_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/char_literal.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_alias.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_check_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_prop_value.c
	 DEP /tmp/qemu-test/src/dtc/tests/parent_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/supernode_atdepth_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/getprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/find_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/root_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_mem_rsv.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_overlay.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_addresses.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_empty_tree.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_strerror.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_rw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_sw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_wip.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_ro.c
	 DEP /tmp/qemu-test/src/dtc/util.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt.c
	 DEP /tmp/qemu-test/src/dtc/fdtoverlay.c
	 DEP /tmp/qemu-test/src/dtc/fdtput.c
	 DEP /tmp/qemu-test/src/dtc/fdtget.c
	 DEP /tmp/qemu-test/src/dtc/fdtdump.c
	 LEX convert-dtsv0-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/srcpos.c
	 DEP /tmp/qemu-test/src/dtc/treesource.c
	 BISON dtc-parser.tab.c
	 LEX dtc-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/livetree.c
	 DEP /tmp/qemu-test/src/dtc/fstree.c
	 DEP /tmp/qemu-test/src/dtc/flattree.c
	 DEP /tmp/qemu-test/src/dtc/dtc.c
	 DEP /tmp/qemu-test/src/dtc/data.c
	 DEP /tmp/qemu-test/src/dtc/checks.c
	 DEP convert-dtsv0-lexer.lex.c
	 DEP dtc-lexer.lex.c
	 DEP dtc-parser.tab.c
	CHK version_gen.h
	UPD version_gen.h
	 DEP /tmp/qemu-test/src/dtc/util.c
	 CC libfdt/fdt.o
	 CC libfdt/fdt_ro.o
	 CC libfdt/fdt_wip.o
	 CC libfdt/fdt_empty_tree.o
	 CC libfdt/fdt_sw.o
	 CC libfdt/fdt_strerror.o
	 CC libfdt/fdt_rw.o
	 CC libfdt/fdt_addresses.o
	 CC libfdt/fdt_overlay.o
	 AR libfdt/libfdt.a
x86_64-w64-mingw32-ar: creating libfdt/libfdt.a
a - libfdt/fdt.o
a - libfdt/fdt_ro.o
a - libfdt/fdt_wip.o
a - libfdt/fdt_sw.o
a - libfdt/fdt_rw.o
a - libfdt/fdt_strerror.o
a - libfdt/fdt_empty_tree.o
a - libfdt/fdt_addresses.o
a - libfdt/fdt_overlay.o
  RC      version.o
  GEN     qga/qapi-generated/qapi-gen
  CC      qapi/qapi-builtin-types.o
  CC      qapi/qapi-types.o
  CC      qapi/qapi-types-block-core.o
  CC      qapi/qapi-types-block.o
  CC      qapi/qapi-types-char.o
  CC      qapi/qapi-types-common.o
  CC      qapi/qapi-types-crypto.o
  CC      qapi/qapi-types-introspect.o
  CC      qapi/qapi-types-job.o
  CC      qapi/qapi-types-migration.o
  CC      qapi/qapi-types-misc.o
  CC      qapi/qapi-types-net.o
  CC      qapi/qapi-types-rocker.o
  CC      qapi/qapi-types-run-state.o
  CC      qapi/qapi-types-sockets.o
  CC      qapi/qapi-types-tpm.o
  CC      qapi/qapi-types-trace.o
  CC      qapi/qapi-types-transaction.o
  CC      qapi/qapi-types-ui.o
  CC      qapi/qapi-builtin-visit.o
  CC      qapi/qapi-visit.o
  CC      qapi/qapi-visit-block-core.o
  CC      qapi/qapi-visit-block.o
  CC      qapi/qapi-visit-char.o
  CC      qapi/qapi-visit-common.o
  CC      qapi/qapi-visit-crypto.o
  CC      qapi/qapi-visit-introspect.o
  CC      qapi/qapi-visit-job.o
  CC      qapi/qapi-visit-migration.o
  CC      qapi/qapi-visit-misc.o
  CC      qapi/qapi-visit-net.o
  CC      qapi/qapi-visit-rocker.o
  CC      qapi/qapi-visit-run-state.o
  CC      qapi/qapi-visit-sockets.o
  CC      qapi/qapi-visit-tpm.o
  CC      qapi/qapi-visit-trace.o
  CC      qapi/qapi-visit-transaction.o
  CC      qapi/qapi-visit-ui.o
  CC      qapi/qapi-events.o
  CC      qapi/qapi-events-block-core.o
  CC      qapi/qapi-events-block.o
  CC      qapi/qapi-events-char.o
  CC      qapi/qapi-events-common.o
  CC      qapi/qapi-events-crypto.o
  CC      qapi/qapi-events-introspect.o
  CC      qapi/qapi-events-job.o
  CC      qapi/qapi-events-migration.o
  CC      qapi/qapi-events-misc.o
  CC      qapi/qapi-events-net.o
  CC      qapi/qapi-events-rocker.o
  CC      qapi/qapi-events-run-state.o
  CC      qapi/qapi-events-sockets.o
  CC      qapi/qapi-events-tpm.o
  CC      qapi/qapi-events-trace.o
  CC      qapi/qapi-events-transaction.o
  CC      qapi/qapi-events-ui.o
  CC      qapi/qapi-introspect.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qlit.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      qobject/block-qdict.o
  CC      trace/simple.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/aio-wait.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-win32.o
  CC      util/event_notifier-win32.o
  CC      util/oslib-win32.o
  CC      util/qemu-thread-win32.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-win32.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/pagesize.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/qsp.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      util/iova-tree.o
  CC      trace-root.o
  CC      accel/kvm/trace.o
  CC      accel/tcg/trace.o
  CC      audio/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      crypto/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/acpi/trace.o
  CC      hw/alpha/trace.o
  CC      hw/arm/trace.o
  CC      hw/audio/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/display/trace.o
  CC      hw/dma/trace.o
  CC      hw/hppa/trace.o
  CC      hw/i2c/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/ide/trace.o
  CC      hw/input/trace.o
  CC      hw/intc/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/misc/trace.o
  CC      hw/misc/macio/trace.o
  CC      hw/net/trace.o
  CC      hw/nvram/trace.o
  CC      hw/pci/trace.o
  CC      hw/pci-host/trace.o
  CC      hw/ppc/trace.o
  CC      hw/rdma/trace.o
  CC      hw/rdma/vmw/trace.o
  CC      hw/s390x/trace.o
  CC      hw/scsi/trace.o
  CC      hw/sd/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sparc64/trace.o
  CC      hw/timer/trace.o
  CC      hw/tpm/trace.o
  CC      hw/usb/trace.o
  CC      hw/vfio/trace.o
  CC      hw/virtio/trace.o
  CC      hw/watchdog/trace.o
  CC      hw/xen/trace.o
  CC      io/trace.o
  CC      linux-user/trace.o
  CC      migration/trace.o
  CC      nbd/trace.o
  CC      net/trace.o
  CC      qapi/trace.o
  CC      qom/trace.o
  CC      scsi/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/ppc/trace.o
  CC      target/s390x/trace.o
  CC      target/sparc/trace.o
  CC      ui/trace.o
  CC      util/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/migr-blocker.o
  CC      stubs/change-state-handler.o
  CC      stubs/monitor.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/set-fd-handler.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/tpm.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/fd-register.o
  CC      stubs/qmp_memory_device.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      stubs/pci-host-piix.o
  CC      stubs/ram-block.o
  CC      stubs/ramfb.o
  GEN     qemu-img-cmds.h
  CC      block.o
  CC      blockjob.o
  CC      job.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/vmdk.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vpc.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/parallels.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/blklogwrites.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-win32.o
  CC      block/win32-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/create.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/throttle.o
  CC      block/copy-on-read.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      scsi/utils.o
  CC      scsi/pr-manager-stub.o
  CC      block/curl.o
  CC      block/ssh.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac.o
  CC      crypto/hmac-nettle.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredspsk.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block.o
  CC      crypto/block-qcow.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-socket.o
  CC      io/channel-file.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/net-listener.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  CC      qemu-io.o
  CC      qemu-edid.o
  CC      hw/display/edid-generate.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      job-qmp.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-win32.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  CC      qapi/qapi-commands.o
  CC      qapi/qapi-commands-block-core.o
  CC      qapi/qapi-commands-block.o
  CC      qapi/qapi-commands-char.o
  CC      qapi/qapi-commands-common.o
  CC      qapi/qapi-commands-crypto.o
  CC      qapi/qapi-commands-introspect.o
  CC      qapi/qapi-commands-job.o
  CC      qapi/qapi-commands-migration.o
  CC      qapi/qapi-commands-misc.o
  CC      qapi/qapi-commands-net.o
  CC      qapi/qapi-commands-rocker.o
  CC      qapi/qapi-commands-run-state.o
  CC      qapi/qapi-commands-sockets.o
  CC      qapi/qapi-commands-tpm.o
  CC      qapi/qapi-commands-trace.o
  CC      qapi/qapi-commands-transaction.o
  CC      qapi/qapi-commands-ui.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/dsoundaudio.o
  CC      audio/audio_win_int.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      backends/cryptodev-vhost.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      disas/arm.o
  CXX     disas/arm-a64.o
  CC      disas/i386.o
  CXX     disas/libvixl/vixl/utils.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
In file included from /tmp/qemu-test/src/include/qemu/osdep.h:122:0,
                 from /tmp/qemu-test/src/disas/arm-a64.cc:21:
/tmp/qemu-test/src/include/glib-compat.h: In function 'void qemu_gspawn_fds_setup(gpointer)':
/tmp/qemu-test/src/include/glib-compat.h:98:24: error: invalid conversion from 'gpointer {aka void*}' to 'QemuGSpawnFds*' [-fpermissive]
     QemuGSpawnFds *q = user_data;
                        ^~~~~~~~~
make: *** [/tmp/qemu-test/src/rules.mak:89: disas/arm-a64.o] Error 1
make: *** Waiting for unfinished jobs....
Traceback (most recent call last):
  File "./tests/docker/docker.py", line 563, in <module>
    sys.exit(main())
  File "./tests/docker/docker.py", line 560, in main
    return args.cmdobj.run(args, argv)
  File "./tests/docker/docker.py", line 306, in run
    return Docker().run(argv, args.keep, quiet=args.quiet)
  File "./tests/docker/docker.py", line 274, in run
    quiet=quiet)
  File "./tests/docker/docker.py", line 181, in _do_check
    return subprocess.check_call(self._command + cmd, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=952906cee52911e8b0e152540069c830', '-u', '1000', '--security-opt', 'seccomp=unconfined', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-fmasdvwt/src/docker-src.2018-11-10-15.45.22.4956:/var/tmp/qemu:z,ro', 'qemu:fedora', '/var/tmp/qemu/run', 'test-mingw']' returned non-zero exit status 2
make[1]: *** [tests/docker/Makefile.include:217: docker-run] Error 1
make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-fmasdvwt/src'
make: *** [tests/docker/Makefile.include:251: docker-run-test-mingw@fedora] Error 2

real	3m7.131s
user	0m5.603s
sys	0m4.044s
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer Marc-André Lureau
  2018-11-10 14:28   ` Samuel Thibault
@ 2018-11-15 13:13   ` Paolo Bonzini
  1 sibling, 0 replies; 32+ messages in thread
From: Paolo Bonzini @ 2018-11-15 13:13 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Jan Kiszka, Jason Wang, Samuel Thibault

On 10/11/2018 14:45, Marc-André Lureau wrote:
> Let's not mix command line and chardev pointers.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

This would probably be a good place to implement the suggestion I have
just sent.

Paolo

> ---
>  slirp/libslirp.h |  2 +-
>  slirp/misc.h     |  4 ++--
>  net/slirp.c      |  8 ++++----
>  slirp/misc.c     | 11 +++++++----
>  slirp/slirp.c    |  5 +++--
>  slirp/tcp_subr.c |  2 +-
>  6 files changed, 18 insertions(+), 14 deletions(-)
> 
> diff --git a/slirp/libslirp.h b/slirp/libslirp.h
> index 52dbb9feb5..3e88dbaa01 100644
> --- a/slirp/libslirp.h
> +++ b/slirp/libslirp.h
> @@ -35,7 +35,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp,
>                        struct in_addr guest_addr, int guest_port);
>  int slirp_remove_hostfwd(Slirp *slirp, int is_udp,
>                           struct in_addr host_addr, int host_port);
> -int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
> +int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
>                     struct in_addr *guest_addr, int guest_port);
>  
>  void slirp_connection_info(Slirp *slirp, Monitor *mon);
> diff --git a/slirp/misc.h b/slirp/misc.h
> index 1f8d11def6..64ca88c3b7 100644
> --- a/slirp/misc.h
> +++ b/slirp/misc.h
> @@ -9,7 +9,7 @@
>  #define MISC_H
>  
>  struct ex_list {
> -	int ex_chardev;
> +	void *ex_chardev;
>  	struct in_addr ex_addr;		/* Server address */
>  	int ex_fport;                   /* Port to telnet to */
>  	const char *ex_exec;            /* Command line of what to exec */
> @@ -52,7 +52,7 @@ struct slirp_quehead {
>  
>  void slirp_insque(void *, void *);
>  void slirp_remque(void *);
> -int add_exec(struct ex_list **, int, char *, struct in_addr, int);
> +int add_exec(struct ex_list **, void *, const char *, struct in_addr, int);
>  int fork_exec(struct socket *so, const char *ex);
>  
>  #endif
> diff --git a/net/slirp.c b/net/slirp.c
> index 1dbd34a9da..0bb12567fe 100644
> --- a/net/slirp.c
> +++ b/net/slirp.c
> @@ -709,8 +709,8 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
>               CONFIG_SMBD_COMMAND, s->smb_dir, smb_conf);
>      g_free(smb_conf);
>  
> -    if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0 ||
> -        slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 445) < 0) {
> +    if (slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 139) < 0 ||
> +        slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 445) < 0) {
>          slirp_smb_cleanup(s);
>          g_free(smb_cmdline);
>          error_setg(errp, "Conflicting/invalid smbserver address");
> @@ -774,7 +774,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
>      snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port);
>  
>      if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) {
> -        if (slirp_add_exec(s->slirp, 0, &p[4], &server, port) < 0) {
> +        if (slirp_add_exec(s->slirp, NULL, &p[4], &server, port) < 0) {
>              error_setg(errp, "Conflicting/invalid host:port in guest "
>                         "forwarding rule '%s'", config_str);
>              return -1;
> @@ -801,7 +801,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
>              return -1;
>          }
>  
> -        if (slirp_add_exec(s->slirp, 3, &fwd->hd, &server, port) < 0) {
> +        if (slirp_add_exec(s->slirp, &fwd->hd, NULL, &server, port) < 0) {
>              error_setg(errp, "Conflicting/invalid host:port in guest "
>                         "forwarding rule '%s'", config_str);
>              g_free(fwd);
> diff --git a/slirp/misc.c b/slirp/misc.c
> index aa3c4b9771..1e9415e729 100644
> --- a/slirp/misc.c
> +++ b/slirp/misc.c
> @@ -37,7 +37,7 @@ remque(void *a)
>    element->qh_rlink = NULL;
>  }
>  
> -int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
> +int add_exec(struct ex_list **ex_ptr, void *chardev, const char *cmdline,
>               struct in_addr addr, int port)
>  {
>  	struct ex_list *tmp_ptr;
> @@ -50,11 +50,14 @@ int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec,
>  	}
>  
>  	tmp_ptr = *ex_ptr;
> -	*ex_ptr = g_new(struct ex_list, 1);
> +	*ex_ptr = g_new0(struct ex_list, 1);
>  	(*ex_ptr)->ex_fport = port;
>  	(*ex_ptr)->ex_addr = addr;
> -	(*ex_ptr)->ex_chardev = do_pty == 3;
> -	(*ex_ptr)->ex_exec = (do_pty == 3) ? exec : g_strdup(exec);
> +	if (chardev) {
> +		(*ex_ptr)->ex_chardev = chardev;
> +	} else {
> +		(*ex_ptr)->ex_exec = g_strdup(cmdline);
> +	}
>  	(*ex_ptr)->ex_next = tmp_ptr;
>  	return 0;
>  }
> diff --git a/slirp/slirp.c b/slirp/slirp.c
> index eb468facb1..58d1ef64e9 100644
> --- a/slirp/slirp.c
> +++ b/slirp/slirp.c
> @@ -1068,7 +1068,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
>      return 0;
>  }
>  
> -int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
> +int slirp_add_exec(Slirp *slirp, void *chardev, const char *cmdline,
>                     struct in_addr *guest_addr, int guest_port)
>  {
>      if (!guest_addr->s_addr) {
> @@ -1081,7 +1081,8 @@ int slirp_add_exec(Slirp *slirp, int do_pty, const void *args,
>          guest_addr->s_addr == slirp->vnameserver_addr.s_addr) {
>          return -1;
>      }
> -    return add_exec(&slirp->exec_list, do_pty, (char *)args, *guest_addr,
> +
> +    return add_exec(&slirp->exec_list, chardev, cmdline, *guest_addr,
>                      htons(guest_port));
>  }
>  
> diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
> index c534b0224b..e0bf7ad070 100644
> --- a/slirp/tcp_subr.c
> +++ b/slirp/tcp_subr.c
> @@ -967,7 +967,7 @@ int tcp_ctl(struct socket *so)
>                  so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) {
>                  if (ex_ptr->ex_chardev) {
>                      so->s = -1;
> -                    so->extra = (void *)ex_ptr->ex_exec;
> +                    so->extra = ex_ptr->ex_chardev;
>                      return 1;
>                  }
>                  DEBUG_MISC((dfd, " executing %s\n", ex_ptr->ex_exec));
> 

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH
  2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH Marc-André Lureau
  2018-11-10 14:30   ` Samuel Thibault
@ 2018-11-15 13:15   ` Paolo Bonzini
  1 sibling, 0 replies; 32+ messages in thread
From: Paolo Bonzini @ 2018-11-15 13:15 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Jan Kiszka, Jason Wang, Samuel Thibault

On 10/11/2018 14:45, Marc-André Lureau wrote:
> EMU_RSH handling was dropped in commit
> 0d62c4cfe21752df4c1d6e2c2398f15d5eaa794a.
> 
> The assignment, and subsequent free() of ex_ptr->ex_exec to so->extra
> looks unsafe (double free is likely to occur).
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  slirp/misc.h     | 1 -
>  slirp/slirp.c    | 2 --
>  slirp/socket.c   | 4 ----
>  slirp/tcp_subr.c | 1 -
>  4 files changed, 8 deletions(-)
> 
> diff --git a/slirp/misc.h b/slirp/misc.h
> index 64ca88c3b7..94829722cd 100644
> --- a/slirp/misc.h
> +++ b/slirp/misc.h
> @@ -26,7 +26,6 @@ struct ex_list {
>  #define EMU_REALAUDIO 0x5
>  #define EMU_RLOGIN 0x6
>  #define EMU_IDENT 0x7
> -#define EMU_RSH 0x8
>  
>  #define EMU_NOCONNECT 0x10	/* Don't connect */
>  
> diff --git a/slirp/slirp.c b/slirp/slirp.c
> index 58d1ef64e9..daa0d5d4bd 100644
> --- a/slirp/slirp.c
> +++ b/slirp/slirp.c
> @@ -1491,8 +1491,6 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
>          }
>          if (!ex_ptr)
>              return -EINVAL;
> -
> -        so->extra = (void *)ex_ptr->ex_exec;
>      }
>  
>      return vmstate_load_state(f, &vmstate_slirp, slirp, version_id);
> diff --git a/slirp/socket.c b/slirp/socket.c
> index 322383a1f9..ff6ef1e334 100644
> --- a/slirp/socket.c
> +++ b/slirp/socket.c
> @@ -91,10 +91,6 @@ sofree(struct socket *so)
>    soqfree(so, &slirp->if_fastq);
>    soqfree(so, &slirp->if_batchq);
>  
> -  if (so->so_emu==EMU_RSH && so->extra) {
> -	sofree(so->extra);
> -	so->extra=NULL;
> -  }
>    if (so == slirp->tcp_last_so) {
>        slirp->tcp_last_so = &slirp->tcb;
>    } else if (so == slirp->udp_last_so) {
> diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
> index e0bf7ad070..eb894b6527 100644
> --- a/slirp/tcp_subr.c
> +++ b/slirp/tcp_subr.c
> @@ -546,7 +546,6 @@ static const struct tos_t tcptos[] = {
>  	  {0, 23, IPTOS_LOWDELAY, 0},	/* telnet */
>  	  {0, 80, IPTOS_THROUGHPUT, 0},	/* WWW */
>  	  {0, 513, IPTOS_LOWDELAY, EMU_RLOGIN|EMU_NOCONNECT},	/* rlogin */
> -	  {0, 514, IPTOS_LOWDELAY, EMU_RSH|EMU_NOCONNECT},	/* shell */
>  	  {0, 544, IPTOS_LOWDELAY, EMU_KSH},		/* kshell */
>  	  {0, 543, IPTOS_LOWDELAY, 0},	/* klogin */
>  	  {0, 6667, IPTOS_THROUGHPUT, EMU_IRC},	/* IRC */
> 

Ouch, do we really want to have a stateful firewall in QEMU?  I would
say burn all of tcp_emu with fire...

Paolo

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2018-11-15 13:15 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-10 13:45 [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups Marc-André Lureau
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 01/13] slirp: associate slirp_output callback with the Slirp context Marc-André Lureau
2018-11-10 14:11   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 02/13] slirp: remove do_pty from fork_exec() Marc-André Lureau
2018-11-10 14:21   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 03/13] slirp: replace ex_pty with ex_chardev Marc-André Lureau
2018-11-10 14:26   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 04/13] slirp: use a dedicated field for chardev pointer Marc-André Lureau
2018-11-10 14:28   ` Samuel Thibault
2018-11-15 13:13   ` Paolo Bonzini
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 05/13] slirp: remove unused EMU_RSH Marc-André Lureau
2018-11-10 14:30   ` Samuel Thibault
2018-11-15 13:15   ` Paolo Bonzini
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 06/13] slirp: rename /extra/chardev Marc-André Lureau
2018-11-10 14:30   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 07/13] slirp: move internal function declarations Marc-André Lureau
2018-11-10 14:31   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 08/13] slirp: remove Monitor dependency, return a string for info Marc-André Lureau
2018-11-10 14:35   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 09/13] slirp: fix slirp_add_exec() leaks Marc-André Lureau
2018-11-10 14:37   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 10/13] slirp: improve subprocess socket creation Marc-André Lureau
2018-11-10 13:53   ` Samuel Thibault
2018-11-10 14:04     ` Peter Maydell
2018-11-10 14:07       ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 11/13] slirp: replace the poor-man string split with g_strsplit() Marc-André Lureau
2018-11-10 14:42   ` Samuel Thibault
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 12/13] glib-compat: add g_spawn_async_with_fds() fallback Marc-André Lureau
2018-11-10 13:45 ` [Qemu-devel] [PATCH for-3.2 13/13] slirp: simplify fork_exec() Marc-André Lureau
2018-11-10 13:54   ` Samuel Thibault
2018-11-10 20:19 ` [Qemu-devel] [PATCH for-3.2 00/13] slirp: cleanups no-reply
2018-11-10 20:48 ` no-reply

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.