[ovs-dev] [flow-stats 03/14] netdev-linux: Report error for truncated packets on receive.

Ben Pfaff blp at nicira.com
Thu Dec 8 22:01:28 UTC 2011


Found by inspection.
---
 lib/netdev-linux.c    |    7 +++++--
 lib/netdev-provider.h |    3 +++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index 9ff286e..27a123c 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) {
diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index 81e6c39..d5a30c8 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -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.
      *
-- 
1.7.4.4




More information about the dev mailing list