[ovs-dev] [PATCH] netdev-linux: change fd number if 0 was opened
Ilya Maximets
i.maximets at samsung.com
Wed Sep 30 17:06:17 UTC 2015
Since 18167ffebe54e658579835a2e0acf67ec1d14692 fd = 0 instead of -1
considered as erroneous, because pollfd.fd on Windows does not take
negative values. So, we should avoid using it.
Reported-by: Nikita Kalyazin <n.kalyazin at samsung.com>
Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
---
lib/netdev-linux.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index 584e804..e1c4e35 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -729,6 +729,20 @@ netdev_linux_alloc(void)
}
static void
+change_fd0(int *fd)
+{
+ int new_fd;
+ /* Forbiding to open fd 0 because of windows code restrictions
+ * inside poll_create_node(), that considers fd 0 erroneous. */
+ if (*fd == 0) {
+ new_fd = dup(*fd);
+ if (close(*fd) < 0)
+ VLOG_WARN("closing fd 0 failed: %s", ovs_strerror(error));
+ *fd = new_fd;
+ }
+}
+
+static void
netdev_linux_common_construct(struct netdev_linux *netdev)
{
ovs_mutex_init(&netdev->mutex);
@@ -778,6 +792,7 @@ netdev_linux_construct_tap(struct netdev *netdev_)
/* Open tap device. */
netdev->tap_fd = open(tap_dev, O_RDWR);
+ change_fd0(&netdev->tap_fd);
if (netdev->tap_fd < 0) {
error = errno;
VLOG_WARN("opening \"%s\" failed: %s", tap_dev, ovs_strerror(error));
@@ -871,6 +886,7 @@ netdev_linux_rxq_construct(struct netdev_rxq *rxq_)
/* Create file descriptor. */
rx->fd = socket(PF_PACKET, SOCK_RAW, 0);
+ change_fd0(&rx->fd);
if (rx->fd < 0) {
error = errno;
VLOG_ERR("failed to create raw socket (%s)", ovs_strerror(error));
--
2.1.4
More information about the dev
mailing list