X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=binutils%2Fsysdump.c;h=e9fa6382eadf0386c352eb46da585c561c20cb5f;hb=4bb8b8e9381bce9734454470ebd1572534e7514e;hp=12b1034624bff98f94ac81f4041b73d7a0a734ca;hpb=92f01d6100e9f8bf2c4178dc34c1084119d6292d;p=binutils-gdb.git diff --git a/binutils/sysdump.c b/binutils/sysdump.c index 12b1034624b..e9fa6382ead 100644 --- a/binutils/sysdump.c +++ b/binutils/sysdump.c @@ -1,12 +1,11 @@ /* Sysroff object format dumper. - Copyright 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007 - Free Software Foundation, Inc. + Copyright (C) 1994-2022 Free Software Foundation, Inc. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -25,13 +24,12 @@ This program reads a SYSROFF object file and prints it in an almost human readable form to stdout. */ +#include "sysdep.h" #include "bfd.h" -#include "bucomm.h" #include "safe-ctype.h" - -#include #include "libiberty.h" #include "getopt.h" +#include "bucomm.h" #include "sysroff.h" static int dump = 1; @@ -40,21 +38,7 @@ static int code; static int addrsize = 4; static FILE *file; -static void dh (unsigned char *, int); -static void itheader (char *, int); -static void p (void); -static void tabout (void); -static void pbarray (barray *); -static int getone (int); -static int opt (int); -static void must (int); -static void tab (int, char *); -static void dump_symbol_info (void); static void derived_type (void); -static void module (void); -static void show_usage (FILE *, int); - -extern int main (int, char **); static char * getCHARS (unsigned char *ptr, int *idx, int size, int max) @@ -64,15 +48,24 @@ getCHARS (unsigned char *ptr, int *idx, int size, int max) int b = size; if (b >= max) - return "*undefined*"; + return _("*undefined*"); if (b == 0) { + /* PR 17512: file: 13caced2. */ + if (oc >= max) + return _("*corrupt*"); /* Got to work out the length of the string from self. */ b = ptr[oc++]; (*idx) += 8; } + if (oc + b > size) + { + /* PR 28564 */ + return _("*corrupt*"); + } + *idx += b * 8; r = xcalloc (b + 1, 1); memcpy (r, ptr + oc, b); @@ -120,36 +113,45 @@ fillup (unsigned char *ptr) int sum; int i; - size = getc (file) - 2; - fread (ptr, 1, size, file); + size = getc (file); + if (size == EOF + || size <= 2) + return 0; + + size -= 2; + if (fread (ptr, size, 1, file) != 1) + return 0; + sum = code + size + 2; for (i = 0; i < size; i++) sum += ptr[i]; if ((sum & 0xff) != 0xff) - printf ("SUM IS %x\n", sum); + printf (_("SUM IS %x\n"), sum); if (dump) dh (ptr, size); - return size - 1; + return size; } static barray -getBARRAY (unsigned char *ptr, int *idx, int dsize ATTRIBUTE_UNUSED, - int max ATTRIBUTE_UNUSED) +getBARRAY (unsigned char *ptr, int *idx, int dsize ATTRIBUTE_UNUSED, int max) { barray res; int i; int byte = *idx / 8; - int size = ptr[byte++]; + int size = 0; + + if (byte < max) + size = ptr[byte++]; res.len = size; res.data = (unsigned char *) xmalloc (size); for (i = 0; i < size; i++) - res.data[i] = ptr[byte++]; + res.data[i] = byte < max ? ptr[byte++] : 0; return res; } @@ -161,7 +163,12 @@ getINT (unsigned char *ptr, int *idx, int size, int max) int byte = *idx / 8; if (byte >= max) - return 0; + { + /* PR 17512: file: id:000001,src:000002,op:flip1,pos:45. */ + /* Prevent infinite loops re-reading beyond the end of the buffer. */ + fatal (_("ICE: getINT: Out of buffer space")); + return 0; + } if (size == -2) size = addrsize; @@ -180,10 +187,11 @@ getINT (unsigned char *ptr, int *idx, int size, int max) n = (ptr[byte + 0] << 8) + ptr[byte + 1]; break; case 4: - n = (ptr[byte + 0] << 24) + (ptr[byte + 1] << 16) + (ptr[byte + 2] << 8) + (ptr[byte + 3]); + n = (((unsigned) ptr[byte + 0] << 24) + (ptr[byte + 1] << 16) + + (ptr[byte + 2] << 8) + (ptr[byte + 3])); break; default: - abort (); + fatal (_("Unsupported read size: %d"), size); } *idx += size * 8; @@ -205,9 +213,9 @@ getBITS (unsigned char *ptr, int *idx, int size, int max) } static void -itheader (char *name, int code) +itheader (char *name, int icode) { - printf ("\n%s 0x%02x\n", name, code); + printf ("\n%s 0x%02x\n", name, icode); } static int indent; @@ -494,7 +502,7 @@ getone (int type) break; default: - printf ("GOT A %x\n", c); + printf (_("GOT A %x\n"), c); return 0; break; } @@ -512,7 +520,7 @@ static void must (int x) { if (!getone (x)) - printf ("WANTED %x!!\n", x); + printf (_("WANTED %x!!\n"), x); } static void @@ -523,15 +531,14 @@ tab (int i, char *s) if (s) { p (); - printf (s); - printf ("\n"); + puts (s); } } static void dump_symbol_info (void) { - tab (1, "SYMBOL INFO"); + tab (1, _("SYMBOL INFO")); while (opt (IT_dsy_CODE)) { @@ -549,7 +556,7 @@ dump_symbol_info (void) static void derived_type (void) { - tab (1, "DERIVED TYPE"); + tab (1, _("DERIVED TYPE")); while (1) { @@ -606,11 +613,13 @@ module (void) int c = 0; int l = 0; - tab (1, "MODULE***\n"); + tab (1, _("MODULE***\n")); do { c = getc (file); + if (c == EOF) + break; ungetc (c, file); c &= 0x7f; @@ -633,19 +642,17 @@ module (void) } } -char *program_name; - -static void -show_usage (FILE *file, int status) +ATTRIBUTE_NORETURN static void +show_usage (FILE *ffile, int status) { - fprintf (file, _("Usage: %s [option(s)] in-file\n"), program_name); - fprintf (file, _("Print a human readable interpretation of a SYSROFF object file\n")); - fprintf (file, _(" The options are:\n\ + fprintf (ffile, _("Usage: %s [option(s)] in-file\n"), program_name); + fprintf (ffile, _("Print a human readable interpretation of a SYSROFF object file\n")); + fprintf (ffile, _(" The options are:\n\ -h --help Display this information\n\ -v --version Print the program's version number\n")); if (REPORT_BUGS_TO[0] && status == 0) - fprintf (file, _("Report bugs to %s\n"), REPORT_BUGS_TO); + fprintf (ffile, _("Report bugs to %s\n"), REPORT_BUGS_TO); exit (status); } @@ -653,7 +660,7 @@ int main (int ac, char **av) { char *input_file = NULL; - int opt; + int option; static struct option long_options[] = { {"help", no_argument, 0, 'h'}, @@ -661,23 +668,22 @@ main (int ac, char **av) {NULL, no_argument, 0, 0} }; -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) +#ifdef HAVE_LC_MESSAGES setlocale (LC_MESSAGES, ""); #endif -#if defined (HAVE_SETLOCALE) setlocale (LC_CTYPE, ""); -#endif bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); program_name = av[0]; xmalloc_set_program_name (program_name); + bfd_set_error_program_name (program_name); expandargv (&ac, &av); - while ((opt = getopt_long (ac, av, "HhVv", long_options, (int *) NULL)) != EOF) + while ((option = getopt_long (ac, av, "HhVv", long_options, (int *) NULL)) != EOF) { - switch (opt) + switch (option) { case 'H': case 'h':