Proper bound check in _bfd_doprnt_scan
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index 31050ec8acbb35737c56fab4e06fa6b61dd254a6..6da0afa26d29dd27dc1fc741467205c00fbd36e3 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for the generic parts of most COFF variants, for BFD.
-   Copyright (C) 1990-2016 Free Software Foundation, Inc.
+   Copyright (C) 1990-2017 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -965,7 +965,8 @@ handle_COMDAT (bfd * abfd,
          /* PR 17512 file: 078-11867-0.004  */
          if (symname == NULL)
            {
-             _bfd_error_handler (_("%B: unable to load COMDAT section name"), abfd);
+             _bfd_error_handler (_("%B: unable to load COMDAT section name"),
+                                 abfd);
              break;
            }
 
@@ -996,7 +997,13 @@ handle_COMDAT (bfd * abfd,
                        || isym.n_sclass == C_EXT)
                       && BTYPE (isym.n_type) == T_NULL
                       && isym.n_value == 0))
-                 abort ();
+                 {
+                   /* Malformed input files can trigger this test.
+                      cf PR 21781.  */
+                   _bfd_error_handler (_("%B: error: unexpected symbol '%s' in COMDAT section"),
+                                       abfd, symname);
+                   goto breakloop;
+                 }
 
                /* FIXME LATER: MSVC generates section names
                   like .text for comdats.  Gas generates
@@ -1004,7 +1011,9 @@ handle_COMDAT (bfd * abfd,
                   function).  See comment above for more.  */
 
                if (isym.n_sclass == C_STAT && strcmp (name, symname) != 0)
