diff mbox series

[v3,1/2] libselinux: cast to unsigned char for character handling function

Message ID 20231101165636.184983-1-cgzones@googlemail.com (mailing list archive)
State Accepted
Commit 3dad44a1a963
Delegated to: Petr Lautrbach
Headers show
Series [v3,1/2] libselinux: cast to unsigned char for character handling function | expand

Commit Message

Christian Göttsche Nov. 1, 2023, 4:56 p.m. UTC
Character handling functions, like isspace(3), expect a value
representable as unsigned char or equal to EOF.  Otherwise the behavior
is undefined.

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

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
---
v3:
  - compute_create.c: avoid cast by changing type of variable
  - drop RFC and split from original patch set
---
 libselinux/src/booleans.c                        |  8 ++++----
 libselinux/src/compute_create.c                  |  2 +-
 libselinux/src/get_context_list.c                | 12 ++++++------
 libselinux/src/get_default_type.c                |  2 +-
 libselinux/src/label_file.c                      |  8 ++++----
 libselinux/src/label_media.c                     |  2 +-
 libselinux/src/label_support.c                   |  8 ++++----
 libselinux/src/label_x.c                         |  2 +-
 libselinux/src/load_policy.c                     |  2 +-
 libselinux/src/matchmediacon.c                   |  6 +++---
 libselinux/src/selinux_check_securetty_context.c |  4 ++--
 libselinux/src/selinux_config.c                  | 12 ++++++------
 libselinux/src/seusers.c                         |  6 +++---
 13 files changed, 37 insertions(+), 37 deletions(-)

Comments

James Carter Nov. 6, 2023, 6:28 p.m. UTC | #1
On Wed, Nov 1, 2023 at 12:57 PM Christian Göttsche
<cgzones@googlemail.com> wrote:
>
> Character handling functions, like isspace(3), expect a value
> representable as unsigned char or equal to EOF.  Otherwise the behavior
> is undefined.
>
> See https://wiki.sei.cmu.edu/confluence/display/c/STR37-C.+Arguments+to+character-handling+functions+must+be+representable+as+an+unsigned+char
>
> Signed-off-by: Christian Göttsche <cgzones@googlemail.com>

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

