commit d9bda20849c464eff0adb56414da1840abc6ef6a
Author:     Hiltjo Posthuma <[email protected]>
AuthorDate: Thu May 6 01:09:21 2021 +0200
Commit:     Hiltjo Posthuma <[email protected]>
CommitDate: Thu May 6 01:09:21 2021 +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.

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';
 }

Reply via email to