pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pkg/42471: qemu tap device bug



>Number:         42471
>Category:       pkg
>Synopsis:       qemu tap device bug
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Dec 18 17:55:00 +0000 2009
>Originator:     Victor
>Release:        NetBSD 5.0_STABLE
>Organization:
>Environment:
NetBSD BlackTiny 5.0_STABLE NetBSD 5.0_STABLE (BlackTiny-AMD64) #0: Wed Oct 14 
21:20:39 CEST 2009  
root@BlackTiny:/usr/obj/sys/arch/amd64/compile/BlackTiny-AMD64 amd64
>Description:
Sent to pkgsrc-users%netbsd.org@localhost
---------------------------------

Hello there!

I don't know if you can remember this thread [1]. Whenever I tried to
use some previously configured TAP device, I got a segmentation fault. I
thought it could some brilliant idea to have a look at the sources and
try to find out what's causing that error. After several gdb sessions,
it turned out qemu was accessing the wrong device.

-------------- File: net.c / Lines:1466-1470 --------------

    TFR(fd = open("/dev/tap", O_RDWR));

    if (fd < 0) {

        fprintf(stderr, "warning: could not open /dev/tap: no virtual network 
emulation\n");

        return -1;

    }

-----------------------------------------------------------------------

If you run qemu like this:

$ qemu -net tap,ifname=tap0 ...


why is "/dev/tap" being used as tap device?! It should be "/dev/tap0". I
have attached a patch which should do the work.
Any suggestions/improvements are appreciated.


Links:
[1] http://mail-index.netbsd.org/netbsd-users/2009/11/25/msg004957.html

-- Victor Dorneanu Contact - Web/Blog: http://dornea.nu GnuPGP information - 
KeyID = 0xD20870F4 (subkeys.pgp.net) - Key fingerprint = DD6B 5E09 242F 7410 
3F90 492A 4CBA FD13 D208 70F4



--- net.c.orig  2009-12-18 18:24:20.000000000 +0100
+++ net.c       2009-12-18 18:19:07.000000000 +0100
@@ -116,7 +116,7 @@
 #include "sysemu.h"
 #include "qemu-timer.h"
 #include "qemu-char.h"
-#include "audio/audio.h"
+#include "audio/qaudio.h"
 #include "qemu_socket.h"
 #include "qemu-log.h"
 
@@ -1461,11 +1461,27 @@
 {
     int fd;
     char *dev;
+    char tap_dev[1024];
     struct stat s;
 
-    TFR(fd = open("/dev/tap", O_RDWR));
+#if defined (__NetBSD__)
+    // Concatenate dev path (/dev/) and tap device name (e.g. tap0)
+    if (strlcpy(tap_dev, "/dev/", sizeof(tap_dev)) >= sizeof(tap_dev)) {
+        fprintf(stderr, "error: tap device name too long\n");
+        return -1;
+    }
+
+    if (strlcat(tap_dev, ifname, sizeof(tap_dev)) >= sizeof(tap_dev)) {
+        fprintf(stderr, "error: tap device name too long\n");
+        return -1;
+    }
+#else
+    tap_dev="/dev/tap";
+#endif
+    TFR(fd = open(tap_dev, O_RDWR));
+
     if (fd < 0) {
-        fprintf(stderr, "warning: could not open /dev/tap: no virtual network 
emulation\n");
+        fprintf(stderr, "warning: could not open %s: no virtual network 
emulation\n",tap_dev);
         return -1;
     }
 

>How-To-Repeat:
$ qemu -net tap
(should segfault)
>Fix:
Patch was attached.



Home | Main Index | Thread Index | Old Index