Package: atftpd
Version: 0.7.git20120829-1.1
Severity: important
Tags: patch

When developing the rollover patch I turned upped the number
of compile time checks.  This patch fixes all the additional
(and some pre-existing) warning messages that arose.

Unfortunately some were genuine bugs, thus the severity of
"important".  This is one of the serious ones:

  -          if (sockaddr_get_port(&sa) == 0)
  +          if (sockaddr_get_port(sa) == 0)

This means sockaddr_get_port was returning some random
rubbish from the stack.  And then there was this little
perl:

  -          else if (res->tv_usec <= 0);
  -          {
  -               return -1;
  -          }

(Note the semicolon after the ")".)

The attached patch was applied after the rollover.patch
I submitted earlier.


-- System Information:
Debian Release: 7.7
  APT prefers stable-updates
  APT policy: (990, 'stable-updates'), (990, 'stable'), (50, 'testing'), (40, 
'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages atftpd depends on:
ii  debconf [debconf-2.0]  1.5.49
ii  libc6                  2.13-38+deb7u6
ii  libpcre3               1:8.30-5
ii  libwrap0               7.6.q-24
ii  lsb-base               4.1+Debian12
ii  update-inetd           4.43

Versions of packages atftpd recommends:
ii  xinetd [inet-superserver]  1:2.3.14-7.1+deb7u1

Versions of packages atftpd suggests:
ii  logrotate  3.8.1-4

-- debconf information:
  atftpd/port: 69
  atftpd/tftpd-timeout: 300
  atftpd/mcast_port: 1758
  atftpd/verbosity: 5 (LOG_NOTICE)
  atftpd/timeout: true
  atftpd/tsize: true
  atftpd/retry-timeout: 5
  atftpd/multicast: true
  atftpd/ttl: 1
  atftpd/use_inetd: true
  atftpd/basedir: /srv/tftp
  atftpd/mcast_addr: 239.239.239.0-255
  atftpd/logfile: /var/log/atftpd.log
  atftpd/blksize: true
  atftpd/logtofile: false
  atftpd/maxthread: 100
# Description: Get rid of compiler warnings. One was a memory corruption bug.
# Author: Russell Stuart <russell-deb...@stuart.id.au>

--- a/options.h
+++ b/options.h
@@ -27,7 +27,7 @@
      int enabled;               /* enabled for use by server or client */
 };
 
-extern struct tftp_opt tftp_default_options[OPT_NUMBER];
+extern struct tftp_opt tftp_default_options[OPT_NUMBER + 1];
 
 int opt_parse_request(char *data, int data_size, struct tftp_opt *options);
 int opt_parse_options(char *data, int data_size, struct tftp_opt *options);
--- a/tftp_def.c
+++ b/tftp_def.c
@@ -32,7 +32,7 @@
  */
 
 // FIXME: is there a way to use TIMEOUT and SEGSIZE here?
