On Fri, Aug 22, 2014 at 09:14:33PM +0200, Alexander Bluhm wrote:
> Hi,
> 
> When compiling syslogd with WARNINGS=yes gcc complains with many
> "warning: comparison between signed and unsigned".
> 
> I would like to fix them.
> 
> ok?

I still need an ok.  Note that some checks got stricter.
The (size_t) cast is only done, if the argument is not negative.
I have another bugfix on top of this diff.

bluhm

> 
> bluhm
> 
> Index: usr.sbin/syslogd/privsep.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/privsep.c,v
> retrieving revision 1.40
> diff -u -p -r1.40 privsep.c
> --- usr.sbin/syslogd/privsep.c        21 Aug 2014 17:00:34 -0000      1.40
> +++ usr.sbin/syslogd/privsep.c        22 Aug 2014 18:52:12 -0000
> @@ -330,7 +330,7 @@ priv_init(char *conf, int numeric, int l
>                               errx(1, "rejected attempt to getnameinfo");
>                       /* Expecting: length, sockaddr */
>                       must_read(socks[0], &addr_len, sizeof(int));
> -                     if (addr_len <= 0 || addr_len > sizeof(addr))
> +                     if (addr_len <= 0 || (size_t)addr_len > sizeof(addr))
>                               _exit(1);
>                       must_read(socks[0], &addr, addr_len);
>                       if (getnameinfo((struct sockaddr *)&addr, addr_len,
> @@ -459,7 +459,7 @@ check_tty_name(char *tty, size_t ttylen)
>       char *p;
>  
>       /* Any path containing '..' is invalid.  */
> -     for (p = tty; *p && (p - tty) < ttylen; p++)
> +     for (p = tty; *p && p < tty + ttylen; p++)
>               if (*p == '.' && *(p + 1) == '.')
>                       goto bad_path;
>  
> @@ -484,7 +484,7 @@ check_log_name(char *lognam, size_t logl
>       char *p;
>  
>       /* Any path containing '..' is invalid.  */
> -     for (p = lognam; *p && (p - lognam) < loglen; p++)
> +     for (p = lognam; *p && p < lognam + loglen; p++)
>               if (*p == '.' && *(p + 1) == '.')
>                       goto bad_path;
>  
> @@ -693,7 +693,7 @@ priv_getaddrinfo(char *host, char *serv,
>               return (-1);
>  
>       /* Make sure we aren't overflowing the passed in buffer */
> -     if (addr_len < ret_len)
> +     if (ret_len < 0 || (size_t)ret_len > addr_len)
>               errx(1, "%s: overflow attempt in return", __func__);
>  
>       /* Read the resolved address and make sure we got all of it */
> @@ -727,7 +727,7 @@ priv_getnameinfo(struct sockaddr *sa, so
>               return (-1);
>  
>       /* Check we don't overflow the passed in buffer */
> -     if (hostlen < ret_len)
> +     if (ret_len < 0 || (size_t)ret_len > hostlen)
>               errx(1, "%s: overflow attempt in return", __func__);
>  
>       /* Read the resolved hostname */
> @@ -767,7 +767,8 @@ static int
>  may_read(int fd, void *buf, size_t n)
>  {
>       char *s = buf;
> -     ssize_t res, pos = 0;
> +     ssize_t res;
> +     size_t pos = 0;
>  
>       while (n > pos) {
>               res = read(fd, s + pos, n - pos);
> @@ -790,7 +791,8 @@ static void
>  must_read(int fd, void *buf, size_t n)
>  {
>       char *s = buf;
> -     ssize_t res, pos = 0;
> +     ssize_t res;
> +     size_t pos = 0;
>  
>       while (n > pos) {
>               res = read(fd, s + pos, n - pos);
> @@ -812,7 +814,8 @@ static void
>  must_write(int fd, void *buf, size_t n)
>  {
>       char *s = buf;
> -     ssize_t res, pos = 0;
> +     ssize_t res;
> +     size_t pos = 0;
>  
>       while (n > pos) {
>               res = write(fd, s + pos, n - pos);
> Index: usr.sbin/syslogd/syslogd.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
> retrieving revision 1.117
> diff -u -p -r1.117 syslogd.c
> --- usr.sbin/syslogd/syslogd.c        22 Aug 2014 16:14:11 -0000      1.117
> +++ usr.sbin/syslogd/syslogd.c        22 Aug 2014 18:42:59 -0000
> @@ -868,10 +868,10 @@ fprintlog(struct filed *f, int flags, ch
>  
>       v = iov;
>       if (f->f_type == F_WALL) {
> -             if ((l = snprintf(greetings, sizeof(greetings),
> +             l = snprintf(greetings, sizeof(greetings),
>                   "\r\n\7Message from syslogd@%s at %.24s ...\r\n",
> -                 f->f_prevhost, ctime(&now))) >= sizeof(greetings) ||
> -                 l == -1)
> +                 f->f_prevhost, ctime(&now));
> +             if (l < 0 || (size_t)l >= sizeof(greetings))
>                       l = strlen(greetings);
>               v->iov_base = greetings;
>               v->iov_len = l;
> @@ -898,9 +898,9 @@ fprintlog(struct filed *f, int flags, ch
>               v->iov_base = msg;
>               v->iov_len = strlen(msg);
>       } else if (f->f_prevcount > 1) {
> -             if ((l = snprintf(repbuf, sizeof(repbuf),
> -                 "last message repeated %d times", f->f_prevcount)) >=
> -                 sizeof(repbuf) || l == -1)
> +             l = snprintf(repbuf, sizeof(repbuf),
> +                 "last message repeated %d times", f->f_prevcount);
> +             if (l < 0 || (size_t)l >= sizeof(repbuf))
>                       l = strlen(repbuf);
>               v->iov_base = repbuf;
>               v->iov_len = l;
> @@ -931,11 +931,12 @@ fprintlog(struct filed *f, int flags, ch
>                       fd = -1;
>                       break;
>               }
> -             if ((l = snprintf(line, sizeof(line), "<%d>%.15s %s%s%s",
> +             l = snprintf(line, sizeof(line), "<%d>%.15s %s%s%s",
>                   f->f_prevpri, (char *)iov[0].iov_base,
>                   IncludeHostname ? LocalHostName : "",
>                   IncludeHostname ? " " : "",
> -                 (char *)iov[4].iov_base)) >= sizeof(line) || l == -1)
> +                 (char *)iov[4].iov_base);
> +             if (l < 0 || (size_t)l >= sizeof(line))
>                       l = strlen(line);
>               if (sendto(fd, line, l, 0,
>                   (struct sockaddr *)&f->f_un.f_forw.f_addr,
> @@ -1632,7 +1633,7 @@ cfline(char *line, char *prog)
>               rb_len *= 1024;
>  
>               /* Copy buffer name */
> -             for(i = 0; i < sizeof(f->f_un.f_mb.f_mname) - 1; i++) {
> +             for(i = 0; (size_t)i < sizeof(f->f_un.f_mb.f_mname) - 1; i++) {
>                       if (!isalnum((unsigned char)q[i]))
>                               break;
>                       f->f_un.f_mb.f_mname[i] = q[i];
> Index: usr.sbin/syslogd/ttymsg.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/ttymsg.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 ttymsg.c
> --- usr.sbin/syslogd/ttymsg.c 27 Oct 2009 23:59:54 -0000      1.4
> +++ usr.sbin/syslogd/ttymsg.c 22 Aug 2014 18:42:59 -0000
> @@ -30,8 +30,11 @@
>   * SUCH DAMAGE.
>   */
>  
> +#include <sys/param.h>
> +#include <sys/stat.h>
>  #include <sys/types.h>
>  #include <sys/uio.h>
> +
>  #include <signal.h>
>  #include <fcntl.h>
>  #include <dirent.h>
> @@ -41,7 +44,6 @@
>  #include <stdio.h>
>  #include <string.h>
>  #include <stdlib.h>
> -#include <sys/stat.h>
>  
>  #include "syslogd.h"
>  
> @@ -57,12 +59,13 @@ ttymsg(struct iovec *iov, int iovcnt, ch
>  {
>       static char device[MAXNAMLEN] = _PATH_DEV;
>       static char errbuf[1024];
> -     int cnt, fd, left, wret;
> +     int cnt, fd, left;
> +     ssize_t wret;
>       struct iovec localiov[6];
>       int forked = 0;
>       sigset_t mask;
>  
> -     if (iovcnt > sizeof(localiov) / sizeof(localiov[0]))
> +     if (iovcnt < 0 || (size_t)iovcnt > nitems(localiov))
>               return ("too many iov's (change code in syslogd/ttymsg.c)");
>  
>       /*
> @@ -107,7 +110,7 @@ ttymsg(struct iovec *iov, int iovcnt, ch
>                                   iovcnt * sizeof(struct iovec));
>                               iov = localiov;
>                       }
> -                     for (cnt = 0; wret >= iov->iov_len; ++cnt) {
> +                     for (cnt = 0; (size_t)wret >= iov->iov_len; ++cnt) {
>                               wret -= iov->iov_len;
>                               ++iov;
>                               --iovcnt;

Reply via email to