2023-01-05 23:28:14

by Kees Cook

[permalink] [raw]
Subject: [PATCH] RDMA/cxgb4: Replace 0-length arrays with flexible arrays

Zero-length arrays are deprecated[1]. Replace all remaining
0-length arrays with flexible arrays. Detected with GCC 13, using
-fstrict-flex-arrays=3:

In function 'build_rdma_write',
inlined from 'c4iw_post_send' at ../drivers/infiniband/hw/cxgb4/qp.c:1173:10:
../drivers/infiniband/hw/cxgb4/qp.c:597:38: warning: array subscript 0 is outside array bounds of 'struct fw_ri_immd[0]' [-Warray-bounds=]
597 | wqe->write.u.immd_src[0].r2 = 0;
| ~~~~~~~~~~~~~~~~~~~~~^~~
../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h: In function 'c4iw_post_send':
../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:567:35: note: while referencing 'immd_src'
567 | struct fw_ri_immd immd_src[0];
| ^~~~~~~~

Additionally drop the unused C99_NOT_SUPPORTED ifndef lines.

[1] https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays

Cc: Potnuri Bharat Teja <[email protected]>
Cc: Jason Gunthorpe <[email protected]>
Cc: Leon Romanovsky <[email protected]>
Cc: "Gustavo A. R. Silva" <[email protected]>
Cc: [email protected]
Signed-off-by: Kees Cook <[email protected]>
---
drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | 26 ++++++-----------------
1 file changed, 6 insertions(+), 20 deletions(-)

diff --git a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
index a2f5e29ef226..1f79537fc8d1 100644
--- a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
+++ b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
@@ -122,9 +122,7 @@ struct fw_ri_dsgl {
__be16 nsge;
__be32 len0;
__be64 addr0;
-#ifndef C99_NOT_SUPPORTED
struct fw_ri_dsge_pair sge[];
-#endif
};