-                 _bfd_error_handler (_("%B: warning: COMDAT symbol '%s' does not match section name '%s'"),
+                 /* xgettext:c-format */
+                 _bfd_error_handler (_("%B: warning: COMDAT symbol '%s'"
+                                       " does not match section name '%s'"),
                                      abfd, symname, name);
 
                seen_state = 1;
@@ -1012,7 +1021,9 @@ handle_COMDAT (bfd * abfd,
                /* PR 17512: file: e2cfe54f.  */
                if (esym + bfd_coff_symesz (abfd) >= esymend)
                  {
-                   _bfd_error_handler (_("%B: warning: No symbol for section '%s' found"),
+                   /* xgettext:c-format */
+                   _bfd_error_handler (_("%B: warning: No symbol for"
+                                         " section '%s' found"),
                                        abfd, symname);
                    break;
                  }
@@ -1236,7 +1247,9 @@ styp_to_sec_flags (bfd *abfd,
          /* Generate a warning message rather using the 'unhandled'
             variable as this will allow some .sys files generate by
             other toolchains to be processed.  See bugzilla issue 196.  */
-         _bfd_error_handler (_("%B: Warning: Ignoring section flag IMAGE_SCN_MEM_NOT_PAGED in section %s"),
+         /* xgettext:c-format */
+         _bfd_error_handler (_("%B: Warning: Ignoring section flag"
+                               " IMAGE_SCN_MEM_NOT_PAGED in section %s"),
                              abfd, name);
          break;
        case IMAGE_SCN_MEM_EXECUTE:
@@ -1303,7 +1316,8 @@ styp_to_sec_flags (bfd *abfd,
       if (unhandled != NULL)
        {
          _bfd_error_handler
-           (_("%B (%s): Section flag %s (0x%x) ignored"),
+           /* xgettext:c-format */
+           (_("%B (%s): Section flag %s (%#lx) ignored"),
             abfd, name, unhandled, flag);
          result = FALSE;
        }
@@ -1938,8 +1952,8 @@ coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED,
     }
   else if (hdr->s_nreloc == 0xffff)
     _bfd_error_handler
-      ("%s: warning: claims to have 0xffff relocs, without overflow",
-       bfd_get_filename (abfd));
+      (_("%B: warning: claims to have 0xffff relocs, without overflow"),
+       abfd);
 }
 #undef ALIGN_SET
 #undef ELIFALIGN_SET
@@ -2591,23 +2605,15 @@ coff_print_aux (bfd *abfd ATTRIBUTE_UNUSED,
       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
        {
          BFD_ASSERT (! aux->fix_scnlen);
-#ifdef XCOFF64
-         fprintf (file, "val %5lld",
-                  (long long) aux->u.auxent.x_csect.x_scnlen.l);
-#else
-         fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
-#endif
+         fprintf (file, "val %5" BFD_VMA_FMT "d",
+                  aux->u.auxent.x_csect.x_scnlen.l);
        }
       else
        {
          fprintf (file, "indx ");
          if (! aux->fix_scnlen)
-#ifdef XCOFF64
-           fprintf (file, "%4lld",
-                    (long long) aux->u.auxent.x_csect.x_scnlen.l);
-#else
-           fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
-#endif
+           fprintf (file, "%4" BFD_VMA_FMT "d",
+                    aux->u.auxent.x_csect.x_scnlen.l);
          else
            fprintf (file, "%4ld",
                     (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
@@ -2779,7 +2785,9 @@ coff_write_relocs (bfd * abfd, int first_undef)
                    if (n.r_symndx > obj_conv_table_size (abfd))
                      {
                        bfd_set_error (bfd_error_bad_value);
-                       _bfd_error_handler (_("%B: reloc against a non-existant symbol index: %ld"),
+                       /* xgettext:c-format */
+                       _bfd_error_handler (_("%B: reloc against a non-existent"
+                                             " symbol index: %ld"),
                                            abfd, n.r_symndx);
                        return FALSE;
                      }
@@ -3180,6 +3188,7 @@ coff_compute_section_file_positions (bfd * abfd)
        {
          bfd_set_error (bfd_error_file_too_big);
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B: page size is too large (0x%x)"), abfd, page_size);
          return FALSE;
        }
@@ -3339,6 +3348,7 @@ coff_compute_section_file_positions (bfd * abfd)
     {
       bfd_set_error (bfd_error_file_too_big);
       _bfd_error_handler
+       /* xgettext:c-format */
        (_("%B: too many sections (%d)"), abfd, target_index);
       return FALSE;
     }
@@ -3748,7 +3758,9 @@ coff_write_object_contents (bfd * abfd)
                 NUL-terminated.  We use a temporary buffer so that we can still
                 sprintf all eight chars without splatting a terminating NUL
                 over the first byte of the following member (s_paddr).  */
-             char s_name_buf[SCNNMLEN + 1];
+             /* PR 21096: The +20 is to stop a bogus warning from gcc7 about
+                a possible buffer overflow.  */
+             char s_name_buf[SCNNMLEN + 1 + 20];
 
              /* An inherent limitation of the /nnnnnnn notation used to indicate
                 the offset of the long name in the string table is that we
@@ -3757,14 +3769,16 @@ coff_write_object_contents (bfd * abfd)
                {
                  bfd_set_error (bfd_error_file_too_big);
                  _bfd_error_handler
-                   (_("%B: section %s: string table overflow at offset %ld"),
-                   abfd, current->name, string_size);
+                   /* xgettext:c-format */
+                   (_("%B: section %A: string table overflow at offset %ld"),
+                   abfd, current, (unsigned long) string_size);
                  return FALSE;
                }
 
-             /* snprintf not strictly necessary now we've verified the value
-                has less than eight ASCII digits, but never mind.  */
-             snprintf (s_name_buf, SCNNMLEN + 1, "/%lu", (unsigned long) string_size);
+             /* We do not need to use snprintf here as we have already verfied
+                that string_size is not too big, plus we have an overlarge
+                buffer, just in case.  */
+             sprintf (s_name_buf, "/%lu", (unsigned long) string_size);
              /* Then strncpy takes care of any padding for us.  */
              strncpy (section.s_name, s_name_buf, SCNNMLEN);
              string_size += len + 1;
@@ -4564,6 +4578,14 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
 
   BFD_ASSERT (asect->lineno == NULL);
 
+  if (asect->lineno_count > asect->size)
+    {
+      _bfd_error_handler
+       (_("%B: warning: line number count (%#lx) exceeds section size (%#lx)"),
+        abfd, (unsigned long) asect->lineno_count, (unsigned long) asect->size);
+      return FALSE;
+    }
+
   amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
   lineno_cache = (alent *) bfd_alloc (abfd, amt);
   if (lineno_cache == NULL)
@@ -4599,7 +4621,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
       if (cache_ptr->line_number == 0)
        {
          combined_entry_type * ent;
-         bfd_vma symndx;
+         unsigned long symndx;
          coff_symbol_type *sym;
 
          have_func = FALSE;
@@ -4607,8 +4629,9 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
          if (symndx >= obj_raw_syment_count (abfd))
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: warning: illegal symbol index 0x%lx in line number entry %d"),
-                abfd, (long) symndx, counter);
+                abfd, symndx, counter);
              cache_ptr->line_number = -1;
              ret = FALSE;
              continue;
@@ -4620,8 +4643,9 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
          if (! ent->is_sym)
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: warning: illegal symbol index 0x%lx in line number entry %d"),
-                abfd, (long) symndx, counter);
+                abfd, symndx, counter);
              cache_ptr->line_number = -1;
              ret = FALSE;
              continue;
@@ -4633,6 +4657,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
              || sym >= obj_symbols (abfd) + bfd_get_symcount (abfd))
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: warning: illegal symbol in line number entry %d"),
                 abfd, counter);
              cache_ptr->line_number = -1;
@@ -4645,6 +4670,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
          cache_ptr->u.sym = (asymbol *) sym;
          if (sym->lineno != NULL)
            _bfd_error_handler
+             /* xgettext:c-format */
              (_("%B: warning: duplicate line number information for `%s'"),
               abfd, bfd_asymbol_name (&sym->symbol));
 
@@ -4799,6 +4825,9 @@ coff_slurp_symbol_table (bfd * abfd)
 #endif
 #ifdef RS6000COFF_C
            case C_HIDEXT:
+#if ! defined _AIX52 && ! defined AIX_WEAK_SUPPORT
+           case C_AIX_WEAKEXT:
+#endif
 #endif
 #ifdef C_SYSTEM
            case C_SYSTEM:      /* System Wide variable.  */
@@ -4871,7 +4900,11 @@ coff_slurp_symbol_table (bfd * abfd)
                  && src->u.syment.n_scnum > 0)
                dst->symbol.flags = BSF_LOCAL;
 #endif
-             if (src->u.syment.n_sclass == C_WEAKEXT)
+             if (src->u.syment.n_sclass == C_WEAKEXT
+#ifdef RS6000COFF_C
+                 || src->u.syment.n_sclass == C_AIX_WEAKEXT
+#endif
+                 )
                dst->symbol.flags |= BSF_WEAK;
 
              break;
@@ -5056,13 +5089,17 @@ coff_slurp_symbol_table (bfd * abfd)
            case C_UEXT:        /* Tentative external definition.  */
 #endif
            case C_EXTLAB:      /* External load time label.  */
-           case C_HIDDEN:      /* Ext symbol in dmert public lib.  */
            default:
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: Unrecognized storage class %d for %s symbol `%s'"),
                 abfd, src->u.syment.n_sclass,
                 dst->symbol.section->name, dst->symbol.name);
              ret = FALSE;
+             /* Fall through.  */
+           case C_HIDDEN:      /* Ext symbol in dmert public lib.  */
+             /* PR 20722: These symbols can also be generated by
+                building DLLs with --gc-sections enabled.  */
              dst->symbol.flags = BSF_DEBUGGING;
              dst->symbol.value = (src->u.syment.n_value);
              break;
@@ -5187,6 +5224,7 @@ coff_classify_symbol (bfd *abfd,
       char buf[SYMNMLEN + 1];
 
       _bfd_error_handler
+       /* xgettext:c-format */
        (_("warning: %B: local symbol `%s' has no section"),
         abfd, _bfd_coff_internal_syment_name (abfd, syment, buf));
     }
@@ -5293,8 +5331,9 @@ coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
          if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: warning: illegal symbol index %ld in relocs"),
-                abfd, (long) dst.r_symndx);
+                abfd, dst.r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
            }
