diff mbox series

[v3] net: bnxt_ptp: fix compilation error

Message ID 20220328062708.207079-1-damien.lemoal@opensource.wdc.com (mailing list archive)
State Accepted
Commit dcf500065fabe27676dfe7b4ba521a4f1e0fc8ac
Delegated to: Netdev Maintainers
Headers show
Series [v3] net: bnxt_ptp: fix compilation error | expand

Checks

Context Check Description
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1 this patch: 1
netdev/cc_maintainers fail 2 blamed authors not CCed: michael.chan@broadcom.com edwin.peer@broadcom.com; 2 maintainers not CCed: edwin.peer@broadcom.com michael.chan@broadcom.com
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 1 this patch: 1
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 32 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Damien Le Moal March 28, 2022, 6:27 a.m. UTC
The Broadcom bnxt_ptp driver does not compile with GCC 11.2.2 when
CONFIG_WERROR is enabled. The following error is generated:

drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c: In function ‘bnxt_ptp_enable’:
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:400:43: error: array
subscript 255 is above array bounds of ‘struct pps_pin[4]’
[-Werror=array-bounds]
  400 |  ptp->pps_info.pins[pin_id].event = BNXT_PPS_EVENT_EXTERNAL;
      |  ~~~~~~~~~~~~~~~~~~^~~~~~~~
In file included from drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:20:
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h:75:24: note: while
referencing ‘pins’
   75 |         struct pps_pin pins[BNXT_MAX_TSIO_PINS];
      |                        ^~~~
cc1: all warnings being treated as errors

This is due to the function ptp_find_pin() returning a pin ID of -1 when
a valid pin is not found and this error never being checked.
Change the TSIO_PIN_VALID() function to also check that a pin ID is not
negative and use this macro in bnxt_ptp_enable() to check the result of
the calls to ptp_find_pin() to return an error early for invalid pins.
This fixes the compilation error.

Fixes: 9e518f25802c ("bnxt_en: 1PPS functions to configure TSIO pins")
Cc: <stable@vger.kernel.org>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
---
Changes from v2:
* Restore the improved check in TSIO_PIN_VALID() and use this macro to
  return an error early in bnxt_ptp_enable() in case of invalid pin ID.
Changes from v1:
* No need to change the TSIO_PIN_VALID() macro as pin_id is an unsigned
  value.

 drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 6 +++++-
 drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

Comments

Pavan Chebbi March 28, 2022, 6:38 a.m. UTC | #1
On Mon, Mar 28, 2022 at 11:57 AM Damien Le Moal
<damien.lemoal@opensource.wdc.com> wrote:
>
> The Broadcom bnxt_ptp driver does not compile with GCC 11.2.2 when
> CONFIG_WERROR is enabled. The following error is generated:
>
> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c: In function ‘bnxt_ptp_enable’:
> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:400:43: error: array
> subscript 255 is above array bounds of ‘struct pps_pin[4]’
> [-Werror=array-bounds]
>   400 |  ptp->pps_info.pins[pin_id].event = BNXT_PPS_EVENT_EXTERNAL;
>       |  ~~~~~~~~~~~~~~~~~~^~~~~~~~
> In file included from drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:20:
> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h:75:24: note: while
> referencing ‘pins’
>    75 |         struct pps_pin pins[BNXT_MAX_TSIO_PINS];
>       |                        ^~~~
> cc1: all warnings being treated as errors
>
> This is due to the function ptp_find_pin() returning a pin ID of -1 when
> a valid pin is not found and this error never being checked.
> Change the TSIO_PIN_VALID() function to also check that a pin ID is not
> negative and use this macro in bnxt_ptp_enable() to check the result of
> the calls to ptp_find_pin() to return an error early for invalid pins.
> This fixes the compilation error.
>
> Fixes: 9e518f25802c ("bnxt_en: 1PPS functions to configure TSIO pins")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> ---
> Changes from v2:
> * Restore the improved check in TSIO_PIN_VALID() and use this macro to
>   return an error early in bnxt_ptp_enable() in case of invalid pin ID.
> Changes from v1:
> * No need to change the TSIO_PIN_VALID() macro as pin_id is an unsigned
>   value.
>
>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 6 +++++-
>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 2 +-
>  2 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
> index a0b321a19361..9c2ad5e67a5d 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
> @@ -382,7 +382,7 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
>         struct bnxt_ptp_cfg *ptp = container_of(ptp_info, struct bnxt_ptp_cfg,
>                                                 ptp_info);
>         struct bnxt *bp = ptp->bp;
> -       u8 pin_id;
> +       int pin_id;
>         int rc;
>
>         switch (rq->type) {
> @@ -390,6 +390,8 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
>                 /* Configure an External PPS IN */
>                 pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS,
>                                       rq->extts.index);
> +               if (!TSIO_PIN_VALID(pin_id))
> +                       return -EOPNOTSUPP;

