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

Joe Hershberger joe.hershberger at gmail.com
Mon Jun 25 22:25:56 CEST 2012


Hi Michael,

On Fri, Jun 22, 2012 at 4:24 PM, Michael Walle <michael at walle.cc> wrote:
> 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);

Is it really a good idea to return a runt packet to the network
protocols?  I understand wanting to drop the too-big packet, but I
think you should simply drop that packet before returning the error,
but still error.

-Joe


More information about the U-Boot mailing list