-struct tftp_opt tftp_default_options[OPT_NUMBER] = {
+struct tftp_opt tftp_default_options[OPT_NUMBER + 1] = {
      { "filename", "", 0, 1},   /* file to transfer */
      { "mode", "octet", 0, 1},  /* mode for transfer */
      { "tsize", "0", 0, 1 },    /* RFC1350 options. See RFC2347, */
@@ -67,44 +67,36 @@
  */ 
 int timeval_diff(struct timeval *res, struct timeval *t1, struct timeval *t0)
 {
+     int neg = 1;
      res->tv_sec = t1->tv_sec - t0->tv_sec;
      res->tv_usec = t1->tv_usec - t0->tv_usec;
      
-     if (res->tv_sec > 0)
+     while (res->tv_sec < 0 || res->tv_usec < 0)
      {
-          if (res->tv_usec >= 0)
-          {
-               return 1;
-          }
-          else
-          {
-               res->tv_sec -= 1;
-               res->tv_usec += 1000000;
-               return 1;
-          }
-     }
-     else if (res->tv_sec < 0)
-     {
-          if (res->tv_usec > 0)
-          {
-               res->tv_sec += 1;
-               res->tv_usec -= 1000000;
-               return -1;
-          }
-          else if (res->tv_usec <= 0);
-          {
-               return -1;
-          }
-     }
-     else
-     {
-          if (res->tv_usec > 0)
-               return 1;
-          else if (res->tv_usec < 0)
-               return -1;
-          else
-               return 0;
-     }
+	  if (res->tv_sec < 0 || (res->tv_sec == 0 && res->tv_usec < 0))
+	  {
+	      neg = -neg;
+	      res->tv_sec = -res->tv_sec;
+	      res->tv_usec = -res->tv_usec;
+	  }
+	  if (res->tv_usec < 0)
+	  {
+	      long s = (res->tv_usec - 999999) / 1000000;
+	      res->tv_sec += s;
+	      res->tv_usec -= s * 1000000;
+	  }
+      }
+      if (res->tv_usec >= 1000000)
+      {
+	  long s = res->tv_usec / 1000000;
+	  res->tv_sec += s;
+	  res->tv_usec -= s * 1000000;
+      }
+      if (res->tv_sec == 0 && res->tv_usec == 0)
+      {
+	  return 0;
+      }
+      return neg;
 }
 
 /*
--- a/tftp_io.c
+++ b/tftp_io.c
@@ -320,7 +320,7 @@
                memcpy(sa_from, &from, sizeof(from));
 
           /* if sa as never been initialised, port is still 0 */
-          if (sockaddr_get_port(&sa) == 0)
+          if (sockaddr_get_port(sa) == 0)
                memcpy(sa, &from, sizeof(from));
 
 
--- a/tftpd_list.c
+++ b/tftpd_list.c
@@ -149,7 +149,7 @@
 
      opt_request_to_string(tftp_options, options, MAXLEN);
      index = strstr(options, "multicast");
-     len = (int)index - (int)options;
+     len = (int)((unsigned long)index - (unsigned long)options);
 
      /* lock the whole list before walking it */
      pthread_mutex_lock(&thread_list_mutex);
--- a/tftp_mtftp.c
+++ b/tftp_mtftp.c
@@ -63,7 +63,7 @@
  * If mode = 0, count missed packet from block 0. Else, start after first
  * received block.
  */
-int tftp_mtftp_missed_packet(int file_bitmap[], long last_block, int mode)
+int tftp_mtftp_missed_packet(unsigned int file_bitmap[], long last_block, int mode)
 {
      int missed_block = 0;
      int block_number = 0;
@@ -449,7 +449,7 @@
                             block_number, data_size - 4);
                fseek(fp, (block_number - 1) * (data->data_buffer_size - 4),
                      SEEK_SET);
-               if (fwrite(tftphdr->th_data, 1, data_size - 4, fp) !=
+               if ((int)fwrite(tftphdr->th_data, 1, data_size - 4, fp) !=
                    (data_size - 4))
                {
                     
--- a/configure.ac
+++ b/configure.ac
@@ -67,14 +67,14 @@
 dnl Check for AIX
 AC_AIX
 
-#CFLAGS="-g -Wall -D_REENTRANT"
+#CFLAGS="-g -Wall -Wextra -Wno-unused-parameter -D_REENTRANT"
 
 if test x$debug = xtrue; then
    CFLAGS="$CFLAGS -O0 -DDEBUG"
 else
   if test -n "$auto_cflags"; then
     if test -n "$GCC"; then
-      CFLAGS="$CFLAGS -g -O2 -Wall -Wno-implicit"
+      CFLAGS="$CFLAGS -g -O2 -Wall -Wextra -Wno-implicit -Wno-unused-parameter"
     else
       case "$host_os" in
         *hpux*)  CFLAGS="$CFLAGS +O3"
--- a/tftpd_pcre.c
+++ b/tftpd_pcre.c
@@ -245,7 +245,6 @@
 /* if no match is found return -1 */
 int tftpd_pcre_sub(tftpd_pcre_self_t *self, char *outstr, int outlen, char *str)
 {
-     int rc;
      int ovector[OVECCOUNT];
      int matches;
      tftpd_pcre_pattern_t *pat;
@@ -276,7 +275,7 @@
           }
           /* we have a match  - carry out substitution */
           logger(LOG_DEBUG,"Pattern \"%s\" matches", pat->pattern);
-          rc = tftpd_pcre_makesub(pat,
+          tftpd_pcre_makesub(pat,
                                   outstr, outlen,
                                   str,
                                   ovector, matches);
--- a/options.c
+++ b/options.c
@@ -304,14 +304,14 @@
 
      for (i = 0; i < 2; i++)
      {
-          if ((index + strlen(options[i].option) + 2) < len)
+          if ((index + (int)strlen(options[i].option) + 2) < len)
           {
                Strncpy(string + index, options[i].option, len - index);
                index += strlen(options[i].option);
                Strncpy(string + index, ": ", len - index);
                index += 2;
           }
-          if ((index + strlen(options[i].value) + 2) < len)
+          if ((index + (int)strlen(options[i].value) + 2) < len)
           {
                Strncpy(string + index, options[i].value, len - index);
                index += strlen(options[i].value);
@@ -333,14 +333,14 @@
      {
           if (options[i].specified && options[i].enabled)
           {
-               if ((index + strlen(options[i].option) + 2) < len)
+               if ((index + (int)strlen(options[i].option) + 2) < len)
                {
                     Strncpy(string + index, options[i].option, len - index);
                     index += strlen(options[i].option);
                     Strncpy(string + index, ": ", len - index);
                     index += 2;
                }
-               if ((index + strlen(options[i].value) + 2) < len)
+               if ((index + (int)strlen(options[i].value) + 2) < len)
                {
                     Strncpy(string + index, options[i].value, len - index);
                     index += strlen(options[i].value);

Reply via email to