All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member
@ 2020-02-11 23:14 Gustavo A. R. Silva
  2020-02-12  7:21 ` Ard Biesheuvel
  0 siblings, 1 reply; 5+ messages in thread
From: Gustavo A. R. Silva @ 2020-02-11 23:14 UTC (permalink / raw)
  To: Ard Biesheuvel; +Cc: linux-efi, linux-kernel, Gustavo A. R. Silva

The current codebase makes use of the zero-length array language
extension to the C90 standard, but the preferred mechanism to declare
variable-length types such as these ones is a flexible array member[1][2],
introduced in C99:

struct foo {
        int stuff;
        struct boo array[];
};

By making use of the mechanism above, we will get a compiler warning
in case the flexible array does not occur last in the structure, which
will help us prevent some kind of undefined behavior bugs from being
inadvertenly introduced[3] to the codebase from now on.

This issue was found with the help of Coccinelle.

[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
---
 drivers/firmware/efi/apple-properties.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c
index 0e206c9e0d7a..590c9003f3b4 100644
--- a/drivers/firmware/efi/apple-properties.c
+++ b/drivers/firmware/efi/apple-properties.c
@@ -31,7 +31,7 @@ __setup("dump_apple_properties", dump_properties_enable);
 struct dev_header {
 	u32 len;
 	u32 prop_count;
-	struct efi_dev_path path[0];
+	struct efi_dev_path path[];
 	/*
 	 * followed by key/value pairs, each key and value preceded by u32 len,
 	 * len includes itself, value may be empty (in which case its len is 4)
@@ -42,7 +42,7 @@ struct properties_header {
 	u32 len;
 	u32 version;
 	u32 dev_count;
-	struct dev_header dev_header[0];
+	struct dev_header dev_header[];
 };
 
 static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
-- 
2.25.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member
  2020-02-11 23:14 [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member Gustavo A. R. Silva
@ 2020-02-12  7:21 ` Ard Biesheuvel
  0 siblings, 0 replies; 5+ messages in thread
From: Ard Biesheuvel @ 2020-02-12  7:21 UTC (permalink / raw)
  To: Gustavo A. R. Silva; +Cc: linux-efi, Linux Kernel Mailing List

