Re: syslogd comparison between signed and unsigned

2014-08-25 Thread Alexander Bluhm
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.c21 Aug 2014 17:00:34 -  1.40
 +++ usr.sbin/syslogd/privsep.c22 Aug 2014 18:52:12 -
 @@ -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.c22 Aug 2014 16:14:11 -  1.117
 +++ usr.sbin/syslogd/syslogd.c22 Aug 2014 18:42:59 -
 @@ -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))
   

syslogd comparison between signed and unsigned

2014-08-22 Thread Alexander Bluhm
Hi,

When compiling syslogd with WARNINGS=yes gcc complains with many
warning: comparison between signed and unsigned.

I would like to fix them.

ok?

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 -  1.40
+++ usr.sbin/syslogd/privsep.c  22 Aug 2014 18:52:12 -
@@ -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 -  1.117
+++ usr.sbin/syslogd/syslogd.c  22 Aug 2014 18:42:59 -
@@ -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;
}
-