netdev-linux: Report error for truncated packets on receive.
[openvswitch] / lib / netdev-linux.c
index a100898a5d2c3fe695852822658d23a25422aee6..27a123cd4ea9c87642d04f7d7dbb3110898e5205 100644 (file)
@@ -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;