bugzilla-daemon at mindrot.org
2002-Aug-02 12:37 UTC
[Bug 377] New: Reduce compiler warnings. Use unsigned args to the ctype.h is*() macros.
http://bugzilla.mindrot.org/show_bug.cgi?id=377 Summary: Reduce compiler warnings. Use unsigned args to the ctype.h is*() macros. Product: Portable OpenSSH Version: -current Platform: Sparc OS/Version: Solaris Status: NEW Severity: trivial Priority: P2 Component: Miscellaneous AssignedTo: openssh-unix-dev at mindrot.org ReportedBy: mdb at juniper.net On Solaris 8, using gcc 3.1, the following warnings are given during build of OpenSSH from the -cvs sources: canohost.c:93: warning: subscript has type `char' clientloop.c:488: warning: subscript has type `char' clientloop.c:503: warning: subscript has type `char' inet_aton.c:117: warning: subscript has type `char' inet_aton.c:128: warning: subscript has type `char' inet_aton.c:131: warning: subscript has type `char' inet_aton.c:133: warning: subscript has type `char' inet_aton.c:155: warning: subscript has type `char' match.c:138: warning: subscript has type `char' mktemp.c:168: warning: subscript has type `char' readpassphrase.c:123: warning: subscript has type `char' scp.c:758: warning: subscript has type `char' sshconnect.c:834: warning: subscript has type `char' Given the possibility of characters outside of the 0 thru 0x7f range and the implementation of the is*() macros as using an index into an array, negative arguments could lead to unexpected behavior. log: * canohost.c (get_remote_hostname): Argument to macro isupper() should be unsigned. * clientloop.c (process_cmdlin): Argument to macro isspace() should be unsigned. * match.c (match_pattern_list): Argument to macro isupper() should be unsigned. * scp.c (sink): Argument to macro isdigit() should be unsigned. * sshconnect.c (ssh_login): Argument to macro isupper() should be unsigned. * openbsd-compat/inet_aton.c (inet_aton): Arguments to the isdigit(), isxdigit(), islower() and isspace() macros should be unsigned. * openbsd-compat/mktemp.c (_gettemp): The isdigit() macro argument should be unsigned. * openbsd-compat/readpassphrase.c (readpassphrase): The isalpha() macro argument should be unsigned. Index: canohost.c ==================================================================RCS file: /cvs/openssh/canohost.c,v retrieving revision 1.30 diff -u -p -r1.30 canohost.c --- canohost.c 11 Jul 2002 03:56:47 -0000 1.30 +++ canohost.c 2 Aug 2002 12:13:37 -0000 @@ -90,7 +90,7 @@ get_remote_hostname(int socket, int veri * of this software). */ for (i = 0; name[i]; i++) - if (isupper(name[i])) + if (isupper((unsigned)name[i])) name[i] = tolower(name[i]); if (!verify_reverse_mapping) Index: clientloop.c ==================================================================RCS file: /cvs/openssh/clientloop.c,v retrieving revision 1.87 diff -u -p -r1.87 clientloop.c --- clientloop.c 4 Jul 2002 00:14:18 -0000 1.87 +++ clientloop.c 2 Aug 2002 12:13:38 -0000 @@ -485,7 +485,7 @@ process_cmdline(void) cmd = s = read_passphrase("\r\nssh> ", RP_ECHO); if (s == NULL) goto out; - while (*s && isspace(*s)) + while (*s && isspace((unsigned)*s)) s++; if (*s == 0) goto out; @@ -500,7 +500,7 @@ process_cmdline(void) goto out; } s += 2; - while (*s && isspace(*s)) + while (*s && isspace((unsigned)*s)) s++; if (sscanf(s, "%5[0-9]:%255[^:]:%5[0-9]", Index: match.c ==================================================================RCS file: /cvs/openssh/match.c,v retrieving revision 1.18 diff -u -p -r1.18 match.c --- match.c 5 Mar 2002 01:42:43 -0000 1.18 +++ match.c 2 Aug 2002 12:13:39 -0000 @@ -135,7 +135,7 @@ match_pattern_list(const char *string, c for (subi = 0; i < len && subi < sizeof(sub) - 1 && pattern[i] != ','; subi++, i++) - sub[subi] = dolower && isupper(pattern[i]) ? + sub[subi] = dolower && isupper((unsigned)pattern[i]) ? tolower(pattern[i]) : pattern[i]; /* If subpattern too long, return failure (no match). */ if (subi >= sizeof(sub) - 1) Index: scp.c ==================================================================RCS file: /cvs/openssh/scp.c,v retrieving revision 1.97 diff -u -p -r1.97 scp.c --- scp.c 21 Jun 2002 00:41:52 -0000 1.97 +++ scp.c 2 Aug 2002 12:13:43 -0000 @@ -755,7 +755,7 @@ sink(argc, argv) if (*cp++ != ' ') SCREWUP("mode not delimited"); - for (size = 0; isdigit(*cp);) + for (size = 0; isdigit((unsigned)*cp);) size = size * 10 + (*cp++ - '0'); if (*cp++ != ' ') SCREWUP("size not delimited"); Index: sshconnect.c ==================================================================RCS file: /cvs/openssh/sshconnect.c,v retrieving revision 1.99 diff -u -p -r1.99 sshconnect.c --- sshconnect.c 1 Aug 2002 01:26:30 -0000 1.99 +++ sshconnect.c 2 Aug 2002 12:13:44 -0000 @@ -831,7 +831,7 @@ ssh_login(Sensitive *sensitive, const ch /* Convert the user-supplied hostname into all lowercase. */ host = xstrdup(orighost); for (cp = host; *cp; cp++) - if (isupper(*cp)) + if (isupper((unsigned)*cp)) *cp = tolower(*cp); /* Exchange protocol version identification strings with the server. */ Index: openbsd-compat/inet_aton.c ==================================================================RCS file: /cvs/openssh/openbsd-compat/inet_aton.c,v retrieving revision 1.4 diff -u -p -r1.4 inet_aton.c --- openbsd-compat/inet_aton.c 12 Apr 2002 03:35:40 -0000 1.4 +++ openbsd-compat/inet_aton.c 2 Aug 2002 12:13:44 -0000 @@ -103,7 +103,7 @@ inet_aton(const char *cp, struct in_addr { register u_int32_t val; register int base, n; - register char c; + register unsigned char c; unsigned int parts[4]; register unsigned int *pp = parts; Index: openbsd-compat/mktemp.c ==================================================================RCS file: /cvs/openssh/openbsd-compat/mktemp.c,v retrieving revision 1.2 diff -u -p -r1.2 mktemp.c --- openbsd-compat/mktemp.c 13 Feb 2002 05:00:16 -0000 1.2 +++ openbsd-compat/mktemp.c 2 Aug 2002 12:13:44 -0000 @@ -165,7 +165,7 @@ _gettemp(path, doopen, domkdir, slen) return (0); *trv++ = 'a'; } else { - if (isdigit(*trv)) + if (isdigit((unsigned)*trv)) *trv = 'a'; else if (*trv == 'z') /* inc from z to A */ *trv = 'A'; Index: openbsd-compat/readpassphrase.c ==================================================================RCS file: /cvs/openssh/openbsd-compat/readpassphrase.c,v retrieving revision 1.8 diff -u -p -r1.8 readpassphrase.c --- openbsd-compat/readpassphrase.c 1 May 2002 12:00:22 -0000 1.8 +++ openbsd-compat/readpassphrase.c 2 Aug 2002 12:13:44 -0000 @@ -120,7 +120,7 @@ restart: if (p < end) { if ((flags & RPP_SEVENBIT)) ch &= 0x7f; - if (isalpha(ch)) { + if (isalpha((unsigned)ch)) { if ((flags & RPP_FORCELOWER)) ch = tolower(ch); if ((flags & RPP_FORCEUPPER)) ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee.
Mark D. Baushke
2002-Aug-02 12:59 UTC
[Bug 377] New: Reduce compiler warnings. Use unsigned args to the ctype.h is*() macros.
The patch in the bug report seems to have been mangled. Here is a cleaner copy. -- Mark Index: canohost.c ==================================================================RCS file: /cvs/openssh/canohost.c,v retrieving revision 1.30 diff -u -p -r1.30 canohost.c --- canohost.c 11 Jul 2002 03:56:47 -0000 1.30 +++ canohost.c 2 Aug 2002 12:13:37 -0000 @@ -90,7 +90,7 @@ get_remote_hostname(int socket, int veri * of this software). */ for (i = 0; name[i]; i++) - if (isupper(name[i])) + if (isupper((unsigned)name[i])) name[i] = tolower(name[i]); if (!verify_reverse_mapping) Index: clientloop.c ==================================================================RCS file: /cvs/openssh/clientloop.c,v retrieving revision 1.87 diff -u -p -r1.87 clientloop.c --- clientloop.c 4 Jul 2002 00:14:18 -0000 1.87 +++ clientloop.c 2 Aug 2002 12:13:38 -0000 @@ -485,7 +485,7 @@ process_cmdline(void) cmd = s = read_passphrase("\r\nssh> ", RP_ECHO); if (s == NULL) goto out; - while (*s && isspace(*s)) + while (*s && isspace((unsigned)*s)) s++; if (*s == 0) goto out; @@ -500,7 +500,7 @@ process_cmdline(void) goto out; } s += 2; - while (*s && isspace(*s)) + while (*s && isspace((unsigned)*s)) s++; if (sscanf(s, "%5[0-9]:%255[^:]:%5[0-9]", Index: match.c ==================================================================RCS file: /cvs/openssh/match.c,v retrieving revision 1.18 diff -u -p -r1.18 match.c --- match.c 5 Mar 2002 01:42:43 -0000 1.18 +++ match.c 2 Aug 2002 12:13:39 -0000 @@ -135,7 +135,7 @@ match_pattern_list(const char *string, c for (subi = 0; i < len && subi < sizeof(sub) - 1 && pattern[i] != ','; subi++, i++) - sub[subi] = dolower && isupper(pattern[i]) ? + sub[subi] = dolower && isupper((unsigned)pattern[i]) ? tolower(pattern[i]) : pattern[i]; /* If subpattern too long, return failure (no match). */ if (subi >= sizeof(sub) - 1) Index: scp.c ==================================================================RCS file: /cvs/openssh/scp.c,v retrieving revision 1.97 diff -u -p -r1.97 scp.c --- scp.c 21 Jun 2002 00:41:52 -0000 1.97 +++ scp.c 2 Aug 2002 12:13:43 -0000 @@ -755,7 +755,7 @@ sink(argc, argv) if (*cp++ != ' ') SCREWUP("mode not delimited"); - for (size = 0; isdigit(*cp);) + for (size = 0; isdigit((unsigned)*cp);) size = size * 10 + (*cp++ - '0'); if (*cp++ != ' ') SCREWUP("size not delimited"); Index: sshconnect.c ==================================================================RCS file: /cvs/openssh/sshconnect.c,v retrieving revision 1.99 diff -u -p -r1.99 sshconnect.c --- sshconnect.c 1 Aug 2002 01:26:30 -0000 1.99 +++ sshconnect.c 2 Aug 2002 12:13:44 -0000 @@ -831,7 +831,7 @@ ssh_login(Sensitive *sensitive, const ch /* Convert the user-supplied hostname into all lowercase. */ host = xstrdup(orighost); for (cp = host; *cp; cp++) - if (isupper(*cp)) + if (isupper((unsigned)*cp)) *cp = tolower(*cp); /* Exchange protocol version identification strings with the server. */ Index: openbsd-compat/inet_aton.c ==================================================================RCS file: /cvs/openssh/openbsd-compat/inet_aton.c,v retrieving revision 1.4 diff -u -p -r1.4 inet_aton.c --- openbsd-compat/inet_aton.c 12 Apr 2002 03:35:40 -0000 1.4 +++ openbsd-compat/inet_aton.c 2 Aug 2002 12:13:44 -0000 @@ -103,7 +103,7 @@ inet_aton(const char *cp, struct in_addr { register u_int32_t val; register int base, n; - register char c; + register unsigned char c; unsigned int parts[4]; register unsigned int *pp = parts; Index: openbsd-compat/mktemp.c ==================================================================RCS file: /cvs/openssh/openbsd-compat/mktemp.c,v retrieving revision 1.2 diff -u -p -r1.2 mktemp.c --- openbsd-compat/mktemp.c 13 Feb 2002 05:00:16 -0000 1.2 +++ openbsd-compat/mktemp.c 2 Aug 2002 12:13:44 -0000 @@ -165,7 +165,7 @@ _gettemp(path, doopen, domkdir, slen) return (0); *trv++ = 'a'; } else { - if (isdigit(*trv)) + if (isdigit((unsigned)*trv)) *trv = 'a'; else if (*trv == 'z') /* inc from z to A */ *trv = 'A'; Index: openbsd-compat/readpassphrase.c ==================================================================RCS file: /cvs/openssh/openbsd-compat/readpassphrase.c,v retrieving revision 1.8 diff -u -p -r1.8 readpassphrase.c --- openbsd-compat/readpassphrase.c 1 May 2002 12:00:22 -0000 1.8 +++ openbsd-compat/readpassphrase.c 2 Aug 2002 12:13:44 -0000 @@ -120,7 +120,7 @@ restart: if (p < end) { if ((flags & RPP_SEVENBIT)) ch &= 0x7f; - if (isalpha(ch)) { + if (isalpha((unsigned)ch)) { if ((flags & RPP_FORCELOWER)) ch = tolower(ch); if ((flags & RPP_FORCEUPPER))
Florian Weimer
2002-Aug-02 13:23 UTC
[Bug 377] New: Reduce compiler warnings. Use unsigned args to the ctype.h is*() macros.
bugzilla-daemon at mindrot.org writes:> Given the possibility of characters outside of the 0 thru 0x7f range > and the implementation of the is*() macros as using an index into an > array, negative arguments could lead to unexpected behavior. > > log: > * canohost.c (get_remote_hostname): Argument to macro > isupper() should be unsigned.This is not quite correct on compilers with signed chars. Arguments for the is* functions are indeed ints. (I think the warnings are bogus.) -- Florian Weimer Weimer at CERT.Uni-Stuttgart.DE University of Stuttgart http://CERT.Uni-Stuttgart.DE/people/fw/ RUS-CERT fax +49-711-685-5898
Tony Finch
2002-Aug-02 14:06 UTC
[Bug 377] New: Reduce compiler warnings. Use unsigned args to the ctype.h is*() macros.
Florian Weimer <Weimer at CERT.Uni-Stuttgart.DE> wrote:>bugzilla-daemon at mindrot.org writes: > >> Given the possibility of characters outside of the 0 thru 0x7f range >> and the implementation of the is*() macros as using an index into an >> array, negative arguments could lead to unexpected behavior. >> >> log: >> * canohost.c (get_remote_hostname): Argument to macro >> isupper() should be unsigned. > >This is not quite correct on compilers with signed chars. Arguments >for the is* functions are indeed ints. (I think the warnings are >bogus.)They are unsigned chars converted to ints or EOF, i.e. the same type and range as the result of getc() etc. Passing chars to the is* macros is wrong because if char is signed you end up with an out- of range negative argument. The warning is right, because indexing an array with a char is open to the same error. Tony. -- f.a.n.finch <dot at dotat.at> http://dotat.at/ BAILEY: MAINLY EASTERLY 4 OR 5. FAIR. MODERATE OR GOOD.