/* bucomm.c -- Bin Utils COMmon code.
- Copyright (C) 1991-2014 Free Software Foundation, Inc.
+ Copyright (C) 1991-2015 Free Software Foundation, Inc.
This file is part of GNU Binutils.
section_name = NULL;
va_start (args, format);
fprintf (stderr, "%s", program_name);
-
+
if (abfd)
{
if (!filename)
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';
get_file_size (const char * file_name)
{
struct stat statbuf;
-
+
if (stat (file_name, &statbuf) < 0)
{
if (errno == ENOENT)
else
non_fatal (_("Warning: could not locate '%s'. reason: %s"),
file_name, strerror (errno));
- }
+ }
else if (! S_ISREG (statbuf.st_mode))
non_fatal (_("Warning: '%s' is not an ordinary file"), file_name);
else if (statbuf.st_size < 0)
size_t needed;
assert (abfd != NULL);
-
+
if (!abfd->my_archive)
return bfd_get_filename (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;
+}