struct fw_ri_sge {
@@ -138,9 +136,7 @@ struct fw_ri_isgl {
__u8 r1;
__be16 nsge;
__be32 r2;
-#ifndef C99_NOT_SUPPORTED
struct fw_ri_sge sge[];
-#endif
};

struct fw_ri_immd {
@@ -148,9 +144,7 @@ struct fw_ri_immd {
__u8 r1;
__be16 r2;
__be32 immdlen;
-#ifndef C99_NOT_SUPPORTED
__u8 data[];
-#endif
};

struct fw_ri_tpte {
@@ -320,9 +314,7 @@ struct fw_ri_res_wr {
__be32 op_nres;
__be32 len16_pkd;
__u64 cookie;
-#ifndef C99_NOT_SUPPORTED
struct fw_ri_res res[];
-#endif
};

#define FW_RI_RES_WR_NRES_S 0
@@ -562,12 +554,10 @@ struct fw_ri_rdma_write_wr {
__be32 plen;
__be32 stag_sink;
__be64 to_sink;
-#ifndef C99_NOT_SUPPORTED
union {
- struct fw_ri_immd immd_src[0];
- struct fw_ri_isgl isgl_src[0];
+ DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
+ DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
} u;
-#endif
};

struct fw_ri_send_wr {
@@ -581,12 +571,10 @@ struct fw_ri_send_wr {
__be32 plen;
__be32 r3;
__be64 r4;
-#ifndef C99_NOT_SUPPORTED
union {
- struct fw_ri_immd immd_src[0];
- struct fw_ri_isgl isgl_src[0];
+ DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
+ DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
} u;
-#endif
};

#define FW_RI_SEND_WR_SENDOP_S 0
@@ -618,12 +606,10 @@ struct fw_ri_rdma_write_cmpl_wr {
struct fw_ri_isgl isgl_src;
} u_cmpl;
__be64 r3;
-#ifndef C99_NOT_SUPPORTED
union fw_ri_write {
- struct fw_ri_immd immd_src[0];
- struct fw_ri_isgl isgl_src[0];
+ DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
+ DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
} u;
-#endif
};

struct fw_ri_rdma_read_wr {
--
2.34.1


2023-01-06 16:27:13

by Gustavo A. R. Silva

[permalink] [raw]
Subject: Re: [PATCH] RDMA/cxgb4: Replace 0-length arrays with flexible arrays

On Thu, Jan 05, 2023 at 02:32:32PM -0800, Kees Cook wrote:
> Zero-length arrays are deprecated[1]. Replace all remaining
> 0-length arrays with flexible arrays. Detected with GCC 13, using
> -fstrict-flex-arrays=3:
>
> In function 'build_rdma_write',
> inlined from 'c4iw_post_send' at ../drivers/infiniband/hw/cxgb4/qp.c:1173:10:
> ../drivers/infiniband/hw/cxgb4/qp.c:597:38: warning: array subscript 0 is outside array bounds of 'struct fw_ri_immd[0]' [-Warray-bounds=]
> 597 | wqe->write.u.immd_src[0].r2 = 0;
> | ~~~~~~~~~~~~~~~~~~~~~^~~
> ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h: In function 'c4iw_post_send':
> ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:567:35: note: while referencing 'immd_src'
> 567 | struct fw_ri_immd immd_src[0];
> | ^~~~~~~~
>
> Additionally drop the unused C99_NOT_SUPPORTED ifndef lines.
>
> [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays
>
> Cc: Potnuri Bharat Teja <[email protected]>
> Cc: Jason Gunthorpe <[email protected]>
> Cc: Leon Romanovsky <[email protected]>
> Cc: "Gustavo A. R. Silva" <[email protected]>
> Cc: [email protected]
> Signed-off-by: Kees Cook <[email protected]>

Reviewed-by: Gustavo A. R. Silva <[email protected]>

Thanks!
--
Gustavo

> ---
> drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | 26 ++++++-----------------
> 1 file changed, 6 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
> index a2f5e29ef226..1f79537fc8d1 100644
> --- a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
> +++ b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
> @@ -122,9 +122,7 @@ struct fw_ri_dsgl {
> __be16 nsge;
> __be32 len0;
> __be64 addr0;
> -#ifndef C99_NOT_SUPPORTED
> struct fw_ri_dsge_pair sge[];
> -#endif
> };
>
> struct fw_ri_sge {
> @@ -138,9 +136,7 @@ struct fw_ri_isgl {
> __u8 r1;
> __be16 nsge;
> __be32 r2;
> -#ifndef C99_NOT_SUPPORTED
> struct fw_ri_sge sge[];
> -#endif
> };
>
> struct fw_ri_immd {
> @@ -148,9 +144,7 @@ struct fw_ri_immd {
> __u8 r1;
> __be16 r2;
> __be32 immdlen;
> -#ifndef C99_NOT_SUPPORTED
> __u8 data[];
> -#endif
> };
>
> struct fw_ri_tpte {
> @@ -320,9 +314,7 @@ struct fw_ri_res_wr {
> __be32 op_nres;
> __be32 len16_pkd;
> __u64 cookie;
> -#ifndef C99_NOT_SUPPORTED
> struct fw_ri_res res[];
> -#endif
> };
>
> #define FW_RI_RES_WR_NRES_S 0
> @@ -562,12 +554,10 @@ struct fw_ri_rdma_write_wr {
> __be32 plen;
> __be32 stag_sink;
> __be64 to_sink;
> -#ifndef C99_NOT_SUPPORTED
> union {
> - struct fw_ri_immd immd_src[0];
> - struct fw_ri_isgl isgl_src[0];
> + DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
> + DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
> } u;
> -#endif
> };
>
> struct fw_ri_send_wr {
> @@ -581,12 +571,10 @@ struct fw_ri_send_wr {
> __be32 plen;
> __be32 r3;
> __be64 r4;
> -#ifndef C99_NOT_SUPPORTED
> union {
> - struct fw_ri_immd immd_src[0];
> - struct fw_ri_isgl isgl_src[0];
> + DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
> + DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
> } u;
> -#endif
> };
>
> #define FW_RI_SEND_WR_SENDOP_S 0
> @@ -618,12 +606,10 @@ struct fw_ri_rdma_write_cmpl_wr {
> struct fw_ri_isgl isgl_src;
> } u_cmpl;
> __be64 r3;
> -#ifndef C99_NOT_SUPPORTED
> union fw_ri_write {
> - struct fw_ri_immd immd_src[0];
> - struct fw_ri_isgl isgl_src[0];
> + DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
> + DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
> } u;
> -#endif
> };
>
> struct fw_ri_rdma_read_wr {
> --
> 2.34.1
>

2023-01-08 12:18:01

by Leon Romanovsky

[permalink] [raw]
Subject: Re: [PATCH] RDMA/cxgb4: Replace 0-length arrays with flexible arrays

On Thu, Jan 05, 2023 at 02:32:32PM -0800, Kees Cook wrote:
> Zero-length arrays are deprecated[1]. Replace all remaining
> 0-length arrays with flexible arrays. Detected with GCC 13, using
> -fstrict-flex-arrays=3:
>
> In function 'build_rdma_write',
> inlined from 'c4iw_post_send' at ../drivers/infiniband/hw/cxgb4/qp.c:1173:10:
> ../drivers/infiniband/hw/cxgb4/qp.c:597:38: warning: array subscript 0 is outside array bounds of 'struct fw_ri_immd[0]' [-Warray-bounds=]
> 597 | wqe->write.u.immd_src[0].r2 = 0;
> | ~~~~~~~~~~~~~~~~~~~~~^~~
> ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h: In function 'c4iw_post_send':
> ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:567:35: note: while referencing 'immd_src'
> 567 | struct fw_ri_immd immd_src[0];
> | ^~~~~~~~
>
> Additionally drop the unused C99_NOT_SUPPORTED ifndef lines.
>
> [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays
>
> Cc: Potnuri Bharat Teja <[email protected]>
> Cc: Jason Gunthorpe <[email protected]>
> Cc: Leon Romanovsky <[email protected]>
> Cc: "Gustavo A. R. Silva" <[email protected]>
> Cc: [email protected]
> Signed-off-by: Kees Cook <[email protected]>
> ---
> drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | 26 ++++++-----------------
> 1 file changed, 6 insertions(+), 20 deletions(-)

<...>

> #define FW_RI_SEND_WR_SENDOP_S 0
> @@ -618,12 +606,10 @@ struct fw_ri_rdma_write_cmpl_wr {
> struct fw_ri_isgl isgl_src;
> } u_cmpl;
> __be64 r3;
> -#ifndef C99_NOT_SUPPORTED
> union fw_ri_write {
> - struct fw_ri_immd immd_src[0];
> - struct fw_ri_isgl isgl_src[0];
> + DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
> + DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);

smatch built from commit 40351132df3b ("strlen: add __builtin and
__fortify functions") produces the following warning:
drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:575:17: warning: array of flexible structures

Is it expected? What will prevent from getting this warning from 0-day
build bots?

Thanks


> } u;
> -#endif
> };
>
> struct fw_ri_rdma_read_wr {
> --
> 2.34.1
>

2023-01-14 01:29:30

by Kees Cook

[permalink] [raw]
Subject: Re: [PATCH] RDMA/cxgb4: Replace 0-length arrays with flexible arrays

On Sun, Jan 08, 2023 at 02:08:52PM +0200, Leon Romanovsky wrote:
> On Thu, Jan 05, 2023 at 02:32:32PM -0800, Kees Cook wrote:
> > Zero-length arrays are deprecated[1]. Replace all remaining
> > 0-length arrays with flexible arrays. Detected with GCC 13, using
> > -fstrict-flex-arrays=3:
> >
> > In function 'build_rdma_write',
> > inlined from 'c4iw_post_send' at ../drivers/infiniband/hw/cxgb4/qp.c:1173:10:
> > ../drivers/infiniband/hw/cxgb4/qp.c:597:38: warning: array subscript 0 is outside array bounds of 'struct fw_ri_immd[0]' [-Warray-bounds=]
> > 597 | wqe->write.u.immd_src[0].r2 = 0;
> > | ~~~~~~~~~~~~~~~~~~~~~^~~
> > ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h: In function 'c4iw_post_send':
> > ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:567:35: note: while referencing 'immd_src'
> > 567 | struct fw_ri_immd immd_src[0];
> > | ^~~~~~~~
> >
> > Additionally drop the unused C99_NOT_SUPPORTED ifndef lines.
> >
> > [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays
> >
> > Cc: Potnuri Bharat Teja <[email protected]>
> > Cc: Jason Gunthorpe <[email protected]>
> > Cc: Leon Romanovsky <[email protected]>
> > Cc: "Gustavo A. R. Silva" <[email protected]>
> > Cc: [email protected]
> > Signed-off-by: Kees Cook <[email protected]>
> > ---
> > drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | 26 ++++++-----------------
> > 1 file changed, 6 insertions(+), 20 deletions(-)
>
> <...>
>
> > #define FW_RI_SEND_WR_SENDOP_S 0
> > @@ -618,12 +606,10 @@ struct fw_ri_rdma_write_cmpl_wr {
> > struct fw_ri_isgl isgl_src;
> > } u_cmpl;
> > __be64 r3;
> > -#ifndef C99_NOT_SUPPORTED
> > union fw_ri_write {
> > - struct fw_ri_immd immd_src[0];
> > - struct fw_ri_isgl isgl_src[0];
> > + DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
> > + DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
>
> smatch built from commit 40351132df3b ("strlen: add __builtin and
> __fortify functions") produces the following warning:
> drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:575:17: warning: array of flexible structures
>
> Is it expected? What will prevent from getting this warning from 0-day
> build bots?

Err, I'm not sure I understand? Does smatch define "C99_NOT_SUPPORTED"?

--
Kees Cook

2023-01-15 10:33:47

by Leon Romanovsky

[permalink] [raw]
Subject: Re: [PATCH] RDMA/cxgb4: Replace 0-length arrays with flexible arrays

On Fri, Jan 13, 2023 at 05:03:48PM -0800, Kees Cook wrote:
> On Sun, Jan 08, 2023 at 02:08:52PM +0200, Leon Romanovsky wrote:
> > On Thu, Jan 05, 2023 at 02:32:32PM -0800, Kees Cook wrote:
> > > Zero-length arrays are deprecated[1]. Replace all remaining
> > > 0-length arrays with flexible arrays. Detected with GCC 13, using
> > > -fstrict-flex-arrays=3:
> > >
> > > In function 'build_rdma_write',
> > > inlined from 'c4iw_post_send' at ../drivers/infiniband/hw/cxgb4/qp.c:1173:10:
> > > ../drivers/infiniband/hw/cxgb4/qp.c:597:38: warning: array subscript 0 is outside array bounds of 'struct fw_ri_immd[0]' [-Warray-bounds=]
> > > 597 | wqe->write.u.immd_src[0].r2 = 0;
> > > | ~~~~~~~~~~~~~~~~~~~~~^~~
> > > ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h: In function 'c4iw_post_send':
> > > ../drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:567:35: note: while referencing 'immd_src'
> > > 567 | struct fw_ri_immd immd_src[0];
> > > | ^~~~~~~~
> > >
> > > Additionally drop the unused C99_NOT_SUPPORTED ifndef lines.
> > >
> > > [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays
> > >
> > > Cc: Potnuri Bharat Teja <[email protected]>
> > > Cc: Jason Gunthorpe <[email protected]>
> > > Cc: Leon Romanovsky <[email protected]>
> > > Cc: "Gustavo A. R. Silva" <[email protected]>
> > > Cc: [email protected]
> > > Signed-off-by: Kees Cook <[email protected]>
> > > ---
> > > drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | 26 ++++++-----------------
> > > 1 file changed, 6 insertions(+), 20 deletions(-)
> >
> > <...>
> >
> > > #define FW_RI_SEND_WR_SENDOP_S 0
> > > @@ -618,12 +606,10 @@ struct fw_ri_rdma_write_cmpl_wr {
> > > struct fw_ri_isgl isgl_src;
> > > } u_cmpl;
> > > __be64 r3;
> > > -#ifndef C99_NOT_SUPPORTED
> > > union fw_ri_write {
> > > - struct fw_ri_immd immd_src[0];
> > > - struct fw_ri_isgl isgl_src[0];
> > > + DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
> > > + DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
> >
> > smatch built from commit 40351132df3b ("strlen: add __builtin and
> > __fortify functions") produces the following warning:
> > drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:575:17: warning: array of flexible structures
> >
> > Is it expected? What will prevent from getting this warning from 0-day
> > build bots?
>
> Err, I'm not sure I understand? Does smatch define "C99_NOT_SUPPORTED"?

Why should it define? You removed C99_NOT_SUPPORTED.

Just download smatch, build from scratch and run over this patch. It
generates new warning.

➜ kernel git:(wip/leon-for-next) mkt ci --no-sparse --no-extra-warnings
ccdbefcf661e (HEAD -> build) RDMA/cxgb4: Replace 0-length arrays with flexible arrays
WARNING: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#11:
inlined from 'c4iw_post_send' at ../drivers/infiniband/hw/cxgb4/qp.c:1173:10:

drivers/infiniband/hw/cxgb4/t4fw_ri_api.h:558:17: warning: array of flexible structures
....



>
> --
> Kees Cook