Thanks. Could we now remove this check from the function bnxt_ptp_cfg_pin() ?

>                 if (!on)
>                         break;
>                 rc = bnxt_ptp_cfg_pin(bp, pin_id, BNXT_PPS_PIN_PPS_IN);
> @@ -403,6 +405,8 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
>                 /* Configure a Periodic PPS OUT */
>                 pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT,
>                                       rq->perout.index);
> +               if (!TSIO_PIN_VALID(pin_id))
> +                       return -EOPNOTSUPP;
>                 if (!on)
>                         break;
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
> index 373baf45884b..530b9922608c 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
> @@ -31,7 +31,7 @@ struct pps_pin {
>         u8 state;
>  };
>
> -#define TSIO_PIN_VALID(pin) ((pin) < (BNXT_MAX_TSIO_PINS))
> +#define TSIO_PIN_VALID(pin) ((pin) >= 0 && (pin) < (BNXT_MAX_TSIO_PINS))
>
>  #define EVENT_DATA2_PPS_EVENT_TYPE(data2)                              \
>         ((data2) & ASYNC_EVENT_CMPL_PPS_TIMESTAMP_EVENT_DATA2_EVENT_TYPE)
> --
> 2.35.1
>
Damien Le Moal March 28, 2022, 7:01 a.m. UTC | #2
On 3/28/22 15:38, Pavan Chebbi wrote:
> On Mon, Mar 28, 2022 at 11:57 AM Damien Le Moal
> <damien.lemoal@opensource.wdc.com> wrote:
>>
>> The Broadcom bnxt_ptp driver does not compile with GCC 11.2.2 when
>> CONFIG_WERROR is enabled. The following error is generated:
>>
>> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c: In function ‘bnxt_ptp_enable’:
>> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:400:43: error: array
>> subscript 255 is above array bounds of ‘struct pps_pin[4]’
>> [-Werror=array-bounds]
>>   400 |  ptp->pps_info.pins[pin_id].event = BNXT_PPS_EVENT_EXTERNAL;
>>       |  ~~~~~~~~~~~~~~~~~~^~~~~~~~
>> In file included from drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:20:
>> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h:75:24: note: while
>> referencing ‘pins’
>>    75 |         struct pps_pin pins[BNXT_MAX_TSIO_PINS];
>>       |                        ^~~~
>> cc1: all warnings being treated as errors
>>
>> This is due to the function ptp_find_pin() returning a pin ID of -1 when
>> a valid pin is not found and this error never being checked.
>> Change the TSIO_PIN_VALID() function to also check that a pin ID is not
>> negative and use this macro in bnxt_ptp_enable() to check the result of
>> the calls to ptp_find_pin() to return an error early for invalid pins.
>> This fixes the compilation error.
>>
>> Fixes: 9e518f25802c ("bnxt_en: 1PPS functions to configure TSIO pins")
>> Cc: <stable@vger.kernel.org>
>> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
>> ---
>> Changes from v2:
>> * Restore the improved check in TSIO_PIN_VALID() and use this macro to
>>   return an error early in bnxt_ptp_enable() in case of invalid pin ID.
>> Changes from v1:
>> * No need to change the TSIO_PIN_VALID() macro as pin_id is an unsigned
>>   value.
>>
>>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 6 +++++-
>>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 2 +-
>>  2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
>> index a0b321a19361..9c2ad5e67a5d 100644
>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
>> @@ -382,7 +382,7 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
>>         struct bnxt_ptp_cfg *ptp = container_of(ptp_info, struct bnxt_ptp_cfg,
>>                                                 ptp_info);
>>         struct bnxt *bp = ptp->bp;
>> -       u8 pin_id;
>> +       int pin_id;
>>         int rc;
>>
>>         switch (rq->type) {
>> @@ -390,6 +390,8 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
>>                 /* Configure an External PPS IN */
>>                 pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS,
>>                                       rq->extts.index);
>> +               if (!TSIO_PIN_VALID(pin_id))
>> +                       return -EOPNOTSUPP;
> 
> Thanks. Could we now remove this check from the function bnxt_ptp_cfg_pin() ?