On Wed, 12 Feb 2020 at 00:11, Gustavo A. R. Silva
<gustavo@embeddedor.com> wrote:
>
> The current codebase makes use of the zero-length array language
> extension to the C90 standard, but the preferred mechanism to declare
> variable-length types such as these ones is a flexible array member[1][2],
> introduced in C99:
>
> struct foo {
>         int stuff;
>         struct boo array[];
> };
>
> By making use of the mechanism above, we will get a compiler warning
> in case the flexible array does not occur last in the structure, which
> will help us prevent some kind of undefined behavior bugs from being
> inadvertenly introduced[3] to the codebase from now on.
>
> This issue was found with the help of Coccinelle.
>
> [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
> [2] https://github.com/KSPP/linux/issues/21
> [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")
>
> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>

Queued in efi/next

Thanks,

> ---
>  drivers/firmware/efi/apple-properties.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c
> index 0e206c9e0d7a..590c9003f3b4 100644
> --- a/drivers/firmware/efi/apple-properties.c
> +++ b/drivers/firmware/efi/apple-properties.c
> @@ -31,7 +31,7 @@ __setup("dump_apple_properties", dump_properties_enable);
>  struct dev_header {
>         u32 len;
>         u32 prop_count;
> -       struct efi_dev_path path[0];
> +       struct efi_dev_path path[];
>         /*
>          * followed by key/value pairs, each key and value preceded by u32 len,
>          * len includes itself, value may be empty (in which case its len is 4)
> @@ -42,7 +42,7 @@ struct properties_header {
>         u32 len;
>         u32 version;
>         u32 dev_count;
> -       struct dev_header dev_header[0];
> +       struct dev_header dev_header[];
>  };
>
>  static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
> --
> 2.25.0
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member
  2020-02-21 15:44 ` Ard Biesheuvel
@ 2020-02-21 15:52   ` Gustavo A. R. Silva
  0 siblings, 0 replies; 5+ messages in thread
From: Gustavo A. R. Silva @ 2020-02-21 15:52 UTC (permalink / raw)
  To: Ard Biesheuvel; +Cc: linux-efi, Linux Kernel Mailing List



On 2/21/20 09:44, Ard Biesheuvel wrote:

>>
>> [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
>> [2] https://github.com/KSPP/linux/issues/21
>> [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")
>>
>> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
> 
> Please don't send duplicates. I already queued this in efi/next, and
> responded accordingly.
> 

Oh, sorry for the noise, and thanks for queuing that up.

--
Gustavo

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member
  2020-02-21 15:24 Gustavo A. R. Silva
@ 2020-02-21 15:44 ` Ard Biesheuvel
  2020-02-21 15:52   ` Gustavo A. R. Silva
  0 siblings, 1 reply; 5+ messages in thread
From: Ard Biesheuvel @ 2020-02-21 15:44 UTC (permalink / raw)
  To: Gustavo A. R. Silva; +Cc: linux-efi, Linux Kernel Mailing List

On Fri, 21 Feb 2020 at 16:41, Gustavo A. R. Silva
<gustavo@embeddedor.com> wrote:
>
> The current codebase makes use of the zero-length array language
> extension to the C90 standard, but the preferred mechanism to declare
> variable-length types such as these ones is a flexible array member[1][2],
> introduced in C99:
>
> struct foo {
>         int stuff;
>         struct boo array[];
> };
>
> By making use of the mechanism above, we will get a compiler warning
> in case the flexible array does not occur last in the structure, which
> will help us prevent some kind of undefined behavior bugs from being
> inadvertently introduced[3] to the codebase from now on.
>
> Also, notice that, dynamic memory allocations won't be affected by
> this change:
>
> "Flexible array members have incomplete type, and so the sizeof operator
> may not be applied. As a quirk of the original implementation of
> zero-length arrays, sizeof evaluates to zero."[1]
>
> This issue was found with the help of Coccinelle.
>
> [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
> [2] https://github.com/KSPP/linux/issues/21
> [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")
>
> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>

Please don't send duplicates. I already queued this in efi/next, and
responded accordingly.

> ---
>  drivers/firmware/efi/apple-properties.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c
> index 5ccf39986a14..084942846f4d 100644
> --- a/drivers/firmware/efi/apple-properties.c
> +++ b/drivers/firmware/efi/apple-properties.c
> @@ -31,7 +31,7 @@ __setup("dump_apple_properties", dump_properties_enable);
>  struct dev_header {
>         u32 len;
>         u32 prop_count;
> -       struct efi_dev_path path[0];
> +       struct efi_dev_path path[];
>         /*
>          * followed by key/value pairs, each key and value preceded by u32 len,
>          * len includes itself, value may be empty (in which case its len is 4)
> @@ -42,7 +42,7 @@ struct properties_header {
>         u32 len;
>         u32 version;
>         u32 dev_count;
> -       struct dev_header dev_header[0];
> +       struct dev_header dev_header[];
>  };
>
>  static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
> --
> 2.25.0
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member
@ 2020-02-21 15:24 Gustavo A. R. Silva
  2020-02-21 15:44 ` Ard Biesheuvel
  0 siblings, 1 reply; 5+ messages in thread
From: Gustavo A. R. Silva @ 2020-02-21 15:24 UTC (permalink / raw)
  To: Ard Biesheuvel; +Cc: linux-efi, linux-kernel, Gustavo A. R. Silva

The current codebase makes use of the zero-length array language
extension to the C90 standard, but the preferred mechanism to declare
variable-length types such as these ones is a flexible array member[1][2],
introduced in C99:

struct foo {
        int stuff;
        struct boo array[];
};

By making use of the mechanism above, we will get a compiler warning
in case the flexible array does not occur last in the structure, which
will help us prevent some kind of undefined behavior bugs from being
inadvertently introduced[3] to the codebase from now on.

Also, notice that, dynamic memory allocations won't be affected by
this change:

"Flexible array members have incomplete type, and so the sizeof operator
may not be applied. As a quirk of the original implementation of
zero-length arrays, sizeof evaluates to zero."[1]

This issue was found with the help of Coccinelle.

[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
---
 drivers/firmware/efi/apple-properties.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c
index 5ccf39986a14..084942846f4d 100644
--- a/drivers/firmware/efi/apple-properties.c
+++ b/drivers/firmware/efi/apple-properties.c
@@ -31,7 +31,7 @@ __setup("dump_apple_properties", dump_properties_enable);
 struct dev_header {
 	u32 len;
 	u32 prop_count;
-	struct efi_dev_path path[0];
+	struct efi_dev_path path[];
 	/*
 	 * followed by key/value pairs, each key and value preceded by u32 len,
 	 * len includes itself, value may be empty (in which case its len is 4)
@@ -42,7 +42,7 @@ struct properties_header {
 	u32 len;
 	u32 version;
 	u32 dev_count;
-	struct dev_header dev_header[0];
+	struct dev_header dev_header[];
 };
 
 static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
-- 
2.25.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-02-21 15:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-11 23:14 [PATCH] efi/apple-properties: Replace zero-length array with flexible-array member Gustavo A. R. Silva
2020-02-12  7:21 ` Ard Biesheuvel
2020-02-21 15:24 Gustavo A. R. Silva
2020-02-21 15:44 ` Ard Biesheuvel
2020-02-21 15:52   ` 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.