[vlc-devel] [PATCH] objects: ensure accessing payload parents via container_of is correct
Rémi Denis-Courmont
remi at remlab.net
Wed Jul 26 10:35:46 CEST 2017
Le 26 juillet 2017 10:39:01 GMT+03:00, Steve Lhomme <robux4 at videolabs.io> a écrit :
>In those cases the parent of a payload is accessed via the
>container_of() macro
>that removes the size of the containing structure of the payload
>pointer. This
>size comes from offsetof() the flexible array element at the end of the
>parent
>structure.
>The compiler is supposed to treat the flexible array element has having
>no size
>in the structure (except when accessed).
>---
> src/misc/objects.c | 3 +++
> src/misc/objres.c | 2 ++
> 2 files changed, 5 insertions(+)
>
>diff --git a/src/misc/objects.c b/src/misc/objects.c
>index 91eebdaf20..e953e38a64 100644
>--- a/src/misc/objects.c
>+++ b/src/misc/objects.c
>@@ -186,6 +186,9 @@ void *vlc_custom_create (vlc_object_t *parent,
>size_t length,
> * and zeroes the rest.
> */
> assert (length >= sizeof (vlc_object_t));
>+ static_assert( sizeof(vlc_object_internals_t) ==
>+ offsetof(vlc_object_internals_t, aligned_end),
>+ "flexible array size is not ignored" );
>
> vlc_object_internals_t *priv = malloc (sizeof (*priv) + length);
> if (unlikely(priv == NULL))
>diff --git a/src/misc/objres.c b/src/misc/objres.c
>index 1afaccb700..b9aa87f30d 100644
>--- a/src/misc/objres.c
>+++ b/src/misc/objres.c
>@@ -51,6 +51,8 @@ void *vlc_objres_new(size_t size, void
>(*release)(void *))
> errno = ENOMEM;
> return NULL;
> }
>+ static_assert( sizeof(struct vlc_res) == offsetof(struct vlc_res,
>payload),
>+ "flexible array size is not ignored" );
>
> struct vlc_res *res = malloc(sizeof (*res) + size);
> if (unlikely(res == NULL))
>--
>2.12.1
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
Nack. This assertion is always true. If you want to check that nobody breaks aligned_end the sensible assertion is alignof(internals) >= alignof(max_align_t). But it would be incredibly stupid and reckless for somebody to make aligned_end not the end of the structure, so that seems pointless too.
--
Rémi Denis-Courmont
Typed on an inconvenient virtual keyboard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170726/0797066f/attachment-0001.html>
More information about the vlc-devel
mailing list