> ---
> v3:
>   - compute_create.c: avoid cast by changing type of variable
>   - drop RFC and split from original patch set
> ---
>  libselinux/src/booleans.c                        |  8 ++++----
>  libselinux/src/compute_create.c                  |  2 +-
>  libselinux/src/get_context_list.c                | 12 ++++++------
>  libselinux/src/get_default_type.c                |  2 +-
>  libselinux/src/label_file.c                      |  8 ++++----
>  libselinux/src/label_media.c                     |  2 +-
>  libselinux/src/label_support.c                   |  8 ++++----
>  libselinux/src/label_x.c                         |  2 +-
>  libselinux/src/load_policy.c                     |  2 +-
>  libselinux/src/matchmediacon.c                   |  6 +++---
>  libselinux/src/selinux_check_securetty_context.c |  4 ++--
>  libselinux/src/selinux_config.c                  | 12 ++++++------
>  libselinux/src/seusers.c                         |  6 +++---
>  13 files changed, 37 insertions(+), 37 deletions(-)
>
> diff --git a/libselinux/src/booleans.c b/libselinux/src/booleans.c
> index e34b39ff..c557df65 100644
> --- a/libselinux/src/booleans.c
> +++ b/libselinux/src/booleans.c
> @@ -107,7 +107,7 @@ char *selinux_boolean_sub(const char *name)
>                 char *ptr;
>                 char *src = line_buf;
>                 char *dst;
> -               while (*src && isspace(*src))
> +               while (*src && isspace((unsigned char)*src))
>                         src++;
>                 if (!*src)
>                         continue;
> @@ -115,19 +115,19 @@ char *selinux_boolean_sub(const char *name)
>                         continue;
>
>                 ptr = src;
> -               while (*ptr && !isspace(*ptr))
> +               while (*ptr && !isspace((unsigned char)*ptr))
>                         ptr++;
>                 *ptr++ = '\0';
>                 if (strcmp(src, name) != 0)
>                         continue;
>
>                 dst = ptr;
> -               while (*dst && isspace(*dst))
> +               while (*dst && isspace((unsigned char)*dst))
>                         dst++;
>                 if (!*dst)
>                         continue;
>                 ptr = dst;
> -               while (*ptr && !isspace(*ptr))
> +               while (*ptr && !isspace((unsigned char)*ptr))
>                         ptr++;
>                 *ptr = '\0';
>
> diff --git a/libselinux/src/compute_create.c b/libselinux/src/compute_create.c
> index e9f3c96a..d19baa0b 100644
> --- a/libselinux/src/compute_create.c
> +++ b/libselinux/src/compute_create.c
> @@ -13,7 +13,7 @@
>
>  static int object_name_encode(const char *objname, char *buffer, size_t buflen)
>  {
> -       int     code;
> +       unsigned char code;
>         size_t  offset = 0;
>
>         if (buflen - offset < 1)
> diff --git a/libselinux/src/get_context_list.c b/libselinux/src/get_context_list.c
> index d774b9cf..0342823c 100644
> --- a/libselinux/src/get_context_list.c
> +++ b/libselinux/src/get_context_list.c
> @@ -170,27 +170,27 @@ static int get_context_user(FILE * fp,
>
>                 /* Skip leading whitespace. */
>                 start = line;
> -               while (*start && isspace(*start))
> +               while (*start && isspace((unsigned char)*start))
>                         start++;
>                 if (!(*start))
>                         continue;
>
>                 /* Find the end of the (partial) fromcon in the line. */
>                 end = start;
> -               while (*end && !isspace(*end))
> +               while (*end && !isspace((unsigned char)*end))
>                         end++;
>                 if (!(*end))
>                         continue;
>
>                 /* Check for a match. */
>                 linerole = start;
> -               while (*start && !isspace(*start) && *start != ':')
> +               while (*start && !isspace((unsigned char)*start) && *start != ':')
>                         start++;
>                 if (*start != ':')
>                         continue;
>                 *start = 0;
>                 linetype = ++start;
> -               while (*start && !isspace(*start) && *start != ':')
> +               while (*start && !isspace((unsigned char)*start) && *start != ':')
>                         start++;
>                 if (!(*start))
>                         continue;
> @@ -210,14 +210,14 @@ static int get_context_user(FILE * fp,
>         start = ++end;
>         while (*start) {
>                 /* Skip leading whitespace */
> -               while (*start && isspace(*start))
> +               while (*start && isspace((unsigned char)*start))
>                         start++;
>                 if (!(*start))
>                         break;
>
>                 /* Find the end of this partial context. */
>                 end = start;
> -               while (*end && !isspace(*end))
> +               while (*end && !isspace((unsigned char)*end))
>                         end++;
>                 if (*end)
>                         *end++ = 0;
> diff --git a/libselinux/src/get_default_type.c b/libselinux/src/get_default_type.c
> index 766ea4b7..87e9c72c 100644
> --- a/libselinux/src/get_default_type.c
> +++ b/libselinux/src/get_default_type.c
> @@ -42,7 +42,7 @@ static int find_default_type(FILE * fp, const char *role, char **type)
>                         buf[strlen(buf) - 1] = 0;
>
>                 ptr = buf;
> -               while (*ptr && isspace(*ptr))
> +               while (*ptr && isspace((unsigned char)*ptr))
>                         ptr++;
>                 if (!(*ptr))
>                         continue;
> diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
> index a665c9b4..4778f8f8 100644
> --- a/libselinux/src/label_file.c
> +++ b/libselinux/src/label_file.c
> @@ -708,20 +708,20 @@ static int selabel_subs_init(const char *path, struct selabel_digest *digest,
>                 char *src = buf;
>                 char *dst = NULL;
>
> -               while (*src && isspace(*src))
> +               while (*src && isspace((unsigned char)*src))
>                         src++;
>                 if (src[0] == '#') continue;
>                 ptr = src;
> -               while (*ptr && ! isspace(*ptr))
> +               while (*ptr && ! isspace((unsigned char)*ptr))
>                         ptr++;
>                 *ptr++ = '\0';
>                 if (! *src) continue;
>
>                 dst = ptr;
> -               while (*dst && isspace(*dst))
> +               while (*dst && isspace((unsigned char)*dst))
>                         dst++;
>                 ptr = dst;
> -               while (*ptr && ! isspace(*ptr))
> +               while (*ptr && ! isspace((unsigned char)*ptr))
>                         ptr++;
>                 *ptr = '\0';
>                 if (! *dst)
> diff --git a/libselinux/src/label_media.c b/libselinux/src/label_media.c
> index d33b614a..b3443b47 100644
> --- a/libselinux/src/label_media.c
> +++ b/libselinux/src/label_media.c
> @@ -39,7 +39,7 @@ static int process_line(const char *path, char *line_buf, int pass,
>         char *key, *context;
>
>         buf_p = line_buf;
> -       while (isspace(*buf_p))
> +       while (isspace((unsigned char)*buf_p))
>                 buf_p++;
>         /* Skip comment lines and empty lines. */
>         if (*buf_p == '#' || *buf_p == 0)
> diff --git a/libselinux/src/label_support.c b/libselinux/src/label_support.c
> index 49f72b1c..f7ab9292 100644
> --- a/libselinux/src/label_support.c
> +++ b/libselinux/src/label_support.c
> @@ -26,14 +26,14 @@ static inline int read_spec_entry(char **entry, char **ptr, int *len, const char
>         *entry = NULL;
>         char *tmp_buf = NULL;
>
> -       while (isspace(**ptr) && **ptr != '\0')
> +       while (isspace((unsigned char)**ptr) && **ptr != '\0')
>                 (*ptr)++;
>
>         tmp_buf = *ptr;
>         *len = 0;
>
> -       while (!isspace(**ptr) && **ptr != '\0') {
> -               if (!isascii(**ptr)) {
> +       while (!isspace((unsigned char)**ptr) && **ptr != '\0') {
> +               if (!isascii((unsigned char)**ptr)) {
>                         errno = EINVAL;
>                         *errbuf = "Non-ASCII characters found";
>                         return -1;
> @@ -80,7 +80,7 @@ int  read_spec_entries(char *line_buf, const char **errbuf, int num_args, ...)
>                 len++;
>
>         buf_p = line_buf;
> -       while (isspace(*buf_p))
> +       while (isspace((unsigned char)*buf_p))
>                 buf_p++;
>
>         /* Skip comment lines and empty lines. */
> diff --git a/libselinux/src/label_x.c b/libselinux/src/label_x.c
> index 4b8f524f..e15190ca 100644
> --- a/libselinux/src/label_x.c
> +++ b/libselinux/src/label_x.c
> @@ -41,7 +41,7 @@ static int process_line(const char *path, char *line_buf, int pass,
>         char *type, *key, *context;
>
>         buf_p = line_buf;
> -       while (isspace(*buf_p))
> +       while (isspace((unsigned char)*buf_p))
>                 buf_p++;
>         /* Skip comment lines and empty lines. */
>         if (*buf_p == '#' || *buf_p == 0)
> diff --git a/libselinux/src/load_policy.c b/libselinux/src/load_policy.c
> index 17918e8b..57d7aaef 100644
> --- a/libselinux/src/load_policy.c
> +++ b/libselinux/src/load_policy.c
> @@ -252,7 +252,7 @@ int selinux_init_load_policy(int *enforce)
>                 }
>                 if (fgets(buf, selinux_page_size, cfg) &&
>                     (tmp = strstr(buf, "enforcing="))) {
> -                       if (tmp == buf || isspace(*(tmp - 1))) {
> +                       if (tmp == buf || isspace((unsigned char)*(tmp - 1))) {
>                                 secmdline =
>                                     atoi(tmp + sizeof("enforcing=") - 1);
>                         }
> diff --git a/libselinux/src/matchmediacon.c b/libselinux/src/matchmediacon.c
> index d3d95043..6ba87b99 100644
> --- a/libselinux/src/matchmediacon.c
> +++ b/libselinux/src/matchmediacon.c
> @@ -29,7 +29,7 @@ int matchmediacon(const char *media, char ** con)
>                         current_line[strlen(current_line) - 1] = 0;
>                 /* Skip leading whitespace before the partial context. */
>                 ptr = current_line;
> -               while (*ptr && isspace(*ptr))
> +               while (*ptr && isspace((unsigned char)*ptr))
>                         ptr++;
>
>                 if (!(*ptr))
> @@ -37,7 +37,7 @@ int matchmediacon(const char *media, char ** con)
>
>                 /* Find the end of the media context. */
>                 ptr2 = ptr;
> -               while (*ptr2 && !isspace(*ptr2))
> +               while (*ptr2 && !isspace((unsigned char)*ptr2))
>                         ptr2++;
>                 if (!(*ptr2))
>                         continue;
> @@ -53,7 +53,7 @@ int matchmediacon(const char *media, char ** con)
>                 return -1;
>
>         /* Skip whitespace. */
> -       while (*ptr2 && isspace(*ptr2))
> +       while (*ptr2 && isspace((unsigned char)*ptr2))
>                 ptr2++;
>         if (!(*ptr2)) {
>                 return -1;
> diff --git a/libselinux/src/selinux_check_securetty_context.c b/libselinux/src/selinux_check_securetty_context.c
> index c5c557fd..7609752e 100644
> --- a/libselinux/src/selinux_check_securetty_context.c
> +++ b/libselinux/src/selinux_check_securetty_context.c
> @@ -26,13 +26,13 @@ int selinux_check_securetty_context(const char * tty_context)
>
>                                 /* Skip leading whitespace. */
>                                 start = line;
> -                               while (*start && isspace(*start))
> +                               while (*start && isspace((unsigned char)*start))
>                                         start++;
>                                 if (!(*start))
>                                         continue;
>
>                                 end = start;
> -                               while (*end && !isspace(*end))
> +                               while (*end && !isspace((unsigned char)*end))
>                                         end++;
>                                 if (*end)
>                                         *end++ = 0;
> diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
> index d2e49ee1..1d8cfb71 100644
> --- a/libselinux/src/selinux_config.c
> +++ b/libselinux/src/selinux_config.c
> @@ -103,7 +103,7 @@ int selinux_getenforcemode(int *enforce)
>                         if (strncmp(buf, SELINUXTAG, len))
>                                 continue;
>                         tag = buf+len;
> -                       while (isspace(*tag))
> +                       while (isspace((unsigned char)*tag))
>                                 tag++;
>                         if (!strncasecmp
>                             (tag, "enforcing", sizeof("enforcing") - 1)) {
> @@ -173,7 +173,7 @@ static void init_selinux_config(void)
>                         if (line_buf[len - 1] == '\n')
>                                 line_buf[len - 1] = 0;
>                         buf_p = line_buf;
> -                       while (isspace(*buf_p))
> +                       while (isspace((unsigned char)*buf_p))
>                                 buf_p++;
>                         if (*buf_p == '#' || *buf_p == 0)
>                                 continue;
> @@ -181,7 +181,7 @@ static void init_selinux_config(void)
>                         if (!strncasecmp(buf_p, SELINUXTYPETAG,
>                                          sizeof(SELINUXTYPETAG) - 1)) {
>                                 buf_p += sizeof(SELINUXTYPETAG) - 1;
> -                               while (isspace(*buf_p))
> +                               while (isspace((unsigned char)*buf_p))
>                                         buf_p++;
>                                 type = strdup(buf_p);
>                                 if (!type) {
> @@ -191,7 +191,7 @@ static void init_selinux_config(void)
>                                 }
>                                 end = type + strlen(type) - 1;
>                                 while ((end > type) &&
> -                                      (isspace(*end) || iscntrl(*end))) {
> +                                      (isspace((unsigned char)*end) || iscntrl((unsigned char)*end))) {
>                                         *end = 0;
>                                         end--;
>                                 }
> @@ -206,14 +206,14 @@ static void init_selinux_config(void)
>                         } else if (!strncmp(buf_p, REQUIRESEUSERS,
>                                             sizeof(REQUIRESEUSERS) - 1)) {
>                                 value = buf_p + sizeof(REQUIRESEUSERS) - 1;
> -                               while (isspace(*value))
> +                               while (isspace((unsigned char)*value))
>                                         value++;
>                                 intptr = &require_seusers;
>                         } else {
>                                 continue;
>                         }
>
> -                       if (isdigit(*value))
> +                       if (isdigit((unsigned char)*value))
>                                 *intptr = atoi(value);
>                         else if (strncasecmp(value, "true", sizeof("true") - 1))
>                                 *intptr = 1;
> diff --git a/libselinux/src/seusers.c b/libselinux/src/seusers.c
> index fff80c1a..6da8c318 100644
> --- a/libselinux/src/seusers.c
> +++ b/libselinux/src/seusers.c
> @@ -25,7 +25,7 @@ static int process_seusers(const char *buffer,
>                 goto err;
>
>         start = newbuf;
> -       while (isspace(*start))
> +       while (isspace((unsigned char)*start))
>                 start++;
>         if (*start == '#' || *start == 0) {
>                 free(newbuf);
> @@ -46,7 +46,7 @@ static int process_seusers(const char *buffer,
>                 mls_found = 0;
>
>                 end = start;
> -               while (*end && !isspace(*end))
> +               while (*end && !isspace((unsigned char)*end))
>                         end++;
>         }
>         *end = 0;
> @@ -63,7 +63,7 @@ static int process_seusers(const char *buffer,
>                 goto out;
>
>         start = ++end;
> -       while (*end && !isspace(*end))
> +       while (*end && !isspace((unsigned char)*end))
>                 end++;
>         *end = 0;
>
> --
> 2.42.0
>
James Carter Nov. 7, 2023, 9:43 p.m. UTC | #2
On Mon, Nov 6, 2023 at 1:28 PM James Carter <jwcart2@gmail.com> wrote:
>
> On Wed, Nov 1, 2023 at 12:57 PM Christian Göttsche
> <cgzones@googlemail.com> wrote:
> >
> > Character handling functions, like isspace(3), expect a value
> > representable as unsigned char or equal to EOF.  Otherwise the behavior
> > is undefined.
> >
> > See https://wiki.sei.cmu.edu/confluence/display/c/STR37-C.+Arguments+to+character-handling+functions+must+be+representable+as+an+unsigned+char
> >
> > Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
>
> Acked-by: James Carter <jwcart2@gmail.com>
>

These two patches have been merged.
Thanks,
Jim

> > ---
> > v3:
> >   - compute_create.c: avoid cast by changing type of variable
> >   - drop RFC and split from original patch set
> > ---
> >  libselinux/src/booleans.c                        |  8 ++++----
> >  libselinux/src/compute_create.c                  |  2 +-
> >  libselinux/src/get_context_list.c                | 12 ++++++------
> >  libselinux/src/get_default_type.c                |  2 +-
> >  libselinux/src/label_file.c                      |  8 ++++----
> >  libselinux/src/label_media.c                     |  2 +-
> >  libselinux/src/label_support.c                   |  8 ++++----
> >  libselinux/src/label_x.c                         |  2 +-
> >  libselinux/src/load_policy.c                     |  2 +-
> >  libselinux/src/matchmediacon.c                   |  6 +++---
> >  libselinux/src/selinux_check_securetty_context.c |  4 ++--
> >  libselinux/src/selinux_config.c                  | 12 ++++++------
> >  libselinux/src/seusers.c                         |  6 +++---
> >  13 files changed, 37 insertions(+), 37 deletions(-)
> >
> > diff --git a/libselinux/src/booleans.c b/libselinux/src/booleans.c
> > index e34b39ff..c557df65 100644
> > --- a/libselinux/src/booleans.c
> > +++ b/libselinux/src/booleans.c
> > @@ -107,7 +107,7 @@ char *selinux_boolean_sub(const char *name)
> >                 char *ptr;
> >                 char *src = line_buf;
> >                 char *dst;
> > -               while (*src && isspace(*src))
> > +               while (*src && isspace((unsigned char)*src))
> >                         src++;
> >                 if (!*src)
> >                         continue;
> > @@ -115,19 +115,19 @@ char *selinux_boolean_sub(const char *name)
> >                         continue;
> >
> >                 ptr = src;
> > -               while (*ptr && !isspace(*ptr))
> > +               while (*ptr && !isspace((unsigned char)*ptr))
> >                         ptr++;
> >                 *ptr++ = '\0';
> >                 if (strcmp(src, name) != 0)
> >                         continue;
> >
> >                 dst = ptr;
> > -               while (*dst && isspace(*dst))
> > +               while (*dst && isspace((unsigned char)*dst))
> >                         dst++;
> >                 if (!*dst)
> >                         continue;
> >                 ptr = dst;
> > -               while (*ptr && !isspace(*ptr))
> > +               while (*ptr && !isspace((unsigned char)*ptr))
> >                         ptr++;
> >                 *ptr = '\0';
> >
> > diff --git a/libselinux/src/compute_create.c b/libselinux/src/compute_create.c
> > index e9f3c96a..d19baa0b 100644
> > --- a/libselinux/src/compute_create.c
> > +++ b/libselinux/src/compute_create.c
> > @@ -13,7 +13,7 @@
> >
> >  static int object_name_encode(const char *objname, char *buffer, size_t buflen)
> >  {
> > -       int     code;
> > +       unsigned char code;
> >         size_t  offset = 0;
> >
> >         if (buflen - offset < 1)
> > diff --git a/libselinux/src/get_context_list.c b/libselinux/src/get_context_list.c
> > index d774b9cf..0342823c 100644
> > --- a/libselinux/src/get_context_list.c
> > +++ b/libselinux/src/get_context_list.c
> > @@ -170,27 +170,27 @@ static int get_context_user(FILE * fp,
> >
> >                 /* Skip leading whitespace. */
> >                 start = line;
> > -               while (*start && isspace(*start))
> > +               while (*start && isspace((unsigned char)*start))
> >                         start++;
> >                 if (!(*start))
> >                         continue;
> >
> >                 /* Find the end of the (partial) fromcon in the line. */
> >                 end = start;
> > -               while (*end && !isspace(*end))
> > +               while (*end && !isspace((unsigned char)*end))
> >                         end++;
> >                 if (!(*end))
> >                         continue;
> >
> >                 /* Check for a match. */
> >                 linerole = start;
> > -               while (*start && !isspace(*start) && *start != ':')
> > +               while (*start && !isspace((unsigned char)*start) && *start != ':')
> >                         start++;
> >                 if (*start != ':')
> >                         continue;
> >                 *start = 0;
> >                 linetype = ++start;
> > -               while (*start && !isspace(*start) && *start != ':')
> > +               while (*start && !isspace((unsigned char)*start) && *start != ':')
> >                         start++;
> >                 if (!(*start))
> >                         continue;
> > @@ -210,14 +210,14 @@ static int get_context_user(FILE * fp,
> >         start = ++end;
> >         while (*start) {
> >                 /* Skip leading whitespace */
> > -               while (*start && isspace(*start))
> > +               while (*start && isspace((unsigned char)*start))
> >                         start++;
> >                 if (!(*start))
> >                         break;
> >
> >                 /* Find the end of this partial context. */
> >                 end = start;
> > -               while (*end && !isspace(*end))
> > +               while (*end && !isspace((unsigned char)*end))
> >                         end++;
> >                 if (*end)
> >                         *end++ = 0;
> > diff --git a/libselinux/src/get_default_type.c b/libselinux/src/get_default_type.c
> > index 766ea4b7..87e9c72c 100644
> > --- a/libselinux/src/get_default_type.c
> > +++ b/libselinux/src/get_default_type.c
> > @@ -42,7 +42,7 @@ static int find_default_type(FILE * fp, const char *role, char **type)
> >                         buf[strlen(buf) - 1] = 0;
> >
> >                 ptr = buf;
> > -               while (*ptr && isspace(*ptr))
> > +               while (*ptr && isspace((unsigned char)*ptr))
> >                         ptr++;
> >                 if (!(*ptr))
> >                         continue;
> > diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
> > index a665c9b4..4778f8f8 100644
> > --- a/libselinux/src/label_file.c
> > +++ b/libselinux/src/label_file.c
> > @@ -708,20 +708,20 @@ static int selabel_subs_init(const char *path, struct selabel_digest *digest,
> >                 char *src = buf;
> >                 char *dst = NULL;
> >
> > -               while (*src && isspace(*src))
> > +               while (*src && isspace((unsigned char)*src))
> >                         src++;
> >                 if (src[0] == '#') continue;
> >                 ptr = src;
> > -               while (*ptr && ! isspace(*ptr))
> > +               while (*ptr && ! isspace((unsigned char)*ptr))
> >                         ptr++;
> >                 *ptr++ = '\0';
> >                 if (! *src) continue;
> >
> >                 dst = ptr;
> > -               while (*dst && isspace(*dst))
> > +               while (*dst && isspace((unsigned char)*dst))
> >                         dst++;
> >                 ptr = dst;
> > -               while (*ptr && ! isspace(*ptr))
> > +               while (*ptr && ! isspace((unsigned char)*ptr))
> >                         ptr++;
> >                 *ptr = '\0';
> >                 if (! *dst)
> > diff --git a/libselinux/src/label_media.c b/libselinux/src/label_media.c
> > index d33b614a..b3443b47 100644
> > --- a/libselinux/src/label_media.c
> > +++ b/libselinux/src/label_media.c
> > @@ -39,7 +39,7 @@ static int process_line(const char *path, char *line_buf, int pass,
> >         char *key, *context;
> >
> >         buf_p = line_buf;
> > -       while (isspace(*buf_p))
> > +       while (isspace((unsigned char)*buf_p))
> >                 buf_p++;
> >         /* Skip comment lines and empty lines. */
> >         if (*buf_p == '#' || *buf_p == 0)
> > diff --git a/libselinux/src/label_support.c b/libselinux/src/label_support.c
> > index 49f72b1c..f7ab9292 100644
> > --- a/libselinux/src/label_support.c
> > +++ b/libselinux/src/label_support.c
> > @@ -26,14 +26,14 @@ static inline int read_spec_entry(char **entry, char **ptr, int *len, const char
> >         *entry = NULL;
> >         char *tmp_buf = NULL;
> >
> > -       while (isspace(**ptr) && **ptr != '\0')
> > +       while (isspace((unsigned char)**ptr) && **ptr != '\0')
> >                 (*ptr)++;
> >
> >         tmp_buf = *ptr;
> >         *len = 0;
> >
> > -       while (!isspace(**ptr) && **ptr != '\0') {
> > -               if (!isascii(**ptr)) {
> > +       while (!isspace((unsigned char)**ptr) && **ptr != '\0') {
> > +               if (!isascii((unsigned char)**ptr)) {
> >                         errno = EINVAL;
> >                         *errbuf = "Non-ASCII characters found";
> >                         return -1;
> > @@ -80,7 +80,7 @@ int  read_spec_entries(char *line_buf, const char **errbuf, int num_args, ...)
> >                 len++;
> >
> >         buf_p = line_buf;
> > -       while (isspace(*buf_p))
> > +       while (isspace((unsigned char)*buf_p))
> >                 buf_p++;
> >
> >         /* Skip comment lines and empty lines. */
> > diff --git a/libselinux/src/label_x.c b/libselinux/src/label_x.c
> > index 4b8f524f..e15190ca 100644
> > --- a/libselinux/src/label_x.c
> > +++ b/libselinux/src/label_x.c
> > @@ -41,7 +41,7 @@ static int process_line(const char *path, char *line_buf, int pass,
> >         char *type, *key, *context;
> >
> >         buf_p = line_buf;
> > -       while (isspace(*buf_p))
> > +       while (isspace((unsigned char)*buf_p))
> >                 buf_p++;
> >         /* Skip comment lines and empty lines. */
> >         if (*buf_p == '#' || *buf_p == 0)
> > diff --git a/libselinux/src/load_policy.c b/libselinux/src/load_policy.c
> > index 17918e8b..57d7aaef 100644
> > --- a/libselinux/src/load_policy.c
> > +++ b/libselinux/src/load_policy.c
> > @@ -252,7 +252,7 @@ int selinux_init_load_policy(int *enforce)
> >                 }
> >                 if (fgets(buf, selinux_page_size, cfg) &&
> >                     (tmp = strstr(buf, "enforcing="))) {
> > -                       if (tmp == buf || isspace(*(tmp - 1))) {
> > +                       if (tmp == buf || isspace((unsigned char)*(tmp - 1))) {
> >                                 secmdline =
> >                                     atoi(tmp + sizeof("enforcing=") - 1);
> >                         }
> > diff --git a/libselinux/src/matchmediacon.c b/libselinux/src/matchmediacon.c
> > index d3d95043..6ba87b99 100644
> > --- a/libselinux/src/matchmediacon.c
> > +++ b/libselinux/src/matchmediacon.c
> > @@ -29,7 +29,7 @@ int matchmediacon(const char *media, char ** con)
> >                         current_line[strlen(current_line) - 1] = 0;
> >                 /* Skip leading whitespace before the partial context. */
> >                 ptr = current_line;
> > -               while (*ptr && isspace(*ptr))
> > +               while (*ptr && isspace((unsigned char)*ptr))
> >                         ptr++;
> >
> >                 if (!(*ptr))
> > @@ -37,7 +37,7 @@ int matchmediacon(const char *media, char ** con)
> >
> >                 /* Find the end of the media context. */
> >                 ptr2 = ptr;
> > -               while (*ptr2 && !isspace(*ptr2))
> > +               while (*ptr2 && !isspace((unsigned char)*ptr2))
> >                         ptr2++;
> >                 if (!(*ptr2))
> >                         continue;
> > @@ -53,7 +53,7 @@ int matchmediacon(const char *media, char ** con)
> >                 return -1;
> >
> >         /* Skip whitespace. */
> > -       while (*ptr2 && isspace(*ptr2))
> > +       while (*ptr2 && isspace((unsigned char)*ptr2))
> >                 ptr2++;
> >         if (!(*ptr2)) {
> >                 return -1;
> > diff --git a/libselinux/src/selinux_check_securetty_context.c b/libselinux/src/selinux_check_securetty_context.c
> > index c5c557fd..7609752e 100644
> > --- a/libselinux/src/selinux_check_securetty_context.c
> > +++ b/libselinux/src/selinux_check_securetty_context.c
> > @@ -26,13 +26,13 @@ int selinux_check_securetty_context(const char * tty_context)
> >
> >                                 /* Skip leading whitespace. */
> >                                 start = line;
> > -                               while (*start && isspace(*start))
> > +                               while (*start && isspace((unsigned char)*start))
> >                                         start++;
> >                                 if (!(*start))
> >                                         continue;
> >
> >                                 end = start;
> > -                               while (*end && !isspace(*end))
> > +                               while (*end && !isspace((unsigned char)*end))
> >                                         end++;
> >                                 if (*end)
> >                                         *end++ = 0;
> > diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
> > index d2e49ee1..1d8cfb71 100644
> > --- a/libselinux/src/selinux_config.c
> > +++ b/libselinux/src/selinux_config.c
> > @@ -103,7 +103,7 @@ int selinux_getenforcemode(int *enforce)
> >                         if (strncmp(buf, SELINUXTAG, len))
> >                                 continue;
> >                         tag = buf+len;
> > -                       while (isspace(*tag))
> > +                       while (isspace((unsigned char)*tag))
> >                                 tag++;
> >                         if (!strncasecmp
> >                             (tag, "enforcing", sizeof("enforcing") - 1)) {
> > @@ -173,7 +173,7 @@ static void init_selinux_config(void)
> >                         if (line_buf[len - 1] == '\n')
> >                                 line_buf[len - 1] = 0;
> >                         buf_p = line_buf;
> > -                       while (isspace(*buf_p))
> > +                       while (isspace((unsigned char)*buf_p))
> >                                 buf_p++;
> >                         if (*buf_p == '#' || *buf_p == 0)
> >                                 continue;
> > @@ -181,7 +181,7 @@ static void init_selinux_config(void)
> >                         if (!strncasecmp(buf_p, SELINUXTYPETAG,
> >                                          sizeof(SELINUXTYPETAG) - 1)) {
> >                                 buf_p += sizeof(SELINUXTYPETAG) - 1;
> > -                               while (isspace(*buf_p))
> > +                               while (isspace((unsigned char)*buf_p))
> >                                         buf_p++;
> >                                 type = strdup(buf_p);
> >                                 if (!type) {
> > @@ -191,7 +191,7 @@ static void init_selinux_config(void)
> >                                 }
> >                                 end = type + strlen(type) - 1;
> >                                 while ((end > type) &&
> > -                                      (isspace(*end) || iscntrl(*end))) {
> > +                                      (isspace((unsigned char)*end) || iscntrl((unsigned char)*end))) {
> >                                         *end = 0;
> >                                         end--;
> >                                 }
> > @@ -206,14 +206,14 @@ static void init_selinux_config(void)
> >                         } else if (!strncmp(buf_p, REQUIRESEUSERS,
> >                                             sizeof(REQUIRESEUSERS) - 1)) {
> >                                 value = buf_p + sizeof(REQUIRESEUSERS) - 1;
> > -                               while (isspace(*value))
> > +                               while (isspace((unsigned char)*value))
> >                                         value++;
> >                                 intptr = &require_seusers;
> >                         } else {
> >                                 continue;
> >                         }
> >
> > -                       if (isdigit(*value))
> > +                       if (isdigit((unsigned char)*value))
> >                                 *intptr = atoi(value);
> >                         else if (strncasecmp(value, "true", sizeof("true") - 1))
> >                                 *intptr = 1;
> > diff --git a/libselinux/src/seusers.c b/libselinux/src/seusers.c
> > index fff80c1a..6da8c318 100644
> > --- a/libselinux/src/seusers.c
> > +++ b/libselinux/src/seusers.c
> > @@ -25,7 +25,7 @@ static int process_seusers(const char *buffer,
> >                 goto err;
> >
> >         start = newbuf;
> > -       while (isspace(*start))
> > +       while (isspace((unsigned char)*start))
> >                 start++;
> >         if (*start == '#' || *start == 0) {
> >                 free(newbuf);
> > @@ -46,7 +46,7 @@ static int process_seusers(const char *buffer,
> >                 mls_found = 0;
> >
> >                 end = start;
> > -               while (*end && !isspace(*end))
> > +               while (*end && !isspace((unsigned char)*end))
> >                         end++;
> >         }
> >         *end = 0;
> > @@ -63,7 +63,7 @@ static int process_seusers(const char *buffer,
> >                 goto out;
> >
> >         start = ++end;
> > -       while (*end && !isspace(*end))
> > +       while (*end && !isspace((unsigned char)*end))
> >                 end++;
> >         *end = 0;
> >
> > --
> > 2.42.0
> >
diff mbox series

Patch

diff --git a/libselinux/src/booleans.c b/libselinux/src/booleans.c
index e34b39ff..c557df65 100644
--- a/libselinux/src/booleans.c
+++ b/libselinux/src/booleans.c
@@ -107,7 +107,7 @@  char *selinux_boolean_sub(const char *name)
 		char *ptr;
 		char *src = line_buf;
 		char *dst;
-		while (*src && isspace(*src))
+		while (*src && isspace((unsigned char)*src))
 			src++;
 		if (!*src)
 			continue;
@@ -115,19 +115,19 @@  char *selinux_boolean_sub(const char *name)
 			continue;
 
 		ptr = src;
-		while (*ptr && !isspace(*ptr))
+		while (*ptr && !isspace((unsigned char)*ptr))
 			ptr++;
 		*ptr++ = '\0';
 		if (strcmp(src, name) != 0)
 			continue;
 
 		dst = ptr;
-		while (*dst && isspace(*dst))
+		while (*dst && isspace((unsigned char)*dst))
 			dst++;
 		if (!*dst)
 			continue;
 		ptr = dst;
-		while (*ptr && !isspace(*ptr))
+		while (*ptr && !isspace((unsigned char)*ptr))
 			ptr++;
 		*ptr = '\0';
 
diff --git a/libselinux/src/compute_create.c b/libselinux/src/compute_create.c
index e9f3c96a..d19baa0b 100644
--- a/libselinux/src/compute_create.c
+++ b/libselinux/src/compute_create.c
@@ -13,7 +13,7 @@ 
 
 static int object_name_encode(const char *objname, char *buffer, size_t buflen)
 {
-	int	code;
+	unsigned char code;
 	size_t	offset = 0;
 
 	if (buflen - offset < 1)
diff --git a/libselinux/src/get_context_list.c b/libselinux/src/get_context_list.c
index d774b9cf..0342823c 100644
--- a/libselinux/src/get_context_list.c
+++ b/libselinux/src/get_context_list.c
@@ -170,27 +170,27 @@  static int get_context_user(FILE * fp,
 
 		/* Skip leading whitespace. */
 		start = line;
-		while (*start && isspace(*start))
+		while (*start && isspace((unsigned char)*start))
 			start++;
 		if (!(*start))
 			continue;
 
 		/* Find the end of the (partial) fromcon in the line. */
 		end = start;
-		while (*end && !isspace(*end))
+		while (*end && !isspace((unsigned char)*end))
 			end++;
 		if (!(*end))
 			continue;
 
 		/* Check for a match. */
 		linerole = start;
-		while (*start && !isspace(*start) && *start != ':')
+		while (*start && !isspace((unsigned char)*start) && *start != ':')
 			start++;
 		if (*start != ':')
 			continue;
 		*start = 0;
 		linetype = ++start;
-		while (*start && !isspace(*start) && *start != ':')
+		while (*start && !isspace((unsigned char)*start) && *start != ':')
 			start++;
 		if (!(*start))
 			continue;
@@ -210,14 +210,14 @@  static int get_context_user(FILE * fp,
 	start = ++end;
 	while (*start) {
 		/* Skip leading whitespace */
-		while (*start && isspace(*start))
+		while (*start && isspace((unsigned char)*start))
 			start++;
 		if (!(*start))
 			break;
 
 		/* Find the end of this partial context. */
 		end = start;
-		while (*end && !isspace(*end))
+		while (*end && !isspace((unsigned char)*end))
 			end++;
 		if (*end)
 			*end++ = 0;
diff --git a/libselinux/src/get_default_type.c b/libselinux/src/get_default_type.c
index 766ea4b7..87e9c72c 100644
--- a/libselinux/src/get_default_type.c
+++ b/libselinux/src/get_default_type.c
@@ -42,7 +42,7 @@  static int find_default_type(FILE * fp, const char *role, char **type)
 			buf[strlen(buf) - 1] = 0;
 
 		ptr = buf;
-		while (*ptr && isspace(*ptr))
+		while (*ptr && isspace((unsigned char)*ptr))
 			ptr++;
 		if (!(*ptr))
 			continue;
diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
index a665c9b4..4778f8f8 100644
--- a/libselinux/src/label_file.c
+++ b/libselinux/src/label_file.c
@@ -708,20 +708,20 @@  static int selabel_subs_init(const char *path, struct selabel_digest *digest,
 		char *src = buf;
 		char *dst = NULL;
 
-		while (*src && isspace(*src))
+		while (*src && isspace((unsigned char)*src))
 			src++;
 		if (src[0] == '#') continue;
 		ptr = src;
-		while (*ptr && ! isspace(*ptr))
+		while (*ptr && ! isspace((unsigned char)*ptr))
 			ptr++;
 		*ptr++ = '\0';
 		if (! *src) continue;
 
 		dst = ptr;
-		while (*dst && isspace(*dst))
+		while (*dst && isspace((unsigned char)*dst))
 			dst++;
 		ptr = dst;
-		while (*ptr && ! isspace(*ptr))
+		while (*ptr && ! isspace((unsigned char)*ptr))
 			ptr++;
 		*ptr = '\0';
 		if (! *dst)
diff --git a/libselinux/src/label_media.c b/libselinux/src/label_media.c
index d33b614a..b3443b47 100644
--- a/libselinux/src/label_media.c
+++ b/libselinux/src/label_media.c
@@ -39,7 +39,7 @@  static int process_line(const char *path, char *line_buf, int pass,
 	char *key, *context;
 
 	buf_p = line_buf;
-	while (isspace(*buf_p))
+	while (isspace((unsigned char)*buf_p))
 		buf_p++;
 	/* Skip comment lines and empty lines. */
 	if (*buf_p == '#' || *buf_p == 0)
diff --git a/libselinux/src/label_support.c b/libselinux/src/label_support.c
index 49f72b1c..f7ab9292 100644
--- a/libselinux/src/label_support.c
+++ b/libselinux/src/label_support.c
@@ -26,14 +26,14 @@  static inline int read_spec_entry(char **entry, char **ptr, int *len, const char
 	*entry = NULL;
 	char *tmp_buf = NULL;
 
-	while (isspace(**ptr) && **ptr != '\0')
+	while (isspace((unsigned char)**ptr) && **ptr != '\0')
 		(*ptr)++;
 
 	tmp_buf = *ptr;
 	*len = 0;
 
-	while (!isspace(**ptr) && **ptr != '\0') {
-		if (!isascii(**ptr)) {
+	while (!isspace((unsigned char)**ptr) && **ptr != '\0') {
+		if (!isascii((unsigned char)**ptr)) {
 			errno = EINVAL;
 			*errbuf = "Non-ASCII characters found";
 			return -1;
@@ -80,7 +80,7 @@  int  read_spec_entries(char *line_buf, const char **errbuf, int num_args, ...)
 		len++;
 
 	buf_p = line_buf;
-	while (isspace(*buf_p))
+	while (isspace((unsigned char)*buf_p))
 		buf_p++;
 
 	/* Skip comment lines and empty lines. */
diff --git a/libselinux/src/label_x.c b/libselinux/src/label_x.c
index 4b8f524f..e15190ca 100644
--- a/libselinux/src/label_x.c
+++ b/libselinux/src/label_x.c
@@ -41,7 +41,7 @@  static int process_line(const char *path, char *line_buf, int pass,
 	char *type, *key, *context;
 
 	buf_p = line_buf;
-	while (isspace(*buf_p))
+	while (isspace((unsigned char)*buf_p))
 		buf_p++;
 	/* Skip comment lines and empty lines. */
 	if (*buf_p == '#' || *buf_p == 0)
diff --git a/libselinux/src/load_policy.c b/libselinux/src/load_policy.c
index 17918e8b..57d7aaef 100644
--- a/libselinux/src/load_policy.c
+++ b/libselinux/src/load_policy.c
@@ -252,7 +252,7 @@  int selinux_init_load_policy(int *enforce)
 		}
 		if (fgets(buf, selinux_page_size, cfg) &&
 		    (tmp = strstr(buf, "enforcing="))) {
-			if (tmp == buf || isspace(*(tmp - 1))) {
+			if (tmp == buf || isspace((unsigned char)*(tmp - 1))) {
 				secmdline =
 				    atoi(tmp + sizeof("enforcing=") - 1);
 			}
diff --git a/libselinux/src/matchmediacon.c b/libselinux/src/matchmediacon.c
index d3d95043..6ba87b99 100644
--- a/libselinux/src/matchmediacon.c
+++ b/libselinux/src/matchmediacon.c
@@ -29,7 +29,7 @@  int matchmediacon(const char *media, char ** con)
 			current_line[strlen(current_line) - 1] = 0;
 		/* Skip leading whitespace before the partial context. */
 		ptr = current_line;
-		while (*ptr && isspace(*ptr))
+		while (*ptr && isspace((unsigned char)*ptr))
 			ptr++;
 
 		if (!(*ptr))
@@ -37,7 +37,7 @@  int matchmediacon(const char *media, char ** con)
 
 		/* Find the end of the media context. */
 		ptr2 = ptr;
-		while (*ptr2 && !isspace(*ptr2))
+		while (*ptr2 && !isspace((unsigned char)*ptr2))
 			ptr2++;
 		if (!(*ptr2))
 			continue;
@@ -53,7 +53,7 @@  int matchmediacon(const char *media, char ** con)
 		return -1;
 
 	/* Skip whitespace. */
-	while (*ptr2 && isspace(*ptr2))
+	while (*ptr2 && isspace((unsigned char)*ptr2))
 		ptr2++;
 	if (!(*ptr2)) {
 		return -1;
diff --git a/libselinux/src/selinux_check_securetty_context.c b/libselinux/src/selinux_check_securetty_context.c
index c5c557fd..7609752e 100644
--- a/libselinux/src/selinux_check_securetty_context.c
+++ b/libselinux/src/selinux_check_securetty_context.c
@@ -26,13 +26,13 @@  int selinux_check_securetty_context(const char * tty_context)
 
 				/* Skip leading whitespace. */
 				start = line;
-				while (*start && isspace(*start))
+				while (*start && isspace((unsigned char)*start))
 					start++;
 				if (!(*start))
 					continue;
 
 				end = start;
-				while (*end && !isspace(*end))
+				while (*end && !isspace((unsigned char)*end))
 					end++;
 				if (*end)
 					*end++ = 0;
diff --git a/libselinux/src/selinux_config.c b/libselinux/src/selinux_config.c
index d2e49ee1..1d8cfb71 100644
--- a/libselinux/src/selinux_config.c
+++ b/libselinux/src/selinux_config.c
@@ -103,7 +103,7 @@  int selinux_getenforcemode(int *enforce)
 			if (strncmp(buf, SELINUXTAG, len))
 				continue;
 			tag = buf+len;
-			while (isspace(*tag))
+			while (isspace((unsigned char)*tag))
 				tag++;
 			if (!strncasecmp
 			    (tag, "enforcing", sizeof("enforcing") - 1)) {
@@ -173,7 +173,7 @@  static void init_selinux_config(void)
 			if (line_buf[len - 1] == '\n')
 				line_buf[len - 1] = 0;
 			buf_p = line_buf;
-			while (isspace(*buf_p))
+			while (isspace((unsigned char)*buf_p))
 				buf_p++;
 			if (*buf_p == '#' || *buf_p == 0)
 				continue;
@@ -181,7 +181,7 @@  static void init_selinux_config(void)
 			if (!strncasecmp(buf_p, SELINUXTYPETAG,
 					 sizeof(SELINUXTYPETAG) - 1)) {
 				buf_p += sizeof(SELINUXTYPETAG) - 1;
-				while (isspace(*buf_p))
+				while (isspace((unsigned char)*buf_p))
 					buf_p++;
 				type = strdup(buf_p);
 				if (!type) {
@@ -191,7 +191,7 @@  static void init_selinux_config(void)
 				}
 				end = type + strlen(type) - 1;
 				while ((end > type) &&
-				       (isspace(*end) || iscntrl(*end))) {
+				       (isspace((unsigned char)*end) || iscntrl((unsigned char)*end))) {
 					*end = 0;
 					end--;
 				}
@@ -206,14 +206,14 @@  static void init_selinux_config(void)
 			} else if (!strncmp(buf_p, REQUIRESEUSERS,
 					    sizeof(REQUIRESEUSERS) - 1)) {
 				value = buf_p + sizeof(REQUIRESEUSERS) - 1;
-				while (isspace(*value))
+				while (isspace((unsigned char)*value))
 					value++;
 				intptr = &require_seusers;
 			} else {
 				continue;
 			}
 
-			if (isdigit(*value))
+			if (isdigit((unsigned char)*value))
 				*intptr = atoi(value);
 			else if (strncasecmp(value, "true", sizeof("true") - 1))
 				*intptr = 1;
diff --git a/libselinux/src/seusers.c b/libselinux/src/seusers.c
index fff80c1a..6da8c318 100644
--- a/libselinux/src/seusers.c
+++ b/libselinux/src/seusers.c
@@ -25,7 +25,7 @@  static int process_seusers(const char *buffer,
 		goto err;
 
 	start = newbuf;
-	while (isspace(*start))
+	while (isspace((unsigned char)*start))
 		start++;
 	if (*start == '#' || *start == 0) {
 		free(newbuf);
@@ -46,7 +46,7 @@  static int process_seusers(const char *buffer,
 		mls_found = 0;
 
 		end = start;
-		while (*end && !isspace(*end))
+		while (*end && !isspace((unsigned char)*end))
 			end++;
 	}
 	*end = 0;
@@ -63,7 +63,7 @@  static int process_seusers(const char *buffer,
 		goto out;
 
 	start = ++end;
-	while (*end && !isspace(*end))
+	while (*end && !isspace((unsigned char)*end))
 		end++;
 	*end = 0;