X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fnetdev-linux.c;h=27a123cd4ea9c87642d04f7d7dbb3110898e5205;hb=02e83e83b4c8d88f50317ba56fec53cd6d3fb909;hp=a100898a5d2c3fe695852822658d23a25422aee6;hpb=f8500004409c30ff929b8cff367a39dab76f85c6;p=openvswitch diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index a100898a..27a123cd 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -802,8 +802,11 @@ netdev_linux_recv(struct netdev *netdev_, void *data, size_t size) } for (;;) { - ssize_t retval = read(netdev->fd, data, size); - if (retval >= 0) { + ssize_t retval = recv(netdev->fd, data, size, MSG_TRUNC); + if (retval > size) { + /* Received packet was longer than supplied buffer. */ + return -EMSGSIZE; + } else if (retval >= 0) { return retval; } else if (errno != EINTR) { if (errno != EAGAIN) { @@ -1244,8 +1247,8 @@ get_stats_via_vport(const struct netdev *netdev_, error = netdev_vport_get_stats(netdev_, stats); if (error) { - VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed %d", - netdev_get_name(netdev_), error); + VLOG_WARN_RL(&rl, "%s: obtaining netdev stats via vport failed " + "(%s)", netdev_get_name(netdev_), strerror(error)); } netdev_dev->have_vport_stats = !error; netdev_dev->cache_valid |= VALID_HAVE_VPORT_STATS;