* [PATCH 0/2][next] scsi: qla2xxx: Replace one-element array with flexible-array member
@ 2022-11-18 23:46 Gustavo A. R. Silva
2022-11-18 23:47 ` [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper Gustavo A. R. Silva
2022-11-18 23:47 ` [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp Gustavo A. R. Silva
0 siblings, 2 replies; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-18 23:46 UTC (permalink / raw)
To: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali
Cc: linux-scsi, linux-kernel, Gustavo A. R. Silva, linux-hardening
Hi!
This series aims to replace a one-element array with flexible-array
member in drivers/scsi/qla2xxx/qla_def.h through the use of the
DECLARE_FLEX_ARRAY() helper.
This helps with the ongoing efforts to tighten the FORTIFY_SOURCE
routines on memcpy() and help us make progress towards globally
enabling -fstrict-flex-arrays=3 [1].
Link: https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
Link: https://github.com/KSPP/linux/issues/79
Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1]
Gustavo A. R. Silva (2):
scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY()
helper
scsi: qla2xxx: Use struct_size() in code related to struct
ct_sns_gpnft_rsp
drivers/scsi/qla2xxx/qla_def.h | 4 ++--
drivers/scsi/qla2xxx/qla_gs.c | 5 ++---
2 files changed, 4 insertions(+), 5 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper
2022-11-18 23:46 [PATCH 0/2][next] scsi: qla2xxx: Replace one-element array with flexible-array member Gustavo A. R. Silva
@ 2022-11-18 23:47 ` Gustavo A. R. Silva
2022-11-19 7:09 ` Kees Cook
2022-11-19 8:44 ` Christophe JAILLET
2022-11-18 23:47 ` [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp Gustavo A. R. Silva
1 sibling, 2 replies; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-18 23:47 UTC (permalink / raw)
To: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali
Cc: linux-scsi, linux-kernel, Gustavo A. R. Silva, linux-hardening
One-element arrays as fake flex arrays are deprecated and we are moving
towards adopting C99 flexible-array members, instead. So, replace
one-element array declaration in struct ct_sns_gpnft_rsp, which is
ultimately being used inside a union:
drivers/scsi/qla2xxx/qla_def.h:
3240 struct ct_sns_gpnft_pkt {
3241 union {
3242 struct ct_sns_req req;
3243 struct ct_sns_gpnft_rsp rsp;
3244 } p;
3245 };
Important to mention is that doing a build before/after this patch results
in no binary differences.
This help us make progress towards globally enabling
-fstrict-flex-arrays=3 [1].
Link: https://github.com/KSPP/linux/issues/245
Link: https://github.com/KSPP/linux/issues/193
Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1]
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
---
drivers/scsi/qla2xxx/qla_def.h | 4 ++--
drivers/scsi/qla2xxx/qla_gs.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index a26a373be9da..1eea977ef426 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3151,12 +3151,12 @@ struct ct_sns_gpnft_rsp {
uint8_t vendor_unique;
};
/* Assume the largest number of targets for the union */
- struct ct_sns_gpn_ft_data {
+ DECLARE_FLEX_ARRAY(struct ct_sns_gpn_ft_data {
u8 control_byte;
u8 port_id[3];
u32 reserved;
u8 port_name[8];
- } entries[1];
+ }, entries);
};
/* CT command response */
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 64ab070b8716..69d3bc795f90 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -4073,7 +4073,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
rspsz = sizeof(struct ct_sns_gpnft_rsp) +
- ((vha->hw->max_fibre_devices - 1) *
+ (vha->hw->max_fibre_devices *
sizeof(struct ct_sns_gpn_ft_data));
sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp
2022-11-18 23:46 [PATCH 0/2][next] scsi: qla2xxx: Replace one-element array with flexible-array member Gustavo A. R. Silva
2022-11-18 23:47 ` [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper Gustavo A. R. Silva
@ 2022-11-18 23:47 ` Gustavo A. R. Silva
2022-11-19 7:10 ` Kees Cook
1 sibling, 1 reply; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-18 23:47 UTC (permalink / raw)
To: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali
Cc: linux-scsi, linux-kernel, Gustavo A. R. Silva, linux-hardening
Prefer struct_size() over open-coded versions of idiom:
sizeof(struct-with-flex-array) + sizeof(typeof-flex-array-elements) * count
where count is the max number of items the flexible array is supposed to
contain.
Link: https://github.com/KSPP/linux/issues/160
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
---
drivers/scsi/qla2xxx/qla_gs.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 69d3bc795f90..27e1df56b0fb 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -4072,9 +4072,8 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
}
sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
- rspsz = sizeof(struct ct_sns_gpnft_rsp) +
- (vha->hw->max_fibre_devices *
- sizeof(struct ct_sns_gpn_ft_data));
+ rspsz = struct_size((struct ct_sns_gpnft_rsp *)0, entries,
+ vha->hw->max_fibre_devices);
sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
rspsz,
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper
2022-11-18 23:47 ` [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper Gustavo A. R. Silva
@ 2022-11-19 7:09 ` Kees Cook
2022-11-19 8:44 ` Christophe JAILLET
1 sibling, 0 replies; 11+ messages in thread
From: Kees Cook @ 2022-11-19 7:09 UTC (permalink / raw)
To: Gustavo A. R. Silva
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
On Fri, Nov 18, 2022 at 05:47:13PM -0600, Gustavo A. R. Silva wrote:
> One-element arrays as fake flex arrays are deprecated and we are moving
> towards adopting C99 flexible-array members, instead. So, replace
> one-element array declaration in struct ct_sns_gpnft_rsp, which is
> ultimately being used inside a union:
>
> drivers/scsi/qla2xxx/qla_def.h:
> 3240 struct ct_sns_gpnft_pkt {
> 3241 union {
> 3242 struct ct_sns_req req;
> 3243 struct ct_sns_gpnft_rsp rsp;
> 3244 } p;
> 3245 };
>
> Important to mention is that doing a build before/after this patch results
> in no binary differences.
>
> This help us make progress towards globally enabling
> -fstrict-flex-arrays=3 [1].
>
> Link: https://github.com/KSPP/linux/issues/245
> Link: https://github.com/KSPP/linux/issues/193
> Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1]
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
--
Kees Cook
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp
2022-11-18 23:47 ` [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp Gustavo A. R. Silva
@ 2022-11-19 7:10 ` Kees Cook
2022-11-19 7:20 ` Gustavo A. R. Silva
0 siblings, 1 reply; 11+ messages in thread
From: Kees Cook @ 2022-11-19 7:10 UTC (permalink / raw)
To: Gustavo A. R. Silva
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
On Fri, Nov 18, 2022 at 05:47:56PM -0600, Gustavo A. R. Silva wrote:
> Prefer struct_size() over open-coded versions of idiom:
>
> sizeof(struct-with-flex-array) + sizeof(typeof-flex-array-elements) * count
>
> where count is the max number of items the flexible array is supposed to
> contain.
>
> Link: https://github.com/KSPP/linux/issues/160
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> ---
> drivers/scsi/qla2xxx/qla_gs.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> index 69d3bc795f90..27e1df56b0fb 100644
> --- a/drivers/scsi/qla2xxx/qla_gs.c
> +++ b/drivers/scsi/qla2xxx/qla_gs.c
> @@ -4072,9 +4072,8 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
> }
> sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
>
> - rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> - (vha->hw->max_fibre_devices *
> - sizeof(struct ct_sns_gpn_ft_data));
> + rspsz = struct_size((struct ct_sns_gpnft_rsp *)0, entries,
> + vha->hw->max_fibre_devices);
This should be able to use sp->u.iocb_cmd.u.ctarg.rsp instead of the
explicit struct with a NULL. (It's just using typeof() internally, so
it's okay that it isn't allocated yet.)
-Kees
>
> sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
> rspsz,
> --
> 2.34.1
>
--
Kees Cook
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp
2022-11-19 7:10 ` Kees Cook
@ 2022-11-19 7:20 ` Gustavo A. R. Silva
2022-11-19 7:49 ` Gustavo A. R. Silva
0 siblings, 1 reply; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-19 7:20 UTC (permalink / raw)
To: Kees Cook
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
On Fri, Nov 18, 2022 at 11:10:44PM -0800, Kees Cook wrote:
> On Fri, Nov 18, 2022 at 05:47:56PM -0600, Gustavo A. R. Silva wrote:
> > Prefer struct_size() over open-coded versions of idiom:
> >
> > sizeof(struct-with-flex-array) + sizeof(typeof-flex-array-elements) * count
> >
> > where count is the max number of items the flexible array is supposed to
> > contain.
> >
> > Link: https://github.com/KSPP/linux/issues/160
> > Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> > ---
> > drivers/scsi/qla2xxx/qla_gs.c | 5 ++---
> > 1 file changed, 2 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> > index 69d3bc795f90..27e1df56b0fb 100644
> > --- a/drivers/scsi/qla2xxx/qla_gs.c
> > +++ b/drivers/scsi/qla2xxx/qla_gs.c
> > @@ -4072,9 +4072,8 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
> > }
> > sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
> >
> > - rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> > - (vha->hw->max_fibre_devices *
> > - sizeof(struct ct_sns_gpn_ft_data));
> > + rspsz = struct_size((struct ct_sns_gpnft_rsp *)0, entries,
> > + vha->hw->max_fibre_devices);
>
> This should be able to use sp->u.iocb_cmd.u.ctarg.rsp instead of the
> explicit struct with a NULL. (It's just using typeof() internally, so
> it's okay that it isn't allocated yet.)
mmh... yeah; and considering they're already going all the way down to
sp->u.iocb_cmd.u.ctarg.req_size, I think accessing sp->u.iocb_cmd.u.ctarg.rsp
is perfectly fine. :)
I'll respin. Thanks for the feedback!
--
Gustavo
>
> -Kees
>
> >
> > sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
> > rspsz,
> > --
> > 2.34.1
> >
>
> --
> Kees Cook
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp
2022-11-19 7:20 ` Gustavo A. R. Silva
@ 2022-11-19 7:49 ` Gustavo A. R. Silva
0 siblings, 0 replies; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-19 7:49 UTC (permalink / raw)
To: Kees Cook
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
On Sat, Nov 19, 2022 at 01:20:09AM -0600, Gustavo A. R. Silva wrote:
> On Fri, Nov 18, 2022 at 11:10:44PM -0800, Kees Cook wrote:
> > On Fri, Nov 18, 2022 at 05:47:56PM -0600, Gustavo A. R. Silva wrote:
> > > Prefer struct_size() over open-coded versions of idiom:
> > >
> > > sizeof(struct-with-flex-array) + sizeof(typeof-flex-array-elements) * count
> > >
> > > where count is the max number of items the flexible array is supposed to
> > > contain.
> > >
> > > Link: https://github.com/KSPP/linux/issues/160
> > > Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> > > ---
> > > drivers/scsi/qla2xxx/qla_gs.c | 5 ++---
> > > 1 file changed, 2 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> > > index 69d3bc795f90..27e1df56b0fb 100644
> > > --- a/drivers/scsi/qla2xxx/qla_gs.c
> > > +++ b/drivers/scsi/qla2xxx/qla_gs.c
> > > @@ -4072,9 +4072,8 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
> > > }
> > > sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
> > >
> > > - rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> > > - (vha->hw->max_fibre_devices *
> > > - sizeof(struct ct_sns_gpn_ft_data));
> > > + rspsz = struct_size((struct ct_sns_gpnft_rsp *)0, entries,
> > > + vha->hw->max_fibre_devices);
> >
> > This should be able to use sp->u.iocb_cmd.u.ctarg.rsp instead of the
> > explicit struct with a NULL. (It's just using typeof() internally, so
> > it's okay that it isn't allocated yet.)
>
> mmh... yeah; and considering they're already going all the way down to
> sp->u.iocb_cmd.u.ctarg.req_size, I think accessing sp->u.iocb_cmd.u.ctarg.rsp
> is perfectly fine. :)
except that... it seems sp->u.iocb_cmd.u.ctarg.rsp is a pointer to void
and not a struct of type struct ct_sns_gpnft_rsp. :O
drivers/scsi/qla2xxx/qla_def.h:474:
struct ct_arg {
void *iocb;
u16 nport_handle;
dma_addr_t req_dma;
dma_addr_t rsp_dma;
u32 req_size;
u32 rsp_size;
u32 req_allocated_size;
u32 rsp_allocated_size;
void *req;
void *rsp;
port_id_t id;
};
I wonder if you wanted to point out something entirely different...?
--
Gustavo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper
2022-11-18 23:47 ` [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper Gustavo A. R. Silva
2022-11-19 7:09 ` Kees Cook
@ 2022-11-19 8:44 ` Christophe JAILLET
2022-11-19 8:56 ` Gustavo A. R. Silva
1 sibling, 1 reply; 11+ messages in thread
From: Christophe JAILLET @ 2022-11-19 8:44 UTC (permalink / raw)
To: Gustavo A. R. Silva, Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali
Cc: linux-scsi, linux-kernel, linux-hardening
Le 19/11/2022 à 00:47, Gustavo A. R. Silva a écrit :
> One-element arrays as fake flex arrays are deprecated and we are moving
> towards adopting C99 flexible-array members, instead. So, replace
> one-element array declaration in struct ct_sns_gpnft_rsp, which is
> ultimately being used inside a union:
>
> drivers/scsi/qla2xxx/qla_def.h:
> 3240 struct ct_sns_gpnft_pkt {
> 3241 union {
> 3242 struct ct_sns_req req;
> 3243 struct ct_sns_gpnft_rsp rsp;
> 3244 } p;
> 3245 };
>
> Important to mention is that doing a build before/after this patch results
> in no binary differences.
Hi,
even with the:
> rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> - ((vha->hw->max_fibre_devices - 1) *
> + (vha->hw->max_fibre_devices *
> sizeof(struct ct_sns_gpn_ft_data));
change ?
CJ
>
> This help us make progress towards globally enabling
> -fstrict-flex-arrays=3 [1].
>
> Link: https://github.com/KSPP/linux/issues/245
> Link: https://github.com/KSPP/linux/issues/193
> Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1]
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> ---
> drivers/scsi/qla2xxx/qla_def.h | 4 ++--
> drivers/scsi/qla2xxx/qla_gs.c | 2 +-
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
> index a26a373be9da..1eea977ef426 100644
> --- a/drivers/scsi/qla2xxx/qla_def.h
> +++ b/drivers/scsi/qla2xxx/qla_def.h
> @@ -3151,12 +3151,12 @@ struct ct_sns_gpnft_rsp {
> uint8_t vendor_unique;
> };
> /* Assume the largest number of targets for the union */
> - struct ct_sns_gpn_ft_data {
> + DECLARE_FLEX_ARRAY(struct ct_sns_gpn_ft_data {
> u8 control_byte;
> u8 port_id[3];
> u32 reserved;
> u8 port_name[8];
> - } entries[1];
> + }, entries);
> };
>
> /* CT command response */
> diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> index 64ab070b8716..69d3bc795f90 100644
> --- a/drivers/scsi/qla2xxx/qla_gs.c
> +++ b/drivers/scsi/qla2xxx/qla_gs.c
> @@ -4073,7 +4073,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
> sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
>
> rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> - ((vha->hw->max_fibre_devices - 1) *
> + (vha->hw->max_fibre_devices *
> sizeof(struct ct_sns_gpn_ft_data));
>
> sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper
2022-11-19 8:44 ` Christophe JAILLET
@ 2022-11-19 8:56 ` Gustavo A. R. Silva
2022-11-19 10:23 ` Christophe JAILLET
0 siblings, 1 reply; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-19 8:56 UTC (permalink / raw)
To: Christophe JAILLET
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
On Sat, Nov 19, 2022 at 09:44:02AM +0100, Christophe JAILLET wrote:
> Le 19/11/2022 à 00:47, Gustavo A. R. Silva a écrit :
> > One-element arrays as fake flex arrays are deprecated and we are moving
> > towards adopting C99 flexible-array members, instead. So, replace
> > one-element array declaration in struct ct_sns_gpnft_rsp, which is
> > ultimately being used inside a union:
> >
> > drivers/scsi/qla2xxx/qla_def.h:
> > 3240 struct ct_sns_gpnft_pkt {
> > 3241 union {
> > 3242 struct ct_sns_req req;
> > 3243 struct ct_sns_gpnft_rsp rsp;
> > 3244 } p;
> > 3245 };
> >
> > Important to mention is that doing a build before/after this patch results
> > in no binary differences.
>
> Hi,
>
> even with the:
>
> > rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> > - ((vha->hw->max_fibre_devices - 1) *
> > + (vha->hw->max_fibre_devices *
> > sizeof(struct ct_sns_gpn_ft_data));
>
> change ?
Yep; that change compensates for the removal of the 1 in the declaration
of entries[].
The above piece of code is a common idiom to calculate the size for an
allocation when a one-element array is involved. In the original code
(vha->hw->max_fibre_devices - 1) compensates for the _extra_ size of one
element of type struct ct_sns_gpn_ft_data in sizeof(struct ct_sns_gpnft_rsp).
--
Gustavo
>
> CJ
>
> >
> > This help us make progress towards globally enabling
> > -fstrict-flex-arrays=3 [1].
> >
> > Link: https://github.com/KSPP/linux/issues/245
> > Link: https://github.com/KSPP/linux/issues/193
> > Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1]
> > Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> > ---
> > drivers/scsi/qla2xxx/qla_def.h | 4 ++--
> > drivers/scsi/qla2xxx/qla_gs.c | 2 +-
> > 2 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
> > index a26a373be9da..1eea977ef426 100644
> > --- a/drivers/scsi/qla2xxx/qla_def.h
> > +++ b/drivers/scsi/qla2xxx/qla_def.h
> > @@ -3151,12 +3151,12 @@ struct ct_sns_gpnft_rsp {
> > uint8_t vendor_unique;
> > };
> > /* Assume the largest number of targets for the union */
> > - struct ct_sns_gpn_ft_data {
> > + DECLARE_FLEX_ARRAY(struct ct_sns_gpn_ft_data {
> > u8 control_byte;
> > u8 port_id[3];
> > u32 reserved;
> > u8 port_name[8];
> > - } entries[1];
> > + }, entries);
> > };
> > /* CT command response */
> > diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> > index 64ab070b8716..69d3bc795f90 100644
> > --- a/drivers/scsi/qla2xxx/qla_gs.c
> > +++ b/drivers/scsi/qla2xxx/qla_gs.c
> > @@ -4073,7 +4073,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
> > sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
> > rspsz = sizeof(struct ct_sns_gpnft_rsp) +
> > - ((vha->hw->max_fibre_devices - 1) *
> > + (vha->hw->max_fibre_devices *
> > sizeof(struct ct_sns_gpn_ft_data));
> > sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper
2022-11-19 8:56 ` Gustavo A. R. Silva
@ 2022-11-19 10:23 ` Christophe JAILLET
2022-11-19 19:03 ` Gustavo A. R. Silva
0 siblings, 1 reply; 11+ messages in thread
From: Christophe JAILLET @ 2022-11-19 10:23 UTC (permalink / raw)
To: Gustavo A. R. Silva
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
Le 19/11/2022 à 09:56, Gustavo A. R. Silva a écrit :
> On Sat, Nov 19, 2022 at 09:44:02AM +0100, Christophe JAILLET wrote:
>> Le 19/11/2022 à 00:47, Gustavo A. R. Silva a écrit :
>>> One-element arrays as fake flex arrays are deprecated and we are moving
>>> towards adopting C99 flexible-array members, instead. So, replace
>>> one-element array declaration in struct ct_sns_gpnft_rsp, which is
>>> ultimately being used inside a union:
>>>
>>> drivers/scsi/qla2xxx/qla_def.h:
>>> 3240 struct ct_sns_gpnft_pkt {
>>> 3241 union {
>>> 3242 struct ct_sns_req req;
>>> 3243 struct ct_sns_gpnft_rsp rsp;
>>> 3244 } p;
>>> 3245 };
>>>
>>> Important to mention is that doing a build before/after this patch results
>>> in no binary differences.
>>
>> Hi,
>>
>> even with the:
>>
>>> rspsz = sizeof(struct ct_sns_gpnft_rsp) +
>>> - ((vha->hw->max_fibre_devices - 1) *
>>> + (vha->hw->max_fibre_devices *
>>> sizeof(struct ct_sns_gpn_ft_data));
>>
>> change ?
>
> Yep; that change compensates for the removal of the 1 in the declaration
> of entries[].
>
> The above piece of code is a common idiom to calculate the size for an
> allocation when a one-element array is involved. In the original code
> (vha->hw->max_fibre_devices - 1) compensates for the _extra_ size of one
> element of type struct ct_sns_gpn_ft_data in sizeof(struct ct_sns_gpnft_rsp).
>
Yes, I do agree, that the code is equivalent. I was surprised that a
compiler was smart enough to generate the same binary code.
With gcc 11.3.0 (x86_64), I do get some differences when I do:
make drivers/scsi/qla2xxx/qla_gs.o
objdump -D drivers/scsi/qla2xxx/qla_gs.o > before.asm
patch -p1 < patch.diff
make drivers/scsi/qla2xxx/qla_gs.o
objdump -D drivers/scsi/qla2xxx/qla_gs.o > after.asm
diff -u before.asm after.asm
Mostly some slight ordering of instruction changes, but the binary are
not the same.
CJ
> --
> Gustavo
>
>>
>> CJ
>>
>>>
>>> This help us make progress towards globally enabling
>>> -fstrict-flex-arrays=3 [1].
>>>
>>> Link: https://github.com/KSPP/linux/issues/245
>>> Link: https://github.com/KSPP/linux/issues/193
>>> Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1]
>>> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
>>> ---
>>> drivers/scsi/qla2xxx/qla_def.h | 4 ++--
>>> drivers/scsi/qla2xxx/qla_gs.c | 2 +-
>>> 2 files changed, 3 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
>>> index a26a373be9da..1eea977ef426 100644
>>> --- a/drivers/scsi/qla2xxx/qla_def.h
>>> +++ b/drivers/scsi/qla2xxx/qla_def.h
>>> @@ -3151,12 +3151,12 @@ struct ct_sns_gpnft_rsp {
>>> uint8_t vendor_unique;
>>> };
>>> /* Assume the largest number of targets for the union */
>>> - struct ct_sns_gpn_ft_data {
>>> + DECLARE_FLEX_ARRAY(struct ct_sns_gpn_ft_data {
>>> u8 control_byte;
>>> u8 port_id[3];
>>> u32 reserved;
>>> u8 port_name[8];
>>> - } entries[1];
>>> + }, entries);
>>> };
>>> /* CT command response */
>>> diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
>>> index 64ab070b8716..69d3bc795f90 100644
>>> --- a/drivers/scsi/qla2xxx/qla_gs.c
>>> +++ b/drivers/scsi/qla2xxx/qla_gs.c
>>> @@ -4073,7 +4073,7 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
>>> sp->u.iocb_cmd.u.ctarg.req_size = GPN_FT_REQ_SIZE;
>>> rspsz = sizeof(struct ct_sns_gpnft_rsp) +
>>> - ((vha->hw->max_fibre_devices - 1) *
>>> + (vha->hw->max_fibre_devices *
>>> sizeof(struct ct_sns_gpn_ft_data));
>>> sp->u.iocb_cmd.u.ctarg.rsp = dma_alloc_coherent(&vha->hw->pdev->dev,
>>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper
2022-11-19 10:23 ` Christophe JAILLET
@ 2022-11-19 19:03 ` Gustavo A. R. Silva
0 siblings, 0 replies; 11+ messages in thread
From: Gustavo A. R. Silva @ 2022-11-19 19:03 UTC (permalink / raw)
To: Christophe JAILLET
Cc: Martin K. Petersen, James E.J. Bottomley,
GR-QLogic-Storage-Upstream, Nilesh Javali, linux-scsi,
linux-kernel, linux-hardening
> Yes, I do agree, that the code is equivalent. I was surprised that a
> compiler was smart enough to generate the same binary code.
We discard the tiny changes that don't affect the logic or the control
flow of the program.
--
Gustavo
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-11-19 19:03 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-18 23:46 [PATCH 0/2][next] scsi: qla2xxx: Replace one-element array with flexible-array member Gustavo A. R. Silva
2022-11-18 23:47 ` [PATCH 1/2][next] scsi: qla2xxx: Replace one-element array with DECLARE_FLEX_ARRAY() helper Gustavo A. R. Silva
2022-11-19 7:09 ` Kees Cook
2022-11-19 8:44 ` Christophe JAILLET
2022-11-19 8:56 ` Gustavo A. R. Silva
2022-11-19 10:23 ` Christophe JAILLET
2022-11-19 19:03 ` Gustavo A. R. Silva
2022-11-18 23:47 ` [PATCH 2/2][next] scsi: qla2xxx: Use struct_size() in code related to struct ct_sns_gpnft_rsp Gustavo A. R. Silva
2022-11-19 7:10 ` Kees Cook
2022-11-19 7:20 ` Gustavo A. R. Silva
2022-11-19 7:49 ` Gustavo A. R. Silva
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.