diff mbox series

[v2] libselinux: Strip spaces before values in config

Message ID 20220217131415.1195383-1-vmojzis@redhat.com (mailing list archive)
State Accepted
Commit 4bab3ecc37e1
Headers show
Series [v2] libselinux: Strip spaces before values in config | expand

Commit Message

Vit Mojzis Feb. 17, 2022, 1:14 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>
---

Sorry for the delay. I sent the fixed patch to a wrong mailing list.

 libselinux/src/selinux_config.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Christian Göttsche Feb. 17, 2022, 2:16 p.m. UTC | #1
On Thu, 17 Feb 2022 at 14:14, 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>
> ---
>
> Sorry for the delay. I sent the fixed patch to a wrong mailing list.
>
>  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..d2e49ee1 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))

Strictly speaking one should cast to unsigned char to avoid UB, see
[1], but that
seems to be not done in SElinux userspace as

    grep -REw "(isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower|isprint|ispunct|isspace|isupper|isxdigit|toascii|toupper|tolower)"

shows 87 usages.

[1]: https://wiki.sei.cmu.edu/confluence/display/c/STR37-C.+Arguments+to+character-handling+functions+must+be+representable+as+an+unsigned+char

> +                                       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))
> +                                       value++;
>                                 intptr = &require_seusers;
>                         } else {
>                                 continue;
> --
> 2.30.2
>
Vit Mojzis Feb. 21, 2022, 10:31 a.m. UTC | #2
On 17. 02. 22 15:16, Christian Göttsche wrote:
> On Thu, 17 Feb 2022 at 14:14, 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>
>> ---
>>
>> Sorry for the delay. I sent the fixed patch to a wrong mailing list.
>>
>>   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..d2e49ee1 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))
> 
> Strictly speaking one should cast to unsigned char to avoid UB, see
> [1], but that
> seems to be not done in SElinux userspace as
> 
>      grep -REw "(isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower|isprint|ispunct|isspace|isupper|isxdigit|toascii|toupper|tolower)"
> 
> shows 87 usages.
> 
> [1]: https://wiki.sei.cmu.edu/confluence/display/c/STR37-C.+Arguments+to+character-handling+functions+must+be+representable+as+an+unsigned+char
> 


Right, thank you. So, should I fix the patch (which would make the use 
of the cast inconsistent in selinux_config.c), or leave it as is?
If this is something worth fixing I can make a new patch adding the cast 
to all the calls (except for cases where EOF can be expected? -- not 
sure if we need to watch for that).

Vit


>> +                                       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))
>> +                                       value++;
>>                                  intptr = &require_seusers;
>>                          } else {
>>                                  continue;
>> --
>> 2.30.2
>>
James Carter Feb. 28, 2022, 8:22 p.m. UTC | #3
On Thu, Feb 17, 2022 at 1:24 PM 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>

Acked-by: James Carter <jwcart2@gmail.com>

> ---
>
> Sorry for the delay. I sent the fixed patch to a wrong mailing list.
>
>  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..d2e49ee1 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))
> +                                       value++;
>                                 intptr = &require_seusers;
>                         } else {
>                                 continue;
> --
> 2.30.2
>
James Carter Feb. 28, 2022, 8:25 p.m. UTC | #4
On Mon, Feb 21, 2022 at 8:04 AM Vit Mojzis <vmojzis@redhat.com> wrote:
>
> On 17. 02. 22 15:16, Christian Göttsche wrote:
> > On Thu, 17 Feb 2022 at 14:14, 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>
> >> ---
> >>
> >> Sorry for the delay. I sent the fixed patch to a wrong mailing list.
> >>
> >>   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..d2e49ee1 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))
> >
> > Strictly speaking one should cast to unsigned char to avoid UB, see
> > [1], but that
> > seems to be not done in SElinux userspace as
> >
> >      grep -REw "(isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower|isprint|ispunct|isspace|isupper|isxdigit|toascii|toupper|tolower)"
> >
> > shows 87 usages.
> >
> > [1]: https://wiki.sei.cmu.edu/confluence/display/c/STR37-C.+Arguments+to+character-handling+functions+must+be+representable+as+an+unsigned+char
> >
>
>
> Right, thank you. So, should I fix the patch (which would make the use
> of the cast inconsistent in selinux_config.c), or leave it as is?
> If this is something worth fixing I can make a new patch adding the cast
> to all the calls (except for cases where EOF can be expected? -- not
> sure if we need to watch for that).
>
> Vit
>

Since, we aren't casting it to unsigned char anywhere else, I think
the patch is fine as it is. If we feel the need to fix up the other 87
usages someday, then we can fix this one then. It seems unlikely to
cause any problems.
Jim


>
> >> +                                       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))
> >> +                                       value++;
> >>                                  intptr = &require_seusers;
> >>                          } else {
> >>                                  continue;
> >> --
> >> 2.30.2
> >>
>
James Carter March 3, 2022, 6:18 p.m. UTC | #5
On Mon, Feb 28, 2022 at 3:22 PM James Carter <jwcart2@gmail.com> wrote:
>
> On Thu, Feb 17, 2022 at 1:24 PM 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>
>
> Acked-by: James Carter <jwcart2@gmail.com>
>

Merged.
Thanks,
Jim

> > ---
> >
> > Sorry for the delay. I sent the fixed patch to a wrong mailing list.
> >
> >  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..d2e49ee1 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))
> > +                                       value++;
> >                                 intptr = &require_seusers;
> >                         } else {
> >                                 continue;
> > --
> > 2.30.2
> >
diff mbox series

Patch

diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
index 97f81a8b..d2e49ee1 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))
+					value++;
 				intptr = &require_seusers;
 			} else {
 				continue;