From: Ben Pfaff Date: Fri, 15 Jan 2010 22:06:15 +0000 (-0800) Subject: netdev-linux: Don't close(0) when closing an ordinary netdev. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88258e0034cc7ca6ffde0974f1fb92d26289ad6a;p=openvswitch netdev-linux: Don't close(0) when closing an ordinary netdev. Calling close(0) at random points is bad. It means that the next call to socket() or open() returns fd 0. Then the next time a netdev gets closed, that socket or file fd gets closed too, and you end up with weird "Bad file descriptor" errors. Found by installing the following as lib/unistd.h in the source tree: #ifndef UNISTD_H #define UNISTD_H 1 #include #include_next #undef close #define close(fd) rpl_close(fd) static inline int rpl_close(int fd) { if (!fd) { abort(); } return (close)(fd); } #endif --- diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 4f6b20b2..d45349b2 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -821,7 +821,6 @@ netdev_linux_open(struct netdev_dev *netdev_dev_, int ethertype, if (!strcmp(netdev_dev_get_type(netdev_dev_), "tap")) { netdev->fd = netdev_dev->state.tap.fd; - } else if (ethertype != NETDEV_ETH_TYPE_NONE) { struct sockaddr_ll sll; int protocol; @@ -869,6 +868,8 @@ netdev_linux_open(struct netdev_dev *netdev_dev_, int ethertype, if (error) { goto error; } + } else { + netdev->fd = -1; } *netdevp = &netdev->netdev;