From 4951286eb634c00c11883b851c91f3a21975eabd Mon Sep 17 00:00:00 2001 From: Eugene Syromyatnikov Date: Tue, 18 Jan 2022 18:03:57 +0100 Subject: [PATCH 171/174] tests/secontext: add secontext field getters * tests/secontext.h (get_secontext_field, get_secontext_field_file): New declarations. * tests/secontext.c (get_type_from_context): Rename to... (get_secontext_field): ...this; remove "static" qualifier; add "field" argument, use it. (raw_expected_secontext_short_file, raw_secontext_short_pid): Replace get_type_from_context call with get_secontext_field. (get_secontext_field_file): New function. (raw_secontext_short_file): Replace body with get_secontext_field_file call. --- tests/secontext.c | 27 +++++++++++++++------------ tests/secontext.h | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/tests/secontext.c b/tests/secontext.c index 848eea9..52211ed 100644 --- a/tests/secontext.c +++ b/tests/secontext.c @@ -56,8 +56,8 @@ strip_trailing_newlines(char *context) return context; } -static char * -get_type_from_context(const char *full_context) +char * +get_secontext_field(const char *full_context, enum secontext_field field) { int saved_errno = errno; @@ -72,7 +72,7 @@ get_type_from_context(const char *full_context) char *context = NULL; for (token = strtok_r(ctx_copy, ":", &saveptr), i = 0; token; token = strtok_r(NULL, ":", &saveptr), i++) { - if (i == 2) { + if (i == field) { context = xstrdup(token); break; } @@ -122,7 +122,7 @@ raw_expected_secontext_short_file(const char *filename) int saved_errno = errno; char *ctx = raw_expected_secontext_full_file(filename); - char *type = get_type_from_context(ctx); + char *type = get_secontext_field(ctx, SECONTEXT_TYPE); free(ctx); errno = saved_errno; @@ -144,20 +144,23 @@ raw_secontext_full_file(const char *filename) return full_secontext; } -static char * -raw_secontext_short_file(const char *filename) +char * +get_secontext_field_file(const char *file, enum secontext_field field) { - int saved_errno = errno; - - char *ctx = raw_secontext_full_file(filename); - char *type = get_type_from_context(ctx); + char *ctx = raw_secontext_full_file(file); + char *type = get_secontext_field(ctx, field); free(ctx); - errno = saved_errno; return type; } static char * +raw_secontext_short_file(const char *filename) +{ + return get_secontext_field_file(filename, SECONTEXT_TYPE); +} + +static char * raw_secontext_full_pid(pid_t pid) { int saved_errno = errno; @@ -178,7 +181,7 @@ raw_secontext_short_pid(pid_t pid) int saved_errno = errno; char *ctx = raw_secontext_full_pid(pid); - char *type = get_type_from_context(ctx); + char *type = get_secontext_field(ctx, SECONTEXT_TYPE); free(ctx); errno = saved_errno; diff --git a/tests/secontext.h b/tests/secontext.h index 1d0251a..e5571d5 100644 --- a/tests/secontext.h +++ b/tests/secontext.h @@ -23,6 +23,15 @@ enum secontext_field { #if defined TEST_SECONTEXT && defined HAVE_SELINUX_RUNTIME +/** + * Parse a SELinux context string and return a specified field, duplicated + * in a separate string. The caller is responsible for freeing the memory + * pointed by the returned value. + */ +char *get_secontext_field(const char *full_context, enum secontext_field field); + +char *get_secontext_field_file(const char *file, enum secontext_field field); + void update_secontext_field(const char *file, enum secontext_field field, const char *newvalue); @@ -48,6 +57,17 @@ void update_secontext_field(const char *file, enum secontext_field field, #else +static inline char * +get_secontext_field(const char *ctx, enum secontext_field field) +{ + return NULL; +} +static inline char * +get_secontext_field_file(const char *file, enum secontext_field field) +{ + return NULL; +} + static inline void update_secontext_field(const char *file, enum secontext_field field, const char *newvalue) diff --git a/tests-m32/secontext.c b/tests-m32/secontext.c index 848eea9..52211ed 100644 --- a/tests-m32/secontext.c +++ b/tests-m32/secontext.c @@ -56,8 +56,8 @@ strip_trailing_newlines(char *context) return context; } -static char * -get_type_from_context(const char *full_context) +char * +get_secontext_field(const char *full_context, enum secontext_field field) { int saved_errno = errno; @@ -72,7 +72,7 @@ get_type_from_context(const char *full_context) char *context = NULL; for (token = strtok_r(ctx_copy, ":", &saveptr), i = 0; token; token = strtok_r(NULL, ":", &saveptr), i++) { - if (i == 2) { + if (i == field) { context = xstrdup(token); break; } @@ -122,7 +122,7 @@ raw_expected_secontext_short_file(const char *filename) int saved_errno = errno; char *ctx = raw_expected_secontext_full_file(filename); - char *type = get_type_from_context(ctx); + char *type = get_secontext_field(ctx, SECONTEXT_TYPE); free(ctx); errno = saved_errno; @@ -144,20 +144,23 @@ raw_secontext_full_file(const char *filename) return full_secontext; } -static char * -raw_secontext_short_file(const char *filename) +char * +get_secontext_field_file(const char *file, enum secontext_field field) { - int saved_errno = errno; - - char *ctx = raw_secontext_full_file(filename); - char *type = get_type_from_context(ctx); + char *ctx = raw_secontext_full_file(file); + char *type = get_secontext_field(ctx, field); free(ctx); - errno = saved_errno; return type; } static char * +raw_secontext_short_file(const char *filename) +{ + return get_secontext_field_file(filename, SECONTEXT_TYPE); +} + +static char * raw_secontext_full_pid(pid_t pid) { int saved_errno = errno; @@ -178,7 +181,7 @@ raw_secontext_short_pid(pid_t pid) int saved_errno = errno; char *ctx = raw_secontext_full_pid(pid); - char *type = get_type_from_context(ctx); + char *type = get_secontext_field(ctx, SECONTEXT_TYPE); free(ctx); errno = saved_errno; diff --git a/tests-m32/secontext.h b/tests-m32/secontext.h index 1d0251a..e5571d5 100644 --- a/tests-m32/secontext.h +++ b/tests-m32/secontext.h @@ -23,6 +23,15 @@ enum secontext_field { #if defined TEST_SECONTEXT && defined HAVE_SELINUX_RUNTIME +/** + * Parse a SELinux context string and return a specified field, duplicated + * in a separate string. The caller is responsible for freeing the memory + * pointed by the returned value. + */ +char *get_secontext_field(const char *full_context, enum secontext_field field); + +char *get_secontext_field_file(const char *file, enum secontext_field field); + void update_secontext_field(const char *file, enum secontext_field field, const char *newvalue); @@ -48,6 +57,17 @@ void update_secontext_field(const char *file, enum secontext_field field, #else +static inline char * +get_secontext_field(const char *ctx, enum secontext_field field) +{ + return NULL; +} +static inline char * +get_secontext_field_file(const char *file, enum secontext_field field) +{ + return NULL; +} + static inline void update_secontext_field(const char *file, enum secontext_field field, const char *newvalue) diff --git a/tests-mx32/secontext.c b/tests-mx32/secontext.c index 848eea9..52211ed 100644 --- a/tests-mx32/secontext.c +++ b/tests-mx32/secontext.c @@ -56,8 +56,8 @@ strip_trailing_newlines(char *context) return context; } -static char * -get_type_from_context(const char *full_context) +char * +get_secontext_field(const char *full_context, enum secontext_field field) { int saved_errno = errno; @@ -72,7 +72,7 @@ get_type_from_context(const char *full_context) char *context = NULL; for (token = strtok_r(ctx_copy, ":", &saveptr), i = 0; token; token = strtok_r(NULL, ":", &saveptr), i++) { - if (i == 2) { + if (i == field) { context = xstrdup(token); break; } @@ -122,7 +122,7 @@ raw_expected_secontext_short_file(const char *filename) int saved_errno = errno; char *ctx = raw_expected_secontext_full_file(filename); - char *type = get_type_from_context(ctx); + char *type = get_secontext_field(ctx, SECONTEXT_TYPE); free(ctx); errno = saved_errno; @@ -144,20 +144,23 @@ raw_secontext_full_file(const char *filename) return full_secontext; } -static char * -raw_secontext_short_file(const char *filename) +char * +get_secontext_field_file(const char *file, enum secontext_field field) { - int saved_errno = errno; - - char *ctx = raw_secontext_full_file(filename); - char *type = get_type_from_context(ctx); + char *ctx = raw_secontext_full_file(file); + char *type = get_secontext_field(ctx, field); free(ctx); - errno = saved_errno; return type; } static char * +raw_secontext_short_file(const char *filename) +{ + return get_secontext_field_file(filename, SECONTEXT_TYPE); +} + +static char * raw_secontext_full_pid(pid_t pid) { int saved_errno = errno; @@ -178,7 +181,7 @@ raw_secontext_short_pid(pid_t pid) int saved_errno = errno; char *ctx = raw_secontext_full_pid(pid); - char *type = get_type_from_context(ctx); + char *type = get_secontext_field(ctx, SECONTEXT_TYPE); free(ctx); errno = saved_errno; diff --git a/tests-mx32/secontext.h b/tests-mx32/secontext.h index 1d0251a..e5571d5 100644 --- a/tests-mx32/secontext.h +++ b/tests-mx32/secontext.h @@ -23,6 +23,15 @@ enum secontext_field { #if defined TEST_SECONTEXT && defined HAVE_SELINUX_RUNTIME +/** + * Parse a SELinux context string and return a specified field, duplicated + * in a separate string. The caller is responsible for freeing the memory + * pointed by the returned value. + */ +char *get_secontext_field(const char *full_context, enum secontext_field field); + +char *get_secontext_field_file(const char *file, enum secontext_field field); + void update_secontext_field(const char *file, enum secontext_field field, const char *newvalue); @@ -48,6 +57,17 @@ void update_secontext_field(const char *file, enum secontext_field field, #else +static inline char * +get_secontext_field(const char *ctx, enum secontext_field field) +{ + return NULL; +} +static inline char * +get_secontext_field_file(const char *file, enum secontext_field field) +{ + return NULL; +} + static inline void update_secontext_field(const char *file, enum secontext_field field, const char *newvalue) -- 2.1.4