From: Hiltjo Posthuma Date: Wed, 5 May 2021 23:09:21 +0000 (+0200) Subject: fix undefined behaviour of using isspace ctype function X-Git-Url: https://git.armaanb.net/?p=sic.git;a=commitdiff_plain;h=d9bda20849c464eff0adb56414da1840abc6ef6a;hp=df4c0611366bf361fa263fbc57009cbe68456855 fix undefined behaviour of using isspace ctype function cast all ctype(3) functions argument to (unsigned char) to avoid UB POSIX says: "The c argument is an int, the value of which the application shall ensure is a character representable as an unsigned char or equal to the value of the macro EOF. If the argument has any other value, the behavior is undefined." Many libc cast implicitly the value, but NetBSD for example does not, which is probably the correct thing to interpret it. --- diff --git a/sic.c b/sic.c index 774f357..c1e428e 100644 --- a/sic.c +++ b/sic.c @@ -74,7 +74,7 @@ parsein(char *s) { return; } c = *++s; - if(c != '\0' && isspace(s[1])) { + if(c != '\0' && isspace((unsigned char)s[1])) { p = s + 2; switch(c) { case 'j': diff --git a/util.c b/util.c index 2567812..0869cca 100644 --- a/util.c +++ b/util.c @@ -42,7 +42,7 @@ dial(char *host, char *port) { static char * eat(char *s, int (*p)(int), int r) { - while(*s != '\0' && p(*s) == r) + while(*s != '\0' && p((unsigned char)*s) == r) s++; return s; } @@ -61,7 +61,7 @@ trim(char *s) { char *e; e = s + strlen(s) - 1; - while(e > s && isspace(*e)) + while(e > s && isspace((unsigned char)*e)) e--; *(e + 1) = '\0'; }