diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-06-19 10:13:50 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-06-19 10:13:50 +0200 |
commit | fabf5e49ddd61312027de8e92cc1b8528c2a929d (patch) | |
tree | 9f37dc7b29751182fd7ba7d091e1909cad314ef1 /dlfcn | |
parent | 2c75b545de6fe3c44138799c68217a94bc669a88 (diff) | |
download | glibc-fabf5e49ddd61312027de8e92cc1b8528c2a929d.tar.gz glibc-fabf5e49ddd61312027de8e92cc1b8528c2a929d.tar.xz glibc-fabf5e49ddd61312027de8e92cc1b8528c2a929d.zip |
dlfcn: Avoid one-element flexible array in Dl_serinfo [BZ #24166]
The dls_serpath path field, as an array of length 1, introduces unexpected array subscript checks with some compilers. GCC versions before 3.0 treat the nested anonymous union as a declaration of an unnamed type, and not as a member declaration, so this construct cannot be used for these compilers.
Diffstat (limited to 'dlfcn')
-rw-r--r-- | dlfcn/dlfcn.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/dlfcn/dlfcn.h b/dlfcn/dlfcn.h index 896ad6fc9b..c550371999 100644 --- a/dlfcn/dlfcn.h +++ b/dlfcn/dlfcn.h @@ -180,7 +180,19 @@ typedef struct { size_t dls_size; /* Size in bytes of the whole buffer. */ unsigned int dls_cnt; /* Number of elements in `dls_serpath'. */ +# if __GNUC_PREREQ (3, 0) + /* The zero-length array avoids an unwanted array subscript check by + the compiler, while the surrounding anonymous union preserves the + historic size of the type. At the time of writing, GNU C does + not support structs with flexible array members in unions. */ + __extension__ union + { + Dl_serpath dls_serpath[0]; /* Actually longer, dls_cnt elements. */ + Dl_serpath __dls_serpath_pad[1]; + }; +# else Dl_serpath dls_serpath[1]; /* Actually longer, dls_cnt elements. */ +# endif } Dl_serinfo; #endif /* __USE_GNU */ |