/* 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
- Free Software Foundation, Inc.
+ Copyright (C) 1991-2015 Free Software Foundation, Inc.
This file is part of GNU Binutils.
#include "filenames.h"
#include "libbfd.h"
-#include <sys/stat.h>
#include <time.h> /* ctime, maybe time_t */
#include <assert.h>
#include "bucomm.h"
}
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
{
switch (endian)
{
- case BFD_ENDIAN_BIG: return "big endian";
- case BFD_ENDIAN_LITTLE: return "little endian";
- default: return "endianness unknown";
+ case BFD_ENDIAN_BIG: return _("big endian");
+ case BFD_ENDIAN_LITTLE: return _("little endian");
+ default: return _("endianness unknown");
}
}
bfd *abfd = bfd_openw (dummy_name, p->name);
int a;
- printf ("%s\n (header %s, data %s)\n", p->name,
+ printf (_("%s\n (header %s, data %s)\n"), p->name,
endian_string (p->header_byteorder),
endian_string (p->byteorder));
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);
+ /* PR binutils/17605: Check for corrupt time values. */
+ if (ctime_result == NULL)
+ sprintf (timebuf, _("<time data corrupt>"));
+ else
+ /* 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);
}
}
fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600);
#endif
if (fd == -1)
- return NULL;
+ {
+ free (tmpname);
+ return NULL;
+ }
close (fd);
return tmpname;
}
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;
+}