Having a quick glance at all the call sites, it looks like it would be OK.
But may be in a different patch ?

This patch is not actually fixing any real problem. It is only fixing gcc
not being able to detect that pin_id can never be with an invalid value
since bnxt_ptp_cfg_pin() would fail before pin_id is used in the
assignment in bnxt_ptp_enable().

Thoughts ?

> 
>>                 if (!on)
>>                         break;
>>                 rc = bnxt_ptp_cfg_pin(bp, pin_id, BNXT_PPS_PIN_PPS_IN);
>> @@ -403,6 +405,8 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
>>                 /* Configure a Periodic PPS OUT */
>>                 pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT,
>>                                       rq->perout.index);
>> +               if (!TSIO_PIN_VALID(pin_id))
>> +                       return -EOPNOTSUPP;
>>                 if (!on)
>>                         break;
>>
>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
>> index 373baf45884b..530b9922608c 100644
>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
>> @@ -31,7 +31,7 @@ struct pps_pin {
>>         u8 state;
>>  };
>>
>> -#define TSIO_PIN_VALID(pin) ((pin) < (BNXT_MAX_TSIO_PINS))
>> +#define TSIO_PIN_VALID(pin) ((pin) >= 0 && (pin) < (BNXT_MAX_TSIO_PINS))
>>
>>  #define EVENT_DATA2_PPS_EVENT_TYPE(data2)                              \
>>         ((data2) & ASYNC_EVENT_CMPL_PPS_TIMESTAMP_EVENT_DATA2_EVENT_TYPE)
>> --
>> 2.35.1
>>
Michael Chan March 28, 2022, 8:26 a.m. UTC | #3
On Mon, Mar 28, 2022 at 12:01 AM Damien Le Moal
<damien.lemoal@opensource.wdc.com> wrote:
>
> On 3/28/22 15:38, Pavan Chebbi wrote:
> > On Mon, Mar 28, 2022 at 11:57 AM Damien Le Moal
> > <damien.lemoal@opensource.wdc.com> wrote:
> >>
> >> The Broadcom bnxt_ptp driver does not compile with GCC 11.2.2 when
> >> CONFIG_WERROR is enabled. The following error is generated:
> >>
> >> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c: In function ‘bnxt_ptp_enable’:
> >> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:400:43: error: array
> >> subscript 255 is above array bounds of ‘struct pps_pin[4]’
> >> [-Werror=array-bounds]
> >>   400 |  ptp->pps_info.pins[pin_id].event = BNXT_PPS_EVENT_EXTERNAL;
> >>       |  ~~~~~~~~~~~~~~~~~~^~~~~~~~
> >> In file included from drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:20:
> >> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h:75:24: note: while
> >> referencing ‘pins’
> >>    75 |         struct pps_pin pins[BNXT_MAX_TSIO_PINS];
> >>       |                        ^~~~
> >> cc1: all warnings being treated as errors
> >>
> >> This is due to the function ptp_find_pin() returning a pin ID of -1 when
> >> a valid pin is not found and this error never being checked.
> >> Change the TSIO_PIN_VALID() function to also check that a pin ID is not
> >> negative and use this macro in bnxt_ptp_enable() to check the result of
> >> the calls to ptp_find_pin() to return an error early for invalid pins.
> >> This fixes the compilation error.
> >>
> >> Fixes: 9e518f25802c ("bnxt_en: 1PPS functions to configure TSIO pins")
> >> Cc: <stable@vger.kernel.org>
> >> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
> >> ---
> >> Changes from v2:
> >> * Restore the improved check in TSIO_PIN_VALID() and use this macro to
> >>   return an error early in bnxt_ptp_enable() in case of invalid pin ID.
> >> Changes from v1:
> >> * No need to change the TSIO_PIN_VALID() macro as pin_id is an unsigned
> >>   value.
> >>
> >>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 6 +++++-
> >>  drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 2 +-
> >>  2 files changed, 6 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
> >> index a0b321a19361..9c2ad5e67a5d 100644
> >> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
> >> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
> >> @@ -382,7 +382,7 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
> >>         struct bnxt_ptp_cfg *ptp = container_of(ptp_info, struct bnxt_ptp_cfg,
> >>                                                 ptp_info);
> >>         struct bnxt *bp = ptp->bp;
> >> -       u8 pin_id;
> >> +       int pin_id;
> >>         int rc;
> >>
> >>         switch (rq->type) {
> >> @@ -390,6 +390,8 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
> >>                 /* Configure an External PPS IN */
> >>                 pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS,
> >>                                       rq->extts.index);
> >> +               if (!TSIO_PIN_VALID(pin_id))
> >> +                       return -EOPNOTSUPP;
> >
> > Thanks. Could we now remove this check from the function bnxt_ptp_cfg_pin() ?
>
> Having a quick glance at all the call sites, it looks like it would be OK.
> But may be in a different patch ?
>

