changelog: update changelog
[platform/upstream/binutils.git] / binutils / bucomm.c
index 86cb6e4..b8deff5 100644 (file)
@@ -1,7 +1,5 @@
 /* bucomm.c -- Bin Utils COMmon code.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
-   2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2014 Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
@@ -127,24 +125,26 @@ report (const char * format, va_list args)
 }
 
 void
-fatal VPARAMS ((const char *format, ...))
+fatal (const char *format, ...)
 {
-  VA_OPEN (args, format);
-  VA_FIXEDARG (args, const char *, format);
+  va_list args;
+
+  va_start (args, format);
 
   report (format, args);
-  VA_CLOSE (args);
+  va_end (args);
   xexit (1);
 }
 
 void
-non_fatal VPARAMS ((const char *format, ...))
+non_fatal (const char *format, ...)
 {
-  VA_OPEN (args, format);
-  VA_FIXEDARG (args, const char *, format);
+  va_list args;
+
+  va_start (args, format);
 
   report (format, args);
-  VA_CLOSE (args);
+  va_end (args);
 }
 
 /* Set the default BFD target based on the configured target.  Doing
@@ -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);
        }
     }
 
@@ -622,3 +624,29 @@ bfd_get_archive_filename (const bfd *abfd)
           bfd_get_filename (abfd));
   return buf;
 }
+
+/* Returns TRUE iff PATHNAME, a filename of an archive member,
+   is valid for writing.  For security reasons absolute paths
+   and paths containing /../ are not allowed.  See PR 17533.  */
+
+bfd_boolean
+is_valid_archive_path (char const * pathname)
+{
+  const char * n = pathname;
+
+  if (IS_ABSOLUTE_PATH (n))
+    return FALSE;
+
+  while (*n)
+    {
+      if (*n == '.' && *++n == '.' && ( ! *++n || IS_DIR_SEPARATOR (*n)))
+       return FALSE;
+
+      while (*n && ! IS_DIR_SEPARATOR (*n))
+       n++;
+      while (IS_DIR_SEPARATOR (*n))
+       n++;
+    }
+
+  return TRUE;
+}