Commit 18295f0c authored by Richard Levitte's avatar Richard Levitte
Browse files

Make sure to use unsigned char for is*() functions



On some platforms, the implementation is such that a signed char
triggers a warning when used with is*() functions.  On others, the
behavior is outright buggy when presented with a char that happens
to get promoted to a negative integer.

The safest thing is to cast the char that's used to an unsigned char.

Reviewed-by: default avatarAndy Polyakov <appro@openssl.org>
parent ef8ca6bd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ int chopup_args(ARGS *arg, char *buf)

    for (p = buf;;) {
        /* Skip whitespace. */
        while (*p && isspace(*p))
        while (*p && isspace(_UC(*p)))
            p++;
        if (!*p)
            break;
@@ -207,7 +207,7 @@ int chopup_args(ARGS *arg, char *buf)
                p++;
            *p++ = '\0';
        } else {
            while (*p && !isspace(*p))
            while (*p && !isspace(_UC(*p)))
                p++;
            if (*p)
                *p++ = '\0';
+7 −0
Original line number Diff line number Diff line
@@ -149,6 +149,13 @@ int opt_umax(const char *value, uintmax_t *result);
#  define uintmax_t unsigned long
# endif

/*
 * quick macro when you need to pass an unsigned char instead of a char.
 * this is true for some implementations of the is*() functions, for
 * example.
 */
#define _UC(c) ((unsigned char)(c))

int app_RAND_load_file(const char *file, int dont_warn);
int app_RAND_write_file(const char *file);
/*
+1 −1
Original line number Diff line number Diff line
@@ -731,7 +731,7 @@ end_of_options:
            goto end;
        }
        for ( ; *p; p++) {
            if (!isxdigit(*p)) {
            if (!isxdigit(_UC(*p))) {
                BIO_printf(bio_err,
                           "entry %d: bad char 0%o '%c' in serial number\n",
                           i + 1, *p, *p);
+1 −1
Original line number Diff line number Diff line
@@ -1065,7 +1065,7 @@ static int urldecode(char *p)
    for (; *p; p++) {
        if (*p != '%')
            *out++ = *p;
        else if (isxdigit(p[1]) && isxdigit(p[2])) {
        else if (isxdigit(_UC(p[1])) && isxdigit(_UC(p[2]))) {
            *out++ = (app_hex(p[1]) << 4) | app_hex(p[2]);
            p += 2;
        }
+5 −5
Original line number Diff line number Diff line
@@ -509,9 +509,9 @@ static ossl_ssize_t hexdecode(const char **inptr, void *result)
    for (byte = 0; *in; ++in) {
        char c;

        if (isspace(*in))
        if (isspace(_UC(*in)))
            continue;
        c = tolower(*in);
        c = tolower(_UC(*in));
        if ('0' <= c && c <= '9') {
            byte |= c - '0';
        } else if ('a' <= c && c <= 'f') {
@@ -553,11 +553,11 @@ static ossl_ssize_t checked_uint8(const char **inptr, void *out)
    e = restore_errno();

    if (((v == LONG_MIN || v == LONG_MAX) && e == ERANGE) ||
        endp == in || !isspace(*endp) ||
        endp == in || !isspace(_UC(*endp)) ||
        v != (*result = (uint8_t) v)) {
        return -1;
    }
    for (in = endp; isspace(*in); ++in)
    for (in = endp; isspace(_UC(*in)); ++in)
        continue;

    *inptr = in;
@@ -1141,7 +1141,7 @@ int s_client_main(int argc, char **argv)
            break;
        case OPT_PSK:
            for (p = psk_key = opt_arg(); *p; p++) {
                if (isxdigit(*p))
                if (isxdigit(_UC(*p)))
                    continue;
                BIO_printf(bio_err, "Not a hex number '%s'\n", psk_key);
                goto end;
Loading