From 02e83e83b4c8d88f50317ba56fec53cd6d3fb909 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 2 Dec 2011 15:22:20 -0800 Subject: [PATCH] netdev-linux: Report error for truncated packets on receive. Found by inspection. Signed-off-by: Ben Pfaff --- 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 9ff286ee4..27a123cd4 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 81e6c3917..d5a30c809 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. * -- 2.43.0