@@ -5332,8 +5371,9 @@ coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
       if (cache_ptr->howto == NULL)
        {
          _bfd_error_handler
-           (_("%B: illegal relocation type %d at address 0x%lx"),
-            abfd, dst.r_type, (long) dst.r_vaddr);
+           /* xgettext:c-format */
+           (_("%B: illegal relocation type %d at address %#Lx"),
+            abfd, dst.r_type, dst.r_vaddr);
          bfd_set_error (bfd_error_bad_value);
          return FALSE;
        }
@@ -5412,6 +5452,10 @@ coff_canonicalize_reloc (bfd * abfd,
   return section->reloc_count;
 }
 
+#ifndef coff_set_reloc
+#define coff_set_reloc _bfd_generic_set_reloc
+#endif
+
 #ifndef coff_reloc16_estimate
 #define coff_reloc16_estimate dummy_reloc16_estimate
 
@@ -6030,6 +6074,10 @@ static bfd_coff_backend_data bigobj_swap_table =
 #define coff_bfd_define_common_symbol      bfd_generic_define_common_symbol
 #endif
 
+#ifndef coff_bfd_define_start_stop
+#define coff_bfd_define_start_stop         bfd_generic_define_start_stop
+#endif
+
 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)    \
 const bfd_target VAR =                                                 \
 {                                                                      \
This page took 0.028601 seconds and 4 git commands to generate.