tfile_target::close: trace_fd can't be -1
[deliverable/binutils-gdb.git] / bfd / coff64-rs6000.c
index 78f14a09f45e94b310ecc85e304172a6666f2c3e..0588567f0782ee1a1cab95262d8c773603f87614 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for IBM RS/6000 "XCOFF64" files.
-   Copyright (C) 2000-2018 Free Software Foundation, Inc.
+   Copyright (C) 2000-2020 Free Software Foundation, Inc.
    Written Clinton Popetz.
    Contributed by Cygnus Support.
 
@@ -278,7 +278,6 @@ extern int rs6000coff_core_file_failing_signal
 #define bfd_pe_print_pdata     NULL
 #endif
 
-#include <stdint.h>
 #include "coffcode.h"
 
 /* For XCOFF64, the effective width of symndx changes depending on
@@ -960,7 +959,7 @@ xcoff64_write_object_contents (bfd *abfd)
       if (text_sec != NULL)
        {
          internal_a.o_sntext = text_sec->target_index;
-         internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
+         internal_a.o_algntext = bfd_section_alignment (text_sec);
        }
       else
        {
@@ -971,7 +970,7 @@ xcoff64_write_object_contents (bfd *abfd)
       if (data_sec != NULL)
        {
          internal_a.o_sndata = data_sec->target_index;
-         internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
+         internal_a.o_algndata = bfd_section_alignment (data_sec);
        }
       else
        {
@@ -1306,10 +1305,6 @@ xcoff64_ppc_relocate_section (bfd *output_bfd,
         operation, which would be tedious, or we must do the computations
         in a type larger than bfd_vma, which would be inefficient.  */
 
-      if ((unsigned int) howto.complain_on_overflow
-         >= XCOFF_MAX_COMPLAIN_OVERFLOW)
-       abort ();
-
       if (((*xcoff_complain_overflow[howto.complain_on_overflow])
           (input_bfd, value_to_relocate, relocation, &howto)))
        {
@@ -1883,13 +1878,13 @@ _bfd_strntoll (const char * nptr, int base, unsigned int maxlen)
 }
 
 /* Macro to read an ASCII value stored in an archive header field.  */
-#define GET_VALUE_IN_FIELD(VAR, FIELD)           \
-  do                                             \
-    {                                            \
-      (VAR) = sizeof (VAR) > sizeof (long)       \
-       ? _bfd_strntoll (FIELD, 10, sizeof FIELD) \
-       : _bfd_strntol (FIELD, 10, sizeof FIELD); \
-    }                                            \
+#define GET_VALUE_IN_FIELD(VAR, FIELD, BASE)                   \
+  do                                                           \
+    {                                                          \
+      (VAR) = (sizeof (VAR) > sizeof (long)                    \
+              ? _bfd_strntoll (FIELD, BASE, sizeof FIELD)      \
+              : _bfd_strntol (FIELD, BASE, sizeof FIELD));     \
+    }                                                          \
   while (0)
 
 /* Read in the armap of an XCOFF archive.  */
@@ -1911,7 +1906,7 @@ xcoff64_slurp_armap (bfd *abfd)
 
   if (xcoff_ardata (abfd) == NULL)
     {
-      bfd_has_map (abfd) = FALSE;
+      abfd->has_armap = FALSE;
       return TRUE;
     }
 
@@ -1919,7 +1914,7 @@ xcoff64_slurp_armap (bfd *abfd)
                      (const char **) NULL, 10);
   if (off == 0)
     {
-      bfd_has_map (abfd) = FALSE;
+      abfd->has_armap = FALSE;
       return TRUE;
     }
 
@@ -1932,24 +1927,33 @@ xcoff64_slurp_armap (bfd *abfd)
     return FALSE;
 
   /* Skip the name (normally empty).  */
-  GET_VALUE_IN_FIELD (namlen, hdr.namlen);
+  GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
   pos = ((namlen + 1) & ~(size_t) 1) + SXCOFFARFMAG;
   if (bfd_seek (abfd, pos, SEEK_CUR) != 0)
     return FALSE;
 
   sz = bfd_scan_vma (hdr.size, (const char **) NULL, 10);
+  if (sz == (bfd_size_type) -1)
+    {
+      bfd_set_error (bfd_error_no_memory);
+      return FALSE;
+    }
 
   /* Read in the entire symbol table.  */
-  contents = (bfd_byte *) bfd_alloc (abfd, sz);
+  contents = (bfd_byte *) bfd_alloc (abfd, sz + 1);
   if (contents == NULL)
     return FALSE;
   if (bfd_bread (contents, sz, abfd) != sz)
     return FALSE;
 
+  /* Ensure strings are NULL terminated so we don't wander off the end
+     of the buffer.  */
+  contents[sz] = 0;
+
   /* The symbol table starts with an eight byte count.  */
   c = H_GET_64 (abfd, contents);
 
-  if (c * 8 >= sz)
+  if (c >= sz / 8)
     {
       bfd_set_error (bfd_error_bad_value);
       return FALSE;
@@ -1981,7 +1985,7 @@ xcoff64_slurp_armap (bfd *abfd)
     }
 
   bfd_ardata (abfd)->symdef_count = c;
-  bfd_has_map (abfd) = TRUE;
+  abfd->has_armap = TRUE;
 
   return TRUE;
 }
@@ -2783,9 +2787,11 @@ const bfd_target rs6000_xcoff64_vec =
     bfd_generic_lookup_section_flags,
     bfd_generic_merge_sections,
     bfd_generic_is_group_section,
+    bfd_generic_group_name,
     bfd_generic_discard_group,
     _bfd_generic_section_already_linked,
     _bfd_xcoff_define_common_symbol,
+    _bfd_generic_link_hide_symbol,
     bfd_generic_define_start_stop,
 
     /* Dynamic */
@@ -3044,9 +3050,11 @@ const bfd_target rs6000_xcoff64_aix_vec =
     bfd_generic_lookup_section_flags,
     bfd_generic_merge_sections,
     bfd_generic_is_group_section,
+    bfd_generic_group_name,
     bfd_generic_discard_group,
     _bfd_generic_section_already_linked,
     _bfd_xcoff_define_common_symbol,
+    _bfd_generic_link_hide_symbol,
     bfd_generic_define_start_stop,
 
     /* Dynamic */
This page took 0.026026 seconds and 4 git commands to generate.