[PATCH v2] libselinux: use designated initializers for label initfuncs
"Thiébaud Weksteen" <[email protected]>
| Newsgroups | org.kernel.vger.selinux |
|---|---|
| Message-ID | <[email protected]> |
Previously, the initfuncs array relied on implicit positional ordering to match backend context constants (e.g., SELABEL_CTX_FILE). If constants were reordered or added, array indexing could become misaligned. Use C99 designated initializers in initfuncs to explicitly bind each initialization function to its corresponding context constant. Additionally, define _SELABEL_CTX_NUM in include/selinux/label.h to count total backends, and add a compile-time static_assert ensuring initfuncs stays in sync with _SELABEL_CTX_NUM. Signed-off-by: Thiébaud Weksteen <[email protected]> --- v2: Rebase on selinux/main and format libselinux/include/selinux/label.h | 5 +++++ libselinux/src/label.c | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/libselinux/include/selinux/label.h b/libselinux/include/selinux/label.h index 748b0db0..bde2501f 100644 --- a/libselinux/include/selinux/label.h +++ b/libselinux/include/selinux/label.h @@ -37,6 +37,11 @@ struct selabel_handle; #define SELABEL_CTX_ANDROID_PROP 4 /* Android service contexts */ #define SELABEL_CTX_ANDROID_SERVICE 5 +/* + * Total number of context backends. When adding a new backend, + * please increase this value. + */ +#define _SELABEL_CTX_NUM 6 /* * Available options diff --git a/libselinux/src/label.c b/libselinux/src/label.c index 1ccd1abe..991b9769 100644 --- a/libselinux/src/label.c +++ b/libselinux/src/label.c @@ -4,6 +4,7 @@ * Author : Eamon Walsh <[email protected]> */ +#include <assert.h> #include <sys/types.h> #include <ctype.h> #include <errno.h> @@ -45,14 +46,19 @@ typedef int (*selabel_initfunc)(struct selabel_handle *rec, const struct selinux_opt *opts, unsigned nopts); static const selabel_initfunc initfuncs[] = { - &selabel_file_init, - CONFIG_MEDIA_BACKEND(selabel_media_init), - CONFIG_X_BACKEND(selabel_x_init), - CONFIG_DB_BACKEND(selabel_db_init), - CONFIG_ANDROID_BACKEND(selabel_property_init), - CONFIG_ANDROID_BACKEND(selabel_service_init), + [SELABEL_CTX_FILE] = &selabel_file_init, + [SELABEL_CTX_MEDIA] = CONFIG_MEDIA_BACKEND(selabel_media_init), + [SELABEL_CTX_X] = CONFIG_X_BACKEND(selabel_x_init), + [SELABEL_CTX_DB] = CONFIG_DB_BACKEND(selabel_db_init), + [SELABEL_CTX_ANDROID_PROP] = + CONFIG_ANDROID_BACKEND(selabel_property_init), + [SELABEL_CTX_ANDROID_SERVICE] = + CONFIG_ANDROID_BACKEND(selabel_service_init), }; +static_assert(ARRAY_SIZE(initfuncs) == _SELABEL_CTX_NUM, + "initfuncs array size does not match _SELABEL_CTX_NUM"); + static inline struct selabel_digest * selabel_is_digest_set(const struct selinux_opt *opts, unsigned n) { -- 2.55.0.229.g6434b31f56-goog