PR binutils/14302
authorNick Clifton <nickc@redhat.com>
Fri, 29 Jun 2012 12:59:49 +0000 (12:59 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 29 Jun 2012 12:59:49 +0000 (12:59 +0000)
* bucomm.c (print_arelt_descr): Correctly report the archive size
field (for 'ar tv').
* ar.c (print_contents): Use correct types for archive element
sizes (for 'ar p').
(extract_file): Likewise (for 'ar x').

binutils/ChangeLog
binutils/ar.c
binutils/bucomm.c

index c864bc4..2448972 100644 (file)
@@ -1,3 +1,12 @@
+2012-06-29  Francois Gouget  <fgouget@codeweavers.com>
+
+       PR binutils/14302
+       * bucomm.c (print_arelt_descr): Correctly report the archive size
+       field (for 'ar tv').
+       * ar.c (print_contents): Use correct types for archive element
+       sizes (for 'ar p').
+       (extract_file): Likewise (for 'ar x').
+
 2012-06-29  Alan Modra  <amodra@gmail.com>
 
        * readelf.c (is_16bit_abs_reloc): Handle mn10200 reloc.
index 13637f4..aceb9d1 100644 (file)
@@ -937,10 +937,11 @@ open_inarch (const char *archive_filename, const char *file)
 static void
 print_contents (bfd *abfd)
 {
-  size_t ncopied = 0;
+  bfd_size_type ncopied = 0;
+  bfd_size_type size;
   char *cbuf = (char *) xmalloc (BUFSIZE);
   struct stat buf;
-  size_t size;
+
   if (bfd_stat_arch_elt (abfd, &buf) != 0)
     /* xgettext:c-format */
     fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
@@ -953,22 +954,22 @@ print_contents (bfd *abfd)
   size = buf.st_size;
   while (ncopied < size)
     {
+      bfd_size_type nread;
+      bfd_size_type tocopy = size - ncopied;
 
-      size_t nread;
-      size_t tocopy = size - ncopied;
       if (tocopy > BUFSIZE)
        tocopy = BUFSIZE;
 
-      nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
+      nread = bfd_bread (cbuf, tocopy, abfd);
       if (nread != tocopy)
        /* xgettext:c-format */
        fatal (_("%s is not a valid archive"),
               bfd_get_filename (bfd_my_archive (abfd)));
 
-      /* fwrite in mingw32 may return int instead of size_t. Cast the
-        return value to size_t to avoid comparison between signed and
+      /* fwrite in mingw32 may return int instead of bfd_size_type. Cast the
+        return value to bfd_size_type to avoid comparison between signed and
         unsigned values.  */
-      if ((size_t) fwrite (cbuf, 1, nread, stdout) != nread)
+      if ((bfd_size_type) fwrite (cbuf, 1, nread, stdout) != nread)
        fatal ("stdout: %s", strerror (errno));
       ncopied += tocopy;
     }
@@ -990,9 +991,9 @@ extract_file (bfd *abfd)
 {
   FILE *ostream;
   char *cbuf = (char *) xmalloc (BUFSIZE);
-  size_t nread, tocopy;
-  size_t ncopied = 0;
-  size_t size;
+  bfd_size_type nread, tocopy;
+  bfd_size_type ncopied = 0;
+  bfd_size_type size;
   struct stat buf;
 
   if (bfd_stat_arch_elt (abfd, &buf) != 0)
@@ -1027,7 +1028,7 @@ extract_file (bfd *abfd)
        if (tocopy > BUFSIZE)
          tocopy = BUFSIZE;
 
-       nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
+       nread = bfd_bread (cbuf, tocopy, abfd);
        if (nread != tocopy)
          /* xgettext:c-format */
          fatal (_("%s is not a valid archive"),
@@ -1049,10 +1050,10 @@ extract_file (bfd *abfd)
            output_file = ostream;
          }
 
-       /* fwrite in mingw32 may return int instead of size_t. Cast
-          the return value to size_t to avoid comparison between
+       /* fwrite in mingw32 may return int instead of bfd_size_type. Cast
+          the return value to bfd_size_type to avoid comparison between
           signed and unsigned values.  */
-       if ((size_t) fwrite (cbuf, 1, nread, ostream) != nread)
+       if ((bfd_size_type) fwrite (cbuf, 1, nread, ostream) != nread)
          fatal ("%s: %s", output_filename, strerror (errno));
        ncopied += tocopy;
       }
index 86cb6e4..bb3fb3f 100644 (file)
@@ -427,16 +427,18 @@ print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose)
          char timebuf[40];
          time_t when = buf.st_mtime;
          const char *ctime_result = (const char *) ctime (&when);
+         bfd_size_type size;
 
          /* POSIX format:  skip weekday and seconds from ctime output.  */
          sprintf (timebuf, "%.12s %.4s", ctime_result + 4, ctime_result + 20);
 
          mode_string (buf.st_mode, modebuf);
          modebuf[10] = '\0';
+         size = buf.st_size;
          /* POSIX 1003.2/D11 says to skip first character (entry type).  */
-         fprintf (file, "%s %ld/%ld %6ld %s ", modebuf + 1,
+         fprintf (file, "%s %ld/%ld %6" BFD_VMA_FMT "u %s ", modebuf + 1,
                   (long) buf.st_uid, (long) buf.st_gid,
-                  (long) buf.st_size, timebuf);
+                  size, timebuf);
        }
     }