diff mbox series

libselinux: Strip spaces before values in config

Message ID 20220113204353.185947-1-vmojzis@redhat.com (mailing list archive)
State Superseded
Headers show
Series libselinux: Strip spaces before values in config | expand

Commit Message

Vit Mojzis Jan. 13, 2022, 8:43 p.m. UTC
Spaces before values in /etc/selinux/config should be ignored just as
spaces after them are.

E.g. "SELINUXTYPE= targeted" should be a valid value.

Fixes:
   # sed -i 's/^SELINUXTYPE=/SELINUXTYPE= /g' /etc/selinux/config
   # dnf install <any_package>
   ...
   RPM: error: selabel_open: (/etc/selinux/ targeted/contexts/files/file_contexts) No such file or directory
   RPM: error: Plugin selinux: hook tsm_pre failed
   ...
   Error: Could not run transaction.

Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
---
 libselinux/src/selinux_config.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Christian Göttsche Jan. 15, 2022, 5:28 p.m. UTC | #1
On Thu, 13 Jan 2022 at 21:44, Vit Mojzis <vmojzis@redhat.com> wrote:
>
> Spaces before values in /etc/selinux/config should be ignored just as
> spaces after them are.
>
> E.g. "SELINUXTYPE= targeted" should be a valid value.
>
> Fixes:
>    # sed -i 's/^SELINUXTYPE=/SELINUXTYPE= /g' /etc/selinux/config
>    # dnf install <any_package>
>    ...
>    RPM: error: selabel_open: (/etc/selinux/ targeted/contexts/files/file_contexts) No such file or directory
>    RPM: error: Plugin selinux: hook tsm_pre failed
>    ...
>    Error: Could not run transaction.
>
> Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
> ---
>  libselinux/src/selinux_config.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
> index 97f81a8b..99cd6124 100644
> --- a/libselinux/src/selinux_config.c
> +++ b/libselinux/src/selinux_config.c
> @@ -92,6 +92,7 @@ int selinux_getenforcemode(int *enforce)
>         FILE *cfg = fopen(SELINUXCONFIG, "re");
>         if (cfg) {
>                 char *buf;
> +               char *tag;
>                 int len = sizeof(SELINUXTAG) - 1;
>                 buf = malloc(selinux_page_size);
>                 if (!buf) {
> @@ -101,21 +102,24 @@ int selinux_getenforcemode(int *enforce)
>                 while (fgets_unlocked(buf, selinux_page_size, cfg)) {
>                         if (strncmp(buf, SELINUXTAG, len))
>                                 continue;
> +                       tag = buf+len;
> +                       while (isspace(*tag))
> +                               tag++;
>                         if (!strncasecmp
> -                           (buf + len, "enforcing", sizeof("enforcing") - 1)) {
> +                           (tag, "enforcing", sizeof("enforcing") - 1)) {
>                                 *enforce = 1;
>                                 ret = 0;
>                                 break;
>                         } else
>                             if (!strncasecmp
> -                               (buf + len, "permissive",
> +                               (tag, "permissive",
>                                  sizeof("permissive") - 1)) {
>                                 *enforce = 0;
>                                 ret = 0;
>                                 break;
>                         } else
>                             if (!strncasecmp
> -                               (buf + len, "disabled",
> +                               (tag, "disabled",
>                                  sizeof("disabled") - 1)) {
>                                 *enforce = -1;
>                                 ret = 0;
> @@ -176,7 +180,10 @@ static void init_selinux_config(void)
>
>                         if (!strncasecmp(buf_p, SELINUXTYPETAG,
>                                          sizeof(SELINUXTYPETAG) - 1)) {
> -                               type = strdup(buf_p + sizeof(SELINUXTYPETAG) - 1);
> +                               buf_p += sizeof(SELINUXTYPETAG) - 1;
> +                               while (isspace(*buf_p))
> +                                       buf_p++;
> +                               type = strdup(buf_p);
>                                 if (!type) {
>                                         free(line_buf);
>                                         fclose(fp);
> @@ -199,6 +206,8 @@ static void init_selinux_config(void)
>                         } else if (!strncmp(buf_p, REQUIRESEUSERS,
>                                             sizeof(REQUIRESEUSERS) - 1)) {
>                                 value = buf_p + sizeof(REQUIRESEUSERS) - 1;
> +                               while (isspace(*value))
> +                                       buf_p++;

This looks wrong.

>                                 intptr = &require_seusers;
>                         } else {
>                                 continue;
> --
> 2.34.1
>
Vit Mojzis Jan. 17, 2022, 9:42 a.m. UTC | #2
On 15. 01. 22 18:28, Christian Göttsche wrote:
> On Thu, 13 Jan 2022 at 21:44, Vit Mojzis <vmojzis@redhat.com> wrote:
>> Spaces before values in /etc/selinux/config should be ignored just as
>> spaces after them are.
>>
>> E.g. "SELINUXTYPE= targeted" should be a valid value.
>>
>> Fixes:
>>     # sed -i 's/^SELINUXTYPE=/SELINUXTYPE= /g' /etc/selinux/config
>>     # dnf install <any_package>
>>     ...
>>     RPM: error: selabel_open: (/etc/selinux/ targeted/contexts/files/file_contexts) No such file or directory
>>     RPM: error: Plugin selinux: hook tsm_pre failed
>>     ...
>>     Error: Could not run transaction.
>>
>> Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
>> ---
>>   libselinux/src/selinux_config.c | 17 +++++++++++++----
>>   1 file changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
>> index 97f81a8b..99cd6124 100644
>> --- a/libselinux/src/selinux_config.c
>> +++ b/libselinux/src/selinux_config.c
>> @@ -92,6 +92,7 @@ int selinux_getenforcemode(int *enforce)
>>          FILE *cfg = fopen(SELINUXCONFIG, "re");
>>          if (cfg) {
>>                  char *buf;
>> +               char *tag;
>>                  int len = sizeof(SELINUXTAG) - 1;
>>                  buf = malloc(selinux_page_size);
>>                  if (!buf) {
>> @@ -101,21 +102,24 @@ int selinux_getenforcemode(int *enforce)
>>                  while (fgets_unlocked(buf, selinux_page_size, cfg)) {
>>                          if (strncmp(buf, SELINUXTAG, len))
>>                                  continue;
>> +                       tag = buf+len;
>> +                       while (isspace(*tag))
>> +                               tag++;
>>                          if (!strncasecmp
>> -                           (buf + len, "enforcing", sizeof("enforcing") - 1)) {
>> +                           (tag, "enforcing", sizeof("enforcing") - 1)) {
>>                                  *enforce = 1;
>>                                  ret = 0;
>>                                  break;
>>                          } else
>>                              if (!strncasecmp
>> -                               (buf + len, "permissive",
>> +                               (tag, "permissive",
>>                                   sizeof("permissive") - 1)) {
>>                                  *enforce = 0;
>>                                  ret = 0;
>>                                  break;
>>                          } else
>>                              if (!strncasecmp
>> -                               (buf + len, "disabled",
>> +                               (tag, "disabled",
>>                                   sizeof("disabled") - 1)) {
>>                                  *enforce = -1;
>>                                  ret = 0;
>> @@ -176,7 +180,10 @@ static void init_selinux_config(void)
>>
>>                          if (!strncasecmp(buf_p, SELINUXTYPETAG,
>>                                           sizeof(SELINUXTYPETAG) - 1)) {
>> -                               type = strdup(buf_p + sizeof(SELINUXTYPETAG) - 1);
>> +                               buf_p += sizeof(SELINUXTYPETAG) - 1;
>> +                               while (isspace(*buf_p))
>> +                                       buf_p++;
>> +                               type = strdup(buf_p);
>>                                  if (!type) {
>>                                          free(line_buf);
>>                                          fclose(fp);
>> @@ -199,6 +206,8 @@ static void init_selinux_config(void)
>>                          } else if (!strncmp(buf_p, REQUIRESEUSERS,
>>                                              sizeof(REQUIRESEUSERS) - 1)) {
>>                                  value = buf_p + sizeof(REQUIRESEUSERS) - 1;
>> +                               while (isspace(*value))
>> +                                       buf_p++;
> This looks wrong.
Yes, sorry, stupid mistake.

>
>>                                  intptr = &require_seusers;
>>                          } else {
>>                                  continue;
>> --
>> 2.34.1
>>
diff mbox series

Patch

diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
index 97f81a8b..99cd6124 100644
--- a/libselinux/src/selinux_config.c
+++ b/libselinux/src/selinux_config.c
@@ -92,6 +92,7 @@  int selinux_getenforcemode(int *enforce)
 	FILE *cfg = fopen(SELINUXCONFIG, "re");
 	if (cfg) {
 		char *buf;
+		char *tag;
 		int len = sizeof(SELINUXTAG) - 1;
 		buf = malloc(selinux_page_size);
 		if (!buf) {
@@ -101,21 +102,24 @@  int selinux_getenforcemode(int *enforce)
 		while (fgets_unlocked(buf, selinux_page_size, cfg)) {
 			if (strncmp(buf, SELINUXTAG, len))
 				continue;
+			tag = buf+len;
+			while (isspace(*tag))
+				tag++;
 			if (!strncasecmp
-			    (buf + len, "enforcing", sizeof("enforcing") - 1)) {
+			    (tag, "enforcing", sizeof("enforcing") - 1)) {
 				*enforce = 1;
 				ret = 0;
 				break;
 			} else
 			    if (!strncasecmp
-				(buf + len, "permissive",
+				(tag, "permissive",
 				 sizeof("permissive") - 1)) {
 				*enforce = 0;
 				ret = 0;
 				break;
 			} else
 			    if (!strncasecmp
-				(buf + len, "disabled",
+				(tag, "disabled",
 				 sizeof("disabled") - 1)) {
 				*enforce = -1;
 				ret = 0;
@@ -176,7 +180,10 @@  static void init_selinux_config(void)
 
 			if (!strncasecmp(buf_p, SELINUXTYPETAG,
 					 sizeof(SELINUXTYPETAG) - 1)) {
-				type = strdup(buf_p + sizeof(SELINUXTYPETAG) - 1);
+				buf_p += sizeof(SELINUXTYPETAG) - 1;
+				while (isspace(*buf_p))
+					buf_p++;
+				type = strdup(buf_p);
 				if (!type) {
 					free(line_buf);
 					fclose(fp);
@@ -199,6 +206,8 @@  static void init_selinux_config(void)
 			} else if (!strncmp(buf_p, REQUIRESEUSERS,
 					    sizeof(REQUIRESEUSERS) - 1)) {
 				value = buf_p + sizeof(REQUIRESEUSERS) - 1;
+				while (isspace(*value))
+					buf_p++;
 				intptr = &require_seusers;
 			} else {
 				continue;