netdev-linux: Report error for truncated packets on receive.
authorBen Pfaff <blp@nicira.com>
Fri, 2 Dec 2011 23:22:20 +0000 (15:22 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 19 Dec 2011 22:53:28 +0000 (14:53 -0800)
Found by inspection.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/netdev-linux.c
lib/netdev-provider.h

index 9ff286ee4fe75b0031c2f24dae02a66622dbb0f9..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) {
index 81e6c3917130d1931c225519654b6f705e5bd68b..d5a30c809a01daf3f48d93b01c218e4b03b1aec6 100644 (file)
@@ -172,6 +172,9 @@ struct netdev_class {
      * packet, otherwise a negative errno value.  Returns -EAGAIN immediately
      * if no packet is ready to be received.
      *
+     * Returns -EMSGSIZE, and discards the packet, if the received packet is
+     * longer than 'size' bytes.
+     *
      * This function can only be expected to return a packet if ->listen() has
      * been called successfully.
      *