qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1/2] net: stellaris_enet: check packet length against receive buffer
@ 2016-04-07 10:25 P J P
  2016-04-07 11:02 ` Peter Maydell
  0 siblings, 1 reply; 3+ messages in thread
From: P J P @ 2016-04-07 10:25 UTC (permalink / raw)
  To: Qemu Developers; +Cc: Oleksandr Bazhaniuk, Jason Wang, Prasad J Pandit

From: Prasad J Pandit <pjp@fedoraproject.org>

When receiving packets over Stellaris ethernet controller, it
uses receive buffer of size 2048 bytes. In case the controller
accepts large(MTU) packets, it could lead to memory corruption.
Add check to avoid it.

Reported by: Oleksandr Bazhaniuk <oleksandr.bazhaniuk@intel.com>

Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
---
 hw/net/stellaris_enet.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/net/stellaris_enet.c b/hw/net/stellaris_enet.c
index 21a4773..47b869a 100644
--- a/hw/net/stellaris_enet.c
+++ b/hw/net/stellaris_enet.c
@@ -237,6 +237,9 @@ static ssize_t stellaris_enet_receive(NetClientState *nc, const uint8_t *buf, si
         n -= 31;
     s->np++;
 
+    if (size >= sizeof(s->rx[n].data) - 6) {
+        return -1;
+    }
     s->rx[n].len = size + 6;
     p = s->rx[n].data;
     *(p++) = (size + 6);
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] net: stellaris_enet: check packet length against receive buffer
  2016-04-07 10:25 [Qemu-devel] [PATCH 1/2] net: stellaris_enet: check packet length against receive buffer P J P
@ 2016-04-07 11:02 ` Peter Maydell
  2016-04-07 12:37   ` P J P
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Maydell @ 2016-04-07 11:02 UTC (permalink / raw)
  To: P J P; +Cc: Oleksandr Bazhaniuk, Jason Wang, Qemu Developers, Prasad J Pandit

On 7 April 2016 at 11:25, P J P <ppandit@redhat.com> wrote:
> From: Prasad J Pandit <pjp@fedoraproject.org>
>
> When receiving packets over Stellaris ethernet controller, it
> uses receive buffer of size 2048 bytes. In case the controller
> accepts large(MTU) packets, it could lead to memory corruption.
> Add check to avoid it.
>
> Reported by: Oleksandr Bazhaniuk <oleksandr.bazhaniuk@intel.com>
>
> Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
> ---
>  hw/net/stellaris_enet.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/hw/net/stellaris_enet.c b/hw/net/stellaris_enet.c
> index 21a4773..47b869a 100644
> --- a/hw/net/stellaris_enet.c
> +++ b/hw/net/stellaris_enet.c
> @@ -237,6 +237,9 @@ static ssize_t stellaris_enet_receive(NetClientState *nc, const uint8_t *buf, si
>          n -= 31;
>      s->np++;

We should do this check before we increase s->np, because
if we're going to bail out then we won't be putting this
packet into the RX FIFO.

> +    if (size >= sizeof(s->rx[n].data) - 6) {
> +        return -1;
> +    }

The datasheet for this chip says that we should report this
to the guest:

"For the Ethernet Controller, data sent/received can be larger
than 1500 bytes without causing a Frame Too Long error. Instead,
a FIFO overrun error is reported using the FOV bit in the
Ethernet MAC Raw Interrupt Status (MACRIS) register when the
frame received is too large to fit in the Ethernet Controller's
2K RAM."
So you want something like:

   /* If the packet won't fit into the emulated 2K RAM, this
    * is reported as a FIFO overrun error.
    */
   s->ris |= SE_INT_FOV;
   stellaris_enet_update(s);
   return -1;


thanks
-- PMM

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] net: stellaris_enet: check packet length against receive buffer
  2016-04-07 11:02 ` Peter Maydell
@ 2016-04-07 12:37   ` P J P
  0 siblings, 0 replies; 3+ messages in thread
From: P J P @ 2016-04-07 12:37 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Oleksandr Bazhaniuk, Jason Wang, Qemu Developers

+-- On Thu, 7 Apr 2016, Peter Maydell wrote --+
| >          n -= 31;
| >      s->np++;
| 
| We should do this check before we increase s->np, because
| if we're going to bail out then we won't be putting this
| packet into the RX FIFO.

  Ah, right.

| The datasheet for this chip says that we should report this
| to the guest:
| 
| "For the Ethernet Controller, data sent/received can be larger
| than 1500 bytes without causing a Frame Too Long error. Instead,
| a FIFO overrun error is reported using the FOV bit in the
| Ethernet MAC Raw Interrupt Status (MACRIS) register when the
| frame received is too large to fit in the Ethernet Controller's
| 2K RAM."
| So you want something like:
| 
|    /* If the packet won't fit into the emulated 2K RAM, this
|     * is reported as a FIFO overrun error.
|     */
|    s->ris |= SE_INT_FOV;
|    stellaris_enet_update(s);
|    return -1;

  Okay. I have sent a revised patch v2, with these updates.

Thank you.
--
Prasad J Pandit / Red Hat Product Security Team
47AF CE69 3A90 54AA 9045 1053 DD13 3D32 FE5B 041F

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-04-07 12:38 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-07 10:25 [Qemu-devel] [PATCH 1/2] net: stellaris_enet: check packet length against receive buffer P J P
2016-04-07 11:02 ` Peter Maydell
2016-04-07 12:37   ` P J P

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).