Package: qemu
Version: 0.8.2-4
Severity: normal

reportbug-qemu-20070104-12998-TR9hMc

-- System Information:
Debian Release: 4.0
  APT prefers testing
  APT policy: (500, 'testing'), (100, 'unstable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.19-minimal
Locale: LANG=ru_RU.KOI8-R, LC_CTYPE=ru_RU.KOI8-R (charmap=KOI8-R)

Versions of packages qemu depends on:
ii  bochsbios                    2.3-2       BIOS for the Bochs emulator
ii  libasound2                   1.0.13-1    ALSA library
ii  libc6                        2.3.6.ds1-8 GNU C Library: Shared libraries
ii  libncurses5                  5.5-5       Shared libraries for terminal hand
ii  libsdl1.2debian              1.2.11-7    Simple DirectMedia Layer
ii  openhackware                 0.4.1-2     OpenFirmware emulator for PowerPC
ii  proll                        18-2        JavaStation PROM 2.x compatible re
ii  vgabios                      0.6a-1      VGA BIOS software for the Bochs an
ii  zlib1g                       1:1.2.3-13  compression library - runtime

Versions of packages qemu recommends:
ii  debootstrap                   0.3.3.1    Bootstrap a basic Debian system
ii  sharutils                     1:4.2.1-15 shar, unshar, uuencode, uudecode
ii  vde                           1.5.11-1   virtual distributed ethernet

-- no debconf information
Index: qemu-0.8.2/slirp/tcp_subr.c
===================================================================
--- qemu-0.8.2.orig/slirp/tcp_subr.c	2007-01-04 16:22:41.128335686 +0300
+++ qemu-0.8.2/slirp/tcp_subr.c	2007-01-04 16:49:25.000000000 +0300
@@ -989,6 +989,10 @@
 			/*
 			 * Need to emulate the PORT command
 			 */			
+			struct socket *tmpso;
+			struct sockaddr_in addr;
+			int len;
+
 			x = sscanf(bptr, "ORT %d,%d,%d,%d,%d,%d\r\n%256[^\177]", 
 				   &n1, &n2, &n3, &n4, &n5, &n6, buff);
 			if (x < 6)
@@ -997,15 +1001,17 @@
 			laddr = htonl((n1 << 24) | (n2 << 16) | (n3 << 8) | (n4));
 			lport = htons((n5 << 8) | (n6));
 			
-			if ((so = solisten(0, laddr, lport, SS_FACCEPTONCE)) == NULL)
+			if ((tmpso = solisten(0, laddr, lport, SS_FACCEPTONCE)) == NULL)
 			   return 1;
 			
-			n6 = ntohs(so->so_fport);
+			n6 = ntohs(tmpso->so_fport);
 			
 			n5 = (n6 >> 8) & 0xff;
 			n6 &= 0xff;
 			
-			laddr = ntohl(so->so_faddr.s_addr);
+			len = sizeof(addr);
+			getsockname(so->s, &addr, &len);
+			laddr = ntohl(addr.sin_addr.s_addr);
 			
 			n1 = ((laddr >> 24) & 0xff);
 			n2 = ((laddr >> 16) & 0xff);
@@ -1020,6 +1026,10 @@
 			/*
 			 * Need to emulate the PASV response
 			 */
+			struct socket *tmpso;
+			struct sockaddr_in addr;
+			int len;
+
 			x = sscanf(bptr, "27 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n%256[^\177]",
 				   &n1, &n2, &n3, &n4, &n5, &n6, buff);
 			if (x < 6)
@@ -1028,15 +1038,17 @@
 			laddr = htonl((n1 << 24) | (n2 << 16) | (n3 << 8) | (n4));
 			lport = htons((n5 << 8) | (n6));
 			
-			if ((so = solisten(0, laddr, lport, SS_FACCEPTONCE)) == NULL)
+			if ((tmpso = solisten(0, laddr, lport, SS_FACCEPTONCE)) == NULL)
 			   return 1;
 			
-			n6 = ntohs(so->so_fport);
+			n6 = ntohs(tmpso->so_fport);
 			
 			n5 = (n6 >> 8) & 0xff;
 			n6 &= 0xff;
 			
-			laddr = ntohl(so->so_faddr.s_addr);
+			len = sizeof(addr);
+			getsockname(so->s, &addr, &len);
+			laddr = ntohl(addr.sin_addr.s_addr);
 			
 			n1 = ((laddr >> 24) & 0xff);
 			n2 = ((laddr >> 16) & 0xff);
Index: qemu-0.8.2/vl.c
===================================================================
--- qemu-0.8.2.orig/vl.c	2007-01-04 16:20:39.505954959 +0300
+++ qemu-0.8.2/vl.c	2007-01-04 16:52:56.000000000 +0300
@@ -62,6 +62,7 @@
 
 #if defined(CONFIG_SLIRP)
 #include "libslirp.h"
+extern void add_emu(char *buf);
 #endif
 
 #ifdef _WIN32
@@ -2831,12 +2832,19 @@
     slirp_input(buf, size);
 }
 
-static int net_slirp_init(VLANState *vlan)
+static void do_slirp_init(void)
 {
     if (!slirp_inited) {
         slirp_inited = 1;
         slirp_init();
+	/* emulate ftp on port 21 by default */
+	add_emu("ftp 21");
     }
+}
+
+static int net_slirp_init(VLANState *vlan)
+{
+    do_slirp_init();
     slirp_vc = qemu_new_vlan_client(vlan, 
                                     slirp_receive, NULL, NULL);
     snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector");
@@ -2850,11 +2858,8 @@
     const char *p;
     struct in_addr guest_addr;
     int host_port, guest_port;
-    
-    if (!slirp_inited) {
-        slirp_inited = 1;
-        slirp_init();
-    }
+
+    do_slirp_init();
 
     p = redir_str;
     if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
@@ -2929,10 +2934,7 @@
     char smb_cmdline[1024];
     FILE *f;
 
-    if (!slirp_inited) {
-        slirp_inited = 1;
-        slirp_init();
-    }
+    do_slirp_init();
 
     /* XXX: better tmp dir construction */
     snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());

Reply via email to