diff mbox series

ixgbe: add array bounds check

Message ID 1508772111-4527-1-git-send-email-paul.greenwalt@intel.com
State Changes Requested
Delegated to: Jeff Kirsher
Headers show
Series ixgbe: add array bounds check | expand

Commit Message

Paul Greenwalt Oct. 23, 2017, 3:21 p.m. UTC
Add bounds check for index fcoe_i of rx_ring array.

Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Alexander Duyck Oct. 24, 2017, 4:19 p.m. UTC | #1
On Mon, Oct 23, 2017 at 8:21 AM, Paul Greenwalt
<paul.greenwalt@intel.com> wrote:
> Add bounds check for index fcoe_i of rx_ring array.
>
> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
> ---
>  drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
> index a23c2b5..5772fe2 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
> @@ -698,6 +698,8 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
>                 }
>
>                 fcoe_i = fcoe->offset + (i % fcoe->indices);
> +               if (fcoe_i >= MAX_RX_QUEUES)
> +                       fcoe_i = MAX_RX_QUEUES - 1;

Instead of using MAX_RX_QUEUES why use fcoe->limit? If I am not
mistake the upper limit is either 8 or 32 for the FCoE redirection
table anyway so odds are you can't even use 64 queues if you wanted
to. From what I can tell the only advantage of the approach you are
using now is that you don't potentially zero out the value when it
gets hit with the mask below.

>                 fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
>                 fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx;
>                 fcoe_q |= fcoe_q_h;
> --
> 2.7.4
>
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan@osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
Tantilov, Emil S Oct. 24, 2017, 5:44 p.m. UTC | #2
>-----Original Message-----
>From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
>Behalf Of Alexander Duyck
>Sent: Tuesday, October 24, 2017 9:20 AM
>To: Greenwalt, Paul <paul.greenwalt@intel.com>
>Cc: intel-wired-lan <intel-wired-lan@lists.osuosl.org>
>Subject: Re: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
>
>On Mon, Oct 23, 2017 at 8:21 AM, Paul Greenwalt
><paul.greenwalt@intel.com> wrote:
>> Add bounds check for index fcoe_i of rx_ring array.
>>
>> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
>> ---
>>  drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>> index a23c2b5..5772fe2 100644
>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>> @@ -698,6 +698,8 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter
>*adapter)
>>                 }
>>
>>                 fcoe_i = fcoe->offset + (i % fcoe->indices);
>> +               if (fcoe_i >= MAX_RX_QUEUES)
>> +                       fcoe_i = MAX_RX_QUEUES - 1;
>
>Instead of using MAX_RX_QUEUES why use fcoe->limit? If I am not
>mistake the upper limit is either 8 or 32 for the FCoE redirection
>table anyway so odds are you can't even use 64 queues if you wanted
>to. From what I can tell the only advantage of the approach you are
>using now is that you don't potentially zero out the value when it
>gets hit with the mask below.
>
>>                 fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;

Actually the check is added to protect from accessing rx_ring[fcoe_i] beyond 
it's boundaries. The above line was supposed to be removed. This is because
IXGBE_FCRETA_ENTRY_MASK = 0x7f, and static checkers report possible out of
bounds issue.

Thanks,
Emil
Alexander Duyck Oct. 24, 2017, 6:49 p.m. UTC | #3
On Tue, Oct 24, 2017 at 10:44 AM, Tantilov, Emil S
<emil.s.tantilov@intel.com> wrote:
>>-----Original Message-----
>>From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
>>Behalf Of Alexander Duyck
>>Sent: Tuesday, October 24, 2017 9:20 AM
>>To: Greenwalt, Paul <paul.greenwalt@intel.com>
>>Cc: intel-wired-lan <intel-wired-lan@lists.osuosl.org>
>>Subject: Re: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
>>
>>On Mon, Oct 23, 2017 at 8:21 AM, Paul Greenwalt
>><paul.greenwalt@intel.com> wrote:
>>> Add bounds check for index fcoe_i of rx_ring array.
>>>
>>> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
>>> ---
>>>  drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
>>>  1 file changed, 2 insertions(+)
>>>
>>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>> index a23c2b5..5772fe2 100644
>>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>> @@ -698,6 +698,8 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter
>>*adapter)
>>>                 }
>>>
>>>                 fcoe_i = fcoe->offset + (i % fcoe->indices);
>>> +               if (fcoe_i >= MAX_RX_QUEUES)
>>> +                       fcoe_i = MAX_RX_QUEUES - 1;
>>
>>Instead of using MAX_RX_QUEUES why use fcoe->limit? If I am not
>>mistake the upper limit is either 8 or 32 for the FCoE redirection
>>table anyway so odds are you can't even use 64 queues if you wanted
>>to. From what I can tell the only advantage of the approach you are
>>using now is that you don't potentially zero out the value when it
>>gets hit with the mask below.
>>
>>>                 fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
>
> Actually the check is added to protect from accessing rx_ring[fcoe_i] beyond
> it's boundaries. The above line was supposed to be removed. This is because
> IXGBE_FCRETA_ENTRY_MASK = 0x7f, and static checkers report possible out of
> bounds issue.
>
> Thanks,
> Emil

