[U-Boot] [PATCH] api: net: fix length check in eth_receive()

Michael Walle michael at walle.cc
Fri Jun 22 23:24:28 CEST 2012


If the requested length is too small to hold the received packet,
eth_receive() will return -1 and will leave the packet in the receive
buffers. Instead of returning an error in this case, we return the first
portion of the received packet and remove it from the receive buffers.

This fixes FreeBSD's ubldr. Without this patch it will just stop receiving
packets if the NIC receives more than PKTBUFSRX too large packets.

Signed-off-by: Michael Walle <michael at walle.cc>
Cc: Joe Hershberger <joe.hershberger at gmail.com>
Cc: Rafal Jaworowski <raj at semihalf.com>
Cc: Piotr Kruszynski <ppk at semihalf.com>
---
 net/eth.c |    5 +----
 1 files changed, 1 insertions(+), 4 deletions(-)

diff --git a/net/eth.c b/net/eth.c
index d526264..09249c9 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -486,10 +486,7 @@ int eth_receive(void *packet, int length)
 			return -1;
 	}
 
-	if (length < eth_rcv_bufs[eth_rcv_current].length)
-		return -1;
-
-	length = eth_rcv_bufs[eth_rcv_current].length;
+	length = min(eth_rcv_bufs[eth_rcv_current].length, length);
 
 	for (i = 0; i < length; i++)
 		p[i] = eth_rcv_bufs[eth_rcv_current].data[i];
-- 
1.7.2.5



More information about the U-Boot mailing list