Yes, we can improve it later in a separate patch.  Thanks.

Reviewed-by: Michael Chan <michael.chan@broadcom.com>
patchwork-bot+netdevbpf@kernel.org March 28, 2022, 8:40 p.m. UTC | #4
Hello:

This patch was applied to netdev/net.git (master)
by Jakub Kicinski <kuba@kernel.org>:

On Mon, 28 Mar 2022 15:27:08 +0900 you wrote:
> The Broadcom bnxt_ptp driver does not compile with GCC 11.2.2 when
> CONFIG_WERROR is enabled. The following error is generated:
> 
> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c: In function ‘bnxt_ptp_enable’:
> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:400:43: error: array
> subscript 255 is above array bounds of ‘struct pps_pin[4]’
> [-Werror=array-bounds]
>   400 |  ptp->pps_info.pins[pin_id].event = BNXT_PPS_EVENT_EXTERNAL;
>       |  ~~~~~~~~~~~~~~~~~~^~~~~~~~
> In file included from drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c:20:
> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h:75:24: note: while
> referencing ‘pins’
>    75 |         struct pps_pin pins[BNXT_MAX_TSIO_PINS];
>       |                        ^~~~
> cc1: all warnings being treated as errors
> 
> [...]

Here is the summary with links:
  - [v3] net: bnxt_ptp: fix compilation error
    https://git.kernel.org/netdev/net/c/dcf500065fab

You are awesome, thank you!
diff mbox series

Patch

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
index a0b321a19361..9c2ad5e67a5d 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
@@ -382,7 +382,7 @@  static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
 	struct bnxt_ptp_cfg *ptp = container_of(ptp_info, struct bnxt_ptp_cfg,
 						ptp_info);
 	struct bnxt *bp = ptp->bp;
-	u8 pin_id;
+	int pin_id;
 	int rc;
 
 	switch (rq->type) {
@@ -390,6 +390,8 @@  static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
 		/* Configure an External PPS IN */
 		pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS,
 				      rq->extts.index);
+		if (!TSIO_PIN_VALID(pin_id))
+			return -EOPNOTSUPP;
 		if (!on)
 			break;
 		rc = bnxt_ptp_cfg_pin(bp, pin_id, BNXT_PPS_PIN_PPS_IN);
@@ -403,6 +405,8 @@  static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
 		/* Configure a Periodic PPS OUT */
 		pin_id = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT,
 				      rq->perout.index);
+		if (!TSIO_PIN_VALID(pin_id))
+			return -EOPNOTSUPP;
 		if (!on)
 			break;
 
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
index 373baf45884b..530b9922608c 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
@@ -31,7 +31,7 @@  struct pps_pin {
 	u8 state;
 };
 
-#define TSIO_PIN_VALID(pin) ((pin) < (BNXT_MAX_TSIO_PINS))
+#define TSIO_PIN_VALID(pin) ((pin) >= 0 && (pin) < (BNXT_MAX_TSIO_PINS))
 
 #define EVENT_DATA2_PPS_EVENT_TYPE(data2)				\
 	((data2) & ASYNC_EVENT_CMPL_PPS_TIMESTAMP_EVENT_DATA2_EVENT_TYPE)