fix undefined behaviour of using isspace ctype function - sic - simple irc clie… | |
git clone git://git.suckless.org/sic | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit d9bda20849c464eff0adb56414da1840abc6ef6a | |
parent df4c0611366bf361fa263fbc57009cbe68456855 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Thu, 6 May 2021 01:09:21 +0200 | |
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. | |
Diffstat: | |
M sic.c | 2 +- | |
M util.c | 4 ++-- | |
2 files changed, 3 insertions(+), 3 deletions(-) | |
--- | |
diff --git 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 | |
@@ -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'; | |
} |