So is this actually fixing a bug, or just making some static analysis
tool happy? If it is about a static analysis tool I would stay just
identify it as a false hit since this value should be configured and
limited by the code in ixgbe_lib.c that is configuring the offset and
indices.

Thanks.

- Alex
Tantilov, Emil S Oct. 24, 2017, 7:48 p.m. UTC | #4
>-----Original Message-----
>From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
>Behalf Of Alexander Duyck
>Sent: Tuesday, October 24, 2017 11:49 AM
>To: Tantilov, Emil S <emil.s.tantilov@intel.com>
>Cc: intel-wired-lan <intel-wired-lan@lists.osuosl.org>
>Subject: Re: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
>
>On Tue, Oct 24, 2017 at 10:44 AM, Tantilov, Emil S
><emil.s.tantilov@intel.com> wrote:
>>>-----Original Message-----
>>>From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
>>>Behalf Of Alexander Duyck
>>>Sent: Tuesday, October 24, 2017 9:20 AM
>>>To: Greenwalt, Paul <paul.greenwalt@intel.com>
>>>Cc: intel-wired-lan <intel-wired-lan@lists.osuosl.org>
>>>Subject: Re: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
>>>
>>>On Mon, Oct 23, 2017 at 8:21 AM, Paul Greenwalt
>>><paul.greenwalt@intel.com> wrote:
>>>> Add bounds check for index fcoe_i of rx_ring array.
>>>>
>>>> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
>>>> ---
>>>>  drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
>>>>  1 file changed, 2 insertions(+)
>>>>
>>>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>> index a23c2b5..5772fe2 100644
>>>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>> @@ -698,6 +698,8 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter
>>>*adapter)
>>>>                 }
>>>>
>>>>                 fcoe_i = fcoe->offset + (i % fcoe->indices);
>>>> +               if (fcoe_i >= MAX_RX_QUEUES)
>>>> +                       fcoe_i = MAX_RX_QUEUES - 1;
>>>
>>>Instead of using MAX_RX_QUEUES why use fcoe->limit? If I am not
>>>mistake the upper limit is either 8 or 32 for the FCoE redirection
>>>table anyway so odds are you can't even use 64 queues if you wanted
>>>to. From what I can tell the only advantage of the approach you are
>>>using now is that you don't potentially zero out the value when it
>>>gets hit with the mask below.
>>>
>>>>                 fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
>>
>> Actually the check is added to protect from accessing rx_ring[fcoe_i]
>beyond
>> it's boundaries. The above line was supposed to be removed. This is
>because
>> IXGBE_FCRETA_ENTRY_MASK = 0x7f, and static checkers report possible
>out of
>> bounds issue.
>>
>> Thanks,
>> Emil
>
>So is this actually fixing a bug, or just making some static analysis
>tool happy? If it is about a static analysis tool I would stay just
>identify it as a false hit since this value should be configured and
>limited by the code in ixgbe_lib.c that is configuring the offset and
>indices.
It's a bit of both in my opinion since the line limiting the value of fcoe_i:

	fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;

Is clearly wrong since IXGBE_FCRETA_ENTRY_MASK exceeds MAX_RX_QUEUES.

Why even do this if we are sure that the limits are enforced in some other part
of the code?

