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 |
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 >
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 --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;
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(-)