diff mbox

vmxnet3: Do not fill stats if device is inactive

Message ID 1444906470-21216-1-git-send-email-dana.rubin@ravellosystems.com
State New
Headers show

Commit Message

Shmulik Ladkani Oct. 15, 2015, 10:54 a.m. UTC
From: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>

Guest OS may issue VMXNET3_CMD_GET_STATS even before device was
activated (for example in linux, after insmod but prior net-dev open).

Accessing shared descriptors prior device activation is illegal as the
VMXNET3State structures have not been fully initialized.

As a result, guest memory gets corrupted and may lead to guest OS
crashes.

Fix, by not filling the stats descriptors if device is inactive.

Reported-by: Leonid Shatz <leonid.shatz@ravellosystems.com>
Signed-off-by: Dana Rubin <dana.rubin@ravellosystems.com>
Signed-off-by: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
---
 hw/net/vmxnet3.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Dmitry Fleytman Oct. 18, 2015, 7:16 a.m. UTC | #1
ACK

> On 15 Oct 2015, at 13:54 PM, Dana Rubin <shmulik.ladkani@ravellosystems.com> wrote:
> 
> From: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
> 
> Guest OS may issue VMXNET3_CMD_GET_STATS even before device was
> activated (for example in linux, after insmod but prior net-dev open).
> 
> Accessing shared descriptors prior device activation is illegal as the
> VMXNET3State structures have not been fully initialized.
> 
> As a result, guest memory gets corrupted and may lead to guest OS
> crashes.
> 
> Fix, by not filling the stats descriptors if device is inactive.
> 
> Reported-by: Leonid Shatz <leonid.shatz@ravellosystems.com>
> Signed-off-by: Dana Rubin <dana.rubin@ravellosystems.com>
> Signed-off-by: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
> ---
> hw/net/vmxnet3.c | 4 ++++
> 1 file changed, 4 insertions(+)
> 
> diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
> index 3c5e10d..5e3a233 100644
> --- a/hw/net/vmxnet3.c
> +++ b/hw/net/vmxnet3.c
> @@ -1289,6 +1289,10 @@ static uint32_t vmxnet3_get_interrupt_config(VMXNET3State *s)
> static void vmxnet3_fill_stats(VMXNET3State *s)
> {
>     int i;
> +
> +    if (!s->device_active)
> +        return;
> +
>     for (i = 0; i < s->txq_num; i++) {
>         cpu_physical_memory_write(s->txq_descr[i].tx_stats_pa,
>                                   &s->txq_descr[i].txq_stats,
> -- 
> 1.9.1
>
Jason Wang Oct. 20, 2015, 3:08 a.m. UTC | #2
On 10/18/2015 03:16 PM, Dmitry Fleytman wrote:
> ACK

Hi Dmitry:

Thanks a lot for the reviewing.

As I want to add your "Acked-by" in the patch, could you pls add a
formal one in the future? (Which can make my life a little bit easier).

>> On 15 Oct 2015, at 13:54 PM, Dana Rubin <shmulik.ladkani@ravellosystems.com> wrote:
>>
>> From: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
>>
>> Guest OS may issue VMXNET3_CMD_GET_STATS even before device was
>> activated (for example in linux, after insmod but prior net-dev open).
>>
>> Accessing shared descriptors prior device activation is illegal as the
>> VMXNET3State structures have not been fully initialized.
>>
>> As a result, guest memory gets corrupted and may lead to guest OS
>> crashes.
>>
>> Fix, by not filling the stats descriptors if device is inactive.
>>
>> Reported-by: Leonid Shatz <leonid.shatz@ravellosystems.com>
>> Signed-off-by: Dana Rubin <dana.rubin@ravellosystems.com>
>> Signed-off-by: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
>> ---
>> hw/net/vmxnet3.c | 4 ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
>> index 3c5e10d..5e3a233 100644
>> --- a/hw/net/vmxnet3.c
>> +++ b/hw/net/vmxnet3.c
>> @@ -1289,6 +1289,10 @@ static uint32_t vmxnet3_get_interrupt_config(VMXNET3State *s)
>> static void vmxnet3_fill_stats(VMXNET3State *s)
>> {
>>     int i;
>> +
>> +    if (!s->device_active)
>> +        return;
>> +
>>     for (i = 0; i < s->txq_num; i++) {
>>         cpu_physical_memory_write(s->txq_descr[i].tx_stats_pa,
>>                                   &s->txq_descr[i].txq_stats,
>> -- 
>> 1.9.1
>>
>
Jason Wang Oct. 20, 2015, 4:42 a.m. UTC | #3
On 10/15/2015 06:54 PM, Dana Rubin wrote:
> From: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
>
> Guest OS may issue VMXNET3_CMD_GET_STATS even before device was
> activated (for example in linux, after insmod but prior net-dev open).
>
> Accessing shared descriptors prior device activation is illegal as the
> VMXNET3State structures have not been fully initialized.
>
> As a result, guest memory gets corrupted and may lead to guest OS
> crashes.
>
> Fix, by not filling the stats descriptors if device is inactive.
>
> Reported-by: Leonid Shatz <leonid.shatz@ravellosystems.com>
> Signed-off-by: Dana Rubin <dana.rubin@ravellosystems.com>
> Signed-off-by: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
> ---
>  hw/net/vmxnet3.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
> index 3c5e10d..5e3a233 100644
> --- a/hw/net/vmxnet3.c
> +++ b/hw/net/vmxnet3.c
> @@ -1289,6 +1289,10 @@ static uint32_t vmxnet3_get_interrupt_config(VMXNET3State *s)
>  static void vmxnet3_fill_stats(VMXNET3State *s)
>  {
>      int i;
> +
> +    if (!s->device_active)
> +        return;
> +
>      for (i = 0; i < s->txq_num; i++) {
>          cpu_physical_memory_write(s->txq_descr[i].tx_stats_pa,
>                                    &s->txq_descr[i].txq_stats,

Applied in https://github.com/jasowang/qemu/commits/net

Thanks
Dmitry Fleytman Oct. 20, 2015, 7:11 a.m. UTC | #4
Hi Jason,

Sure. No problem.

Acked-by: Dmitry Fleytman <dmitry@daynix.com <mailto:dmitry@daynix.com>>

Dmitry.

> On 20 Oct 2015, at 06:08 AM, Jason Wang <jasowang@redhat.com> wrote:
> 
> 
> 
> On 10/18/2015 03:16 PM, Dmitry Fleytman wrote:
>> ACK
> 
> Hi Dmitry:
> 
> Thanks a lot for the reviewing.
> 
> As I want to add your "Acked-by" in the patch, could you pls add a
> formal one in the future? (Which can make my life a little bit easier).
> 
>>> On 15 Oct 2015, at 13:54 PM, Dana Rubin <shmulik.ladkani@ravellosystems.com> wrote:
>>> 
>>> From: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
>>> 
>>> Guest OS may issue VMXNET3_CMD_GET_STATS even before device was
>>> activated (for example in linux, after insmod but prior net-dev open).
>>> 
>>> Accessing shared descriptors prior device activation is illegal as the
>>> VMXNET3State structures have not been fully initialized.
>>> 
>>> As a result, guest memory gets corrupted and may lead to guest OS
>>> crashes.
>>> 
>>> Fix, by not filling the stats descriptors if device is inactive.
>>> 
>>> Reported-by: Leonid Shatz <leonid.shatz@ravellosystems.com>
>>> Signed-off-by: Dana Rubin <dana.rubin@ravellosystems.com>
>>> Signed-off-by: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
>>> ---
>>> hw/net/vmxnet3.c | 4 ++++
>>> 1 file changed, 4 insertions(+)
>>> 
>>> diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
>>> index 3c5e10d..5e3a233 100644
>>> --- a/hw/net/vmxnet3.c
>>> +++ b/hw/net/vmxnet3.c
>>> @@ -1289,6 +1289,10 @@ static uint32_t vmxnet3_get_interrupt_config(VMXNET3State *s)
>>> static void vmxnet3_fill_stats(VMXNET3State *s)
>>> {
>>>    int i;
>>> +
>>> +    if (!s->device_active)
>>> +        return;
>>> +
>>>    for (i = 0; i < s->txq_num; i++) {
>>>        cpu_physical_memory_write(s->txq_descr[i].tx_stats_pa,
>>>                                  &s->txq_descr[i].txq_stats,
>>> -- 
>>> 1.9.1
>>> 
>> 
>
Jason Wang Oct. 20, 2015, 7:18 a.m. UTC | #5
On 10/20/2015 03:11 PM, Dmitry Fleytman wrote:
> Hi Jason,
>
> Sure. No problem.
>
> Acked-by: Dmitry Fleytman <dmitry@daynix.com <mailto:dmitry@daynix.com>>
>
> Dmitry.

Thanks.

>
>> On 20 Oct 2015, at 06:08 AM, Jason Wang <jasowang@redhat.com
>> <mailto:jasowang@redhat.com>> wrote:
>>
>>
>>
>> On 10/18/2015 03:16 PM, Dmitry Fleytman wrote:
>>> ACK
>>
>> Hi Dmitry:
>>
>> Thanks a lot for the reviewing.
>>
>> As I want to add your "Acked-by" in the patch, could you pls add a
>> formal one in the future? (Which can make my life a little bit easier).
>>
>>>> On 15 Oct 2015, at 13:54 PM, Dana Rubin
>>>> <shmulik.ladkani@ravellosystems.com
>>>> <mailto:shmulik.ladkani@ravellosystems.com>> wrote:
>>>>
>>>> From: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com
>>>> <mailto:shmulik.ladkani@ravellosystems.com>>
>>>>
>>>> Guest OS may issue VMXNET3_CMD_GET_STATS even before device was
>>>> activated (for example in linux, after insmod but prior net-dev open).
>>>>
>>>> Accessing shared descriptors prior device activation is illegal as the
>>>> VMXNET3State structures have not been fully initialized.
>>>>
>>>> As a result, guest memory gets corrupted and may lead to guest OS
>>>> crashes.
>>>>
>>>> Fix, by not filling the stats descriptors if device is inactive.
>>>>
>>>> Reported-by: Leonid Shatz <leonid.shatz@ravellosystems.com
>>>> <mailto:leonid.shatz@ravellosystems.com>>
>>>> Signed-off-by: Dana Rubin <dana.rubin@ravellosystems.com
>>>> <mailto:dana.rubin@ravellosystems.com>>
>>>> Signed-off-by: Shmulik Ladkani <shmulik.ladkani@ravellosystems.com
>>>> <mailto:shmulik.ladkani@ravellosystems.com>>
>>>> ---
>>>> hw/net/vmxnet3.c | 4 ++++
>>>> 1 file changed, 4 insertions(+)
>>>>
>>>> diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
>>>> index 3c5e10d..5e3a233 100644
>>>> --- a/hw/net/vmxnet3.c
>>>> +++ b/hw/net/vmxnet3.c
>>>> @@ -1289,6 +1289,10 @@ static uint32_t
>>>> vmxnet3_get_interrupt_config(VMXNET3State *s)
>>>> static void vmxnet3_fill_stats(VMXNET3State *s)
>>>> {
>>>>    int i;
>>>> +
>>>> +    if (!s->device_active)
>>>> +        return;
>>>> +
>>>>    for (i = 0; i < s->txq_num; i++) {
>>>>        cpu_physical_memory_write(s->txq_descr[i].tx_stats_pa,
>>>>                                  &s->txq_descr[i].txq_stats,
>>>> -- 
>>>> 1.9.1
>>>>
>>>
>>
>
diff mbox

Patch

diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 3c5e10d..5e3a233 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -1289,6 +1289,10 @@  static uint32_t vmxnet3_get_interrupt_config(VMXNET3State *s)
 static void vmxnet3_fill_stats(VMXNET3State *s)
 {
     int i;
+
+    if (!s->device_active)
+        return;
+
     for (i = 0; i < s->txq_num; i++) {
         cpu_physical_memory_write(s->txq_descr[i].tx_stats_pa,
                                   &s->txq_descr[i].txq_stats,