Thanks,
Emil
Alexander Duyck Oct. 24, 2017, 8:02 p.m. UTC | #5
On Tue, Oct 24, 2017 at 12:48 PM, Tantilov, Emil S
<emil.s.tantilov@intel.com> wrote:
>>-----Original Message-----
>>From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
>>Behalf Of Alexander Duyck
>>Sent: Tuesday, October 24, 2017 11:49 AM
>>To: Tantilov, Emil S <emil.s.tantilov@intel.com>
>>Cc: intel-wired-lan <intel-wired-lan@lists.osuosl.org>
>>Subject: Re: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
>>
>>On Tue, Oct 24, 2017 at 10:44 AM, Tantilov, Emil S
>><emil.s.tantilov@intel.com> wrote:
>>>>-----Original Message-----
>>>>From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
>>>>Behalf Of Alexander Duyck
>>>>Sent: Tuesday, October 24, 2017 9:20 AM
>>>>To: Greenwalt, Paul <paul.greenwalt@intel.com>
>>>>Cc: intel-wired-lan <intel-wired-lan@lists.osuosl.org>
>>>>Subject: Re: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
>>>>
>>>>On Mon, Oct 23, 2017 at 8:21 AM, Paul Greenwalt
>>>><paul.greenwalt@intel.com> wrote:
>>>>> Add bounds check for index fcoe_i of rx_ring array.
>>>>>
>>>>> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
>>>>> ---
>>>>>  drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
>>>>>  1 file changed, 2 insertions(+)
>>>>>
>>>>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>>b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>>> index a23c2b5..5772fe2 100644
>>>>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
>>>>> @@ -698,6 +698,8 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter
>>>>*adapter)
>>>>>                 }
>>>>>
>>>>>                 fcoe_i = fcoe->offset + (i % fcoe->indices);
>>>>> +               if (fcoe_i >= MAX_RX_QUEUES)
>>>>> +                       fcoe_i = MAX_RX_QUEUES - 1;
>>>>
>>>>Instead of using MAX_RX_QUEUES why use fcoe->limit? If I am not
>>>>mistake the upper limit is either 8 or 32 for the FCoE redirection
>>>>table anyway so odds are you can't even use 64 queues if you wanted
>>>>to. From what I can tell the only advantage of the approach you are
>>>>using now is that you don't potentially zero out the value when it
>>>>gets hit with the mask below.
>>>>
>>>>>                 fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
>>>
>>> Actually the check is added to protect from accessing rx_ring[fcoe_i]
>>beyond
>>> it's boundaries. The above line was supposed to be removed. This is
>>because
>>> IXGBE_FCRETA_ENTRY_MASK = 0x7f, and static checkers report possible
>>out of
>>> bounds issue.
>>>
>>> Thanks,
>>> Emil
>>
>>So is this actually fixing a bug, or just making some static analysis
>>tool happy? If it is about a static analysis tool I would stay just
>>identify it as a false hit since this value should be configured and
>>limited by the code in ixgbe_lib.c that is configuring the offset and
>>indices.
> It's a bit of both in my opinion since the line limiting the value of fcoe_i:
>
>         fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
>
> Is clearly wrong since IXGBE_FCRETA_ENTRY_MASK exceeds MAX_RX_QUEUES.
>
> Why even do this if we are sure that the limits are enforced in some other part
> of the code?

That is a very good question. Odds are that line isn't the correct
solution for this either. The thing we need to mask is actually fcoe_q
which isn't defined until a few lines lower down.

We should probably just be making certain that fcoe->offset +
fcoe->indices cannot exceed the maximum ring size which I think we
already do. We would probably be better off handling/verifying this is
occuring in ixgbe_lib.c where we configure RING_F_FCOE.

- Alex
Bowers, AndrewX Oct. 25, 2017, 8:40 p.m. UTC | #6
> -----Original Message-----
> From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On
> Behalf Of Paul Greenwalt
> Sent: Monday, October 23, 2017 8:22 AM
> To: intel-wired-lan@lists.osuosl.org
> Subject: [Intel-wired-lan] [PATCH] ixgbe: add array bounds check
> 
> Add bounds check for index fcoe_i of rx_ring array.
> 
> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
> ---
>  drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c | 2 ++
>  1 file changed, 2 insertions(+)

Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
index a23c2b5..5772fe2 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
@@ -698,6 +698,8 @@  void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
 		}
 
 		fcoe_i = fcoe->offset + (i % fcoe->indices);
+		if (fcoe_i >= MAX_RX_QUEUES)
+			fcoe_i = MAX_RX_QUEUES - 1;
 		fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
 		fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx;
 		fcoe_q |= fcoe_q_h;