This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: va_end buglets in opcodes/{arc-dis,fr30-desc,m32r-desc}.c


On Mon, Sep 24, 2001 at 04:50:22PM +0200, Thomas Klausner wrote:
> In opcodes/arc-dis.c, a va_end is missing, see attached diff.

Thanks.  I'm checking in the following patch.

bfd/ChangeLog
	* bfd.c (_bfd_default_error_handlerl): Define using VPARAMS,
	VA_OPEN, VA_FIXEDARG, VA_CLOSE.

binutils/ChangeLog
	* bucomm.c (fatal): Define using VPARAMS, VA_OPEN, VA_FIXEDARG,
	VA_CLOSE.
	(non_fatal): Likewise.
	* objdump.c (objdump_sprintf): Likewise.
	* readelf.c (error): Likewise.
	(warn): Likewise.

ld/ChangeLog
	* ldmisc.c (USE_STDARG): Remove.
	(info_msg): Define using VPARAMS, VA_OPEN, VA_FIXEDARG, VA_CLOSE.
	(einfo): Likewise.
	(minfo): Likewise.
	(lfinfo): Likewise.

	* ldmisc.h: Remove #ifdef ANSI_PROTOTYPES and non-ansi
	declarations.  Update copyright.

opcodes/ChangeLog
	* arc-dis.c: Formatting fixes.
	(my_sprintf): Define using VPARAMS, VA_OPEN, VA_FIXEDARG, VA_CLOSE.

-- 
Alan Modra

Index: bfd/bfd.c
===================================================================
RCS file: /cvs/src/src/bfd/bfd.c,v
retrieving revision 1.24
diff -u -p -r1.24 bfd.c
--- bfd.c	2001/09/20 23:30:34	1.24
+++ bfd.c	2001/09/26 01:44:48
@@ -410,57 +410,24 @@ static const char *_bfd_error_program_na
 
 /* This is the default routine to handle BFD error messages.  */
 
-#ifdef ANSI_PROTOTYPES
-
 static void _bfd_default_error_handler PARAMS ((const char *s, ...));
 
-static void
-_bfd_default_error_handler (const char *s, ...)
-{
-  va_list p;
-
-  if (_bfd_error_program_name != NULL)
-    fprintf (stderr, "%s: ", _bfd_error_program_name);
-  else
-    fprintf (stderr, "BFD: ");
-
-  va_start (p, s);
-
-  vfprintf (stderr, s, p);
-
-  va_end (p);
-
-  fprintf (stderr, "\n");
-}
-
-#else /* ! defined (ANSI_PROTOTYPES) */
-
-static void _bfd_default_error_handler ();
-
 static void
-_bfd_default_error_handler (va_alist)
-     va_dcl
+_bfd_default_error_handler VPARAMS ((const char *s, ...))
 {
-  va_list p;
-  const char *s;
-
   if (_bfd_error_program_name != NULL)
     fprintf (stderr, "%s: ", _bfd_error_program_name);
   else
     fprintf (stderr, "BFD: ");
-
-  va_start (p);
 
-  s = va_arg (p, const char *);
+  VA_OPEN (p, s);
+  VA_FIXEDARG (p, const char *, s);
   vfprintf (stderr, s, p);
+  VA_CLOSE (p);
 
-  va_end (p);
-
   fprintf (stderr, "\n");
 }
 
-#endif /* ! defined (ANSI_PROTOTYPES) */
-
 /* This is a function pointer to the routine which should handle BFD
    error messages.  It is called when a BFD routine encounters an
    error for which it wants to print a message.  Going through a
@@ -560,7 +527,7 @@ bfd_archive_filename (abfd)
 	  if (curr)
 	    free (buf);
 	  curr = needed + (needed >> 1);
-	  buf = bfd_malloc (curr);
+	  buf = bfd_malloc ((bfd_size_type) curr);
 	  /* If we can't malloc, fail safe by returning just the file
 	     name. This function is only used when building error
 	     messages.  */
Index: binutils/bucomm.c
===================================================================
RCS file: /cvs/src/src/binutils/bucomm.c,v
retrieving revision 1.9
diff -u -p -r1.9 bucomm.c
--- bucomm.c	2001/07/29 05:31:43	1.9
+++ bucomm.c	2001/09/26 01:44:49
@@ -70,55 +70,26 @@ report (format, args)
   putc ('\n', stderr);
 }
 
-#ifdef ANSI_PROTOTYPES
 void
-fatal (const char *format, ...)
+fatal VPARAMS ((const char *format, ...))
 {
-  va_list args;
+  VA_OPEN (args, format);
+  VA_FIXEDARG (args, const char *, format);
 
-  va_start (args, format);
   report (format, args);
-  va_end (args);
+  VA_CLOSE (args);
   xexit (1);
 }
 
 void
-non_fatal (const char *format, ...)
+non_fatal VPARAMS ((const char *format, ...))
 {
-  va_list args;
+  VA_OPEN (args, format);
+  VA_FIXEDARG (args, const char *, format);
 
-  va_start (args, format);
   report (format, args);
-  va_end (args);
+  VA_CLOSE (args);
 }
-#else
-void 
-fatal (va_alist)
-     va_dcl
-{
-  char *Format;
-  va_list args;
-
-  va_start (args);
-  Format = va_arg (args, char *);
-  report (Format, args);
-  va_end (args);
-  xexit (1);
-}
-
-void 
-non_fatal (va_alist)
-     va_dcl
-{
-  char *Format;
-  va_list args;
-
-  va_start (args);
-  Format = va_arg (args, char *);
-  report (Format, args);
-  va_end (args);
-}
-#endif
 
 /* Set the default BFD target based on the configured target.  Doing
    this permits the binutils to be configured for a particular target,
Index: binutils/objdump.c
===================================================================
RCS file: /cvs/src/src/binutils/objdump.c,v
retrieving revision 1.42
diff -u -p -r1.42 objdump.c
--- objdump.c	2001/09/19 05:33:16	1.42
+++ objdump.c	2001/09/26 01:44:51
@@ -1109,35 +1109,20 @@ typedef struct
 /* sprintf to a "stream" */
 
 static int
-#ifdef ANSI_PROTOTYPES
-objdump_sprintf (SFILE *f, const char *format, ...)
-#else
-objdump_sprintf (va_alist)
-     va_dcl
-#endif
+objdump_sprintf VPARAMS ((SFILE *f, const char *format, ...))
 {
-#ifndef ANSI_PROTOTYPES
-  SFILE *f;
-  const char *format;
-#endif
   char *buf;
-  va_list args;
   size_t n;
 
-#ifdef ANSI_PROTOTYPES
-  va_start (args, format);
-#else
-  va_start (args);
-  f = va_arg (args, SFILE *);
-  format = va_arg (args, const char *);
-#endif
+  VA_OPEN (args, format);
+  VA_FIXEDARG (args, SFILE *, f);
+  VA_FIXEDARG (args, const char *, format);
 
   vasprintf (&buf, format, args);
 
-  va_end (args);
-
   if (buf == NULL)
     {
+      va_end (args);
       fatal (_("Out of virtual memory"));
     }
 
@@ -1159,6 +1144,7 @@ objdump_sprintf (va_alist)
 
   free (buf);
 
+  VA_CLOSE (args);
   return n;
 }
 
Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.123
diff -u -p -r1.123 readelf.c
--- readelf.c	2001/09/25 16:44:19	1.123
+++ readelf.c	2001/09/26 01:44:55
@@ -281,61 +281,27 @@ typedef int Elf32_Word;
    : get_64bit_elf_symbols (file, offset, size))
 
 
-#ifdef ANSI_PROTOTYPES
 static void
-error (const char * message, ...)
+error VPARAMS ((const char *message, ...))
 {
-  va_list args;
+  VA_OPEN (args, message);
+  VA_FIXEDARG (args, const char *, message);
 
   fprintf (stderr, _("%s: Error: "), program_name);
-  va_start (args, message);
   vfprintf (stderr, message, args);
-  va_end (args);
-  return;
+  VA_CLOSE (args);
 }
 
 static void
-warn (const char * message, ...)
+warn VPARAMS ((const char *message, ...))
 {
-  va_list args;
+  VA_OPEN (args, message);
+  VA_FIXEDARG (args, const char *, message);
 
   fprintf (stderr, _("%s: Warning: "), program_name);
-  va_start (args, message);
   vfprintf (stderr, message, args);
-  va_end (args);
-  return;
+  VA_CLOSE (args);
 }
-#else
-static void
-error (va_alist)
-     va_dcl
-{
-  char * message;
-  va_list args;
-
-  fprintf (stderr, _("%s: Error: "), program_name);
-  va_start (args);
-  message = va_arg (args, char *);
-  vfprintf (stderr, message, args);
-  va_end (args);
-  return;
-}
-
-static void
-warn (va_alist)
-     va_dcl
-{
-  char * message;
-  va_list args;
-
-  fprintf (stderr, _("%s: Warning: "), program_name);
-  va_start (args);
-  message = va_arg (args, char *);
-  vfprintf (stderr, message, args);
-  va_end (args);
-  return;
-}
-#endif
 
 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
 
Index: ld/ldmisc.c
===================================================================
RCS file: /cvs/src/src/ld/ldmisc.c,v
retrieving revision 1.7
diff -u -p -r1.7 ldmisc.c
--- ldmisc.c	2001/05/02 16:42:55	1.7
+++ ldmisc.c	2001/09/26 01:45:20
@@ -27,10 +27,8 @@ Software Foundation, 59 Temple Place - S
 
 #ifdef ANSI_PROTOTYPES
 #include <stdarg.h>
-#define USE_STDARG 1
 #else
 #include <varargs.h>
-#define USE_STDARG 0
 #endif
 
 #include "ld.h"
@@ -412,51 +410,25 @@ vfinfo (fp, fmt, arg)
    would hosed by LynxOS, which defines that name in its libc.)  */
 
 void
-#if USE_STDARG
-info_msg (const char *fmt, ...)
-#else
-info_msg (va_alist)
-     va_dcl
-#endif
+info_msg VPARAMS ((const char *fmt, ...))
 {
-  va_list arg;
-
-#if ! USE_STDARG
-  const char *fmt;
-
-  va_start (arg);
-  fmt = va_arg (arg, const char *);
-#else
-  va_start (arg, fmt);
-#endif
+  VA_OPEN (arg, fmt);
+  VA_FIXEDARG (arg, const char *, fmt);
 
   vfinfo (stdout, fmt, arg);
-  va_end (arg);
+  VA_CLOSE (arg);
 }
 
 /* ('e' for error.) Format info message and print on stderr.  */
 
 void
-#if USE_STDARG
-einfo (const char *fmt, ...)
-#else
-einfo (va_alist)
-     va_dcl
-#endif
+einfo VPARAMS ((const char *fmt, ...))
 {
-  va_list arg;
-
-#if ! USE_STDARG
-  const char *fmt;
-
-  va_start (arg);
-  fmt = va_arg (arg, const char *);
-#else
-  va_start (arg, fmt);
-#endif
+  VA_OPEN (arg, fmt);
+  VA_FIXEDARG (arg, const char *, fmt);
 
   vfinfo (stderr, fmt, arg);
-  va_end (arg);
+  VA_CLOSE (arg);
 }
 
 void
@@ -470,50 +442,24 @@ info_assert (file, line)
 /* ('m' for map) Format info message and print on map.  */
 
 void
-#if USE_STDARG
-minfo (const char *fmt, ...)
-#else
-minfo (va_alist)
-     va_dcl
-#endif
+minfo VPARAMS ((const char *fmt, ...))
 {
-  va_list arg;
-
-#if ! USE_STDARG
-  const char *fmt;
-  va_start (arg);
-  fmt = va_arg (arg, const char *);
-#else
-  va_start (arg, fmt);
-#endif
+  VA_OPEN (arg, fmt);
+  VA_FIXEDARG (arg, const char *, fmt);
 
   vfinfo (config.map_file, fmt, arg);
-  va_end (arg);
+  VA_CLOSE (arg);
 }
 
 void
-#if USE_STDARG
-lfinfo (FILE *file, const char *fmt, ...)
-#else
-lfinfo (va_alist)
-     va_dcl
-#endif
+lfinfo VPARAMS ((FILE *file, const char *fmt, ...))
 {
-  va_list arg;
-
-#if ! USE_STDARG
-  FILE *file;
-  const char *fmt;
-
-  va_start (arg);
-  file = va_arg (arg, FILE *);
-  fmt = va_arg (arg, const char *);
-#else
-  va_start (arg, fmt);
-#endif
+  VA_OPEN (arg, fmt);
+  VA_FIXEDARG (arg, FILE *, file);
+  VA_FIXEDARG (arg, const char *, fmt);
 
   vfinfo (file, fmt, arg);
-  va_end (arg);
+  VA_CLOSE (arg);
 }
 
 /* Functions to print the link map.  */
Index: ld/ldmisc.h
===================================================================
RCS file: /cvs/src/src/ld/ldmisc.h,v
retrieving revision 1.3
diff -u -p -r1.3 ldmisc.h
--- ldmisc.h	2001/05/02 16:42:55	1.3
+++ ldmisc.h	2001/09/26 01:45:20
@@ -1,5 +1,5 @@
 /* ldmisc.h -
-   Copyright 1991, 1992, 1993, 1994, 1996, 1997
+   Copyright 1991, 1992, 1993, 1994, 1996, 1997, 2001
    Free Software Foundation, Inc.
 
    This file is part of GLD, the Gnu Linker.
@@ -15,28 +15,17 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GLD; see the file COPYING.  If not, write to
-   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   along with GLD; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston,
+   MA 02111-1307, USA.  */
 
 #ifndef LDMISC_H
 #define LDMISC_H
 
-#ifdef ANSI_PROTOTYPES
 extern void einfo PARAMS ((const char *, ...));
 extern void minfo PARAMS ((const char *, ...));
 extern void info_msg PARAMS ((const char *, ...));
 extern void lfinfo PARAMS ((FILE *, const char *, ...));
-#else
-/* VARARGS*/
-extern void einfo ();
-/* VARARGS*/
-extern void minfo ();
-/* VARARGS*/
-extern void info_msg ();
-/*VARARGS*/
-extern void lfinfo ();
-#endif
-
 extern void info_assert PARAMS ((const char *, unsigned int));
 extern void yyerror PARAMS ((const char *));
 extern PTR xmalloc PARAMS ((size_t));
Index: opcodes/arc-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/arc-dis.c,v
retrieving revision 1.6
diff -u -p -r1.6 arc-dis.c
--- arc-dis.c	2001/09/21 12:36:56	1.6
+++ arc-dis.c	2001/09/26 01:45:24
@@ -45,13 +45,13 @@
    treated as signed for bit shifting purposes:  */
 #define FIELDD(word)	(BITS (((signed int)word), 0, 8))
 
-#define PUT_NEXT_WORD_IN(a)							\
-  do										\
-    {										\
-      if (is_limm == 1 && !NEXT_WORD (1))					\
-        mwerror (state, _("Illegal limm reference in last instruction!\n"));	\
-        a = state->words[1];							\
-    }										\
+#define PUT_NEXT_WORD_IN(a)						\
+  do									\
+    {									\
+      if (is_limm == 1 && !NEXT_WORD (1))				\
+        mwerror (state, _("Illegal limm reference in last instruction!\n")); \
+      a = state->words[1];						\
+    }									\
   while (0)
 
 #define CHECK_FLAG_COND_NULLIFY()				\
@@ -97,7 +97,7 @@
 #define CHECK_FIELD_A()				\
   do						\
     {						\
-      fieldA = FIELDA(state->words[0]);		\
+      fieldA = FIELDA (state->words[0]);	\
       if (fieldA > 60)				\
         {					\
 	  fieldAisReg = 0;			\
@@ -233,20 +233,22 @@ post_address (state, addr)
   return "";
 }
 
+static void my_sprintf PARAMS ((struct arcDisState *, char *, const char *,
+				...));
+
 static void
-my_sprintf (
-	    struct arcDisState * state,
-	    char * buf,
-	    const char * format,
-	    ...)
+my_sprintf VPARAMS ((struct arcDisState *state, char *buf, const char *format,
+		     ...))
 {
   char *bp;
   const char *p;
   int size, leading_zero, regMap[2];
   long auxNum;
-  va_list ap;
 
-  va_start (ap, format);
+  VA_OPEN (ap, format);
+  VA_FIXEDARG (ap, struct arcDisState *, state);
+  VA_FIXEDARG (ap, char *, buf);
+  VA_FIXEDARG (ap, const char *, format);
 
   bp = buf;
   *bp = 0;
@@ -258,8 +260,8 @@ my_sprintf (
   while (1)
     switch (*p++)
       {
-    case 0:
-      goto DOCOMM; /* (return)  */
+      case 0:
+	goto DOCOMM; /* (return)  */
       default:
 	*bp++ = p[-1];
 	break;
@@ -409,6 +411,7 @@ my_sprintf (
       }
 
  DOCOMM: *bp = 0;
+  VA_CLOSE (ap);
 }
 
 static void
@@ -435,7 +438,8 @@ write_comments_(state, shimm, is_limm, l
 	    strcpy (state->commentBuffer, comment_prefix);
 	  else
 	    strcat (state->commentBuffer, ", ");
-	  strncat (state->commentBuffer, state->comm[i], sizeof (state->commentBuffer));
+	  strncat (state->commentBuffer, state->comm[i],
+		   sizeof (state->commentBuffer));
 	}
     }
 }
@@ -724,7 +728,7 @@ dsmOneArcInst (addr, state)
 	  instrName = instruction_name (state,
 					state->_opcode,
 					FIELDC (state->words[0]),
-					& flags);
+					&flags);
 	  if (!instrName)
 	    {
 	      instrName = "???";
@@ -839,14 +843,16 @@ dsmOneArcInst (addr, state)
 	  if (!repeatsOp)
 	    WRITE_FORMAT_COMMA_x (C);
 	  WRITE_NOP_COMMENT ();
-	  my_sprintf (state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+	  my_sprintf (state, state->operandBuffer, formatString,
+		      fieldA, fieldB, fieldC);
 	}
       else
 	{
 	  WRITE_FORMAT_x (B);
 	  if (!repeatsOp)
 	    WRITE_FORMAT_COMMA_x (C);
-	  my_sprintf (state, state->operandBuffer, formatString, fieldB, fieldC);
+	  my_sprintf (state, state->operandBuffer, formatString,
+		      fieldB, fieldC);
 	}
       write_comments ();
       break;
@@ -862,7 +868,8 @@ dsmOneArcInst (addr, state)
 	  WRITE_FORMAT_x (A);
 	  WRITE_FORMAT_COMMA_x (B);
 	  WRITE_NOP_COMMENT ();
-	  my_sprintf (state, state->operandBuffer, formatString, fieldA, fieldB);
+	  my_sprintf (state, state->operandBuffer, formatString,
+		      fieldA, fieldB);
 	}
       else
 	{
@@ -894,16 +901,17 @@ dsmOneArcInst (addr, state)
       /* This address could be a label we know. Convert it.  */
       if (state->_opcode != op_LPC /* LP  */)
 	{
-	add_target (fieldA); /* For debugger.  */
-	state->flow = state->_opcode == op_BLC /* BL  */
-	  ? direct_call
-	  : direct_jump;
-	/* indirect calls are achieved by "lr blink,[status];
-	   lr dest<- func addr; j [dest]"  */
+	  add_target (fieldA); /* For debugger.  */
+	  state->flow = state->_opcode == op_BLC /* BL  */
+	    ? direct_call
+	    : direct_jump;
+	  /* indirect calls are achieved by "lr blink,[status];
+	     lr dest<- func addr; j [dest]"  */
 	}
 
       strcat (formatString, "%s"); /* address/label name */
-      my_sprintf (state, state->operandBuffer, formatString, post_address (state, fieldA));
+      my_sprintf (state, state->operandBuffer, formatString,
+		  post_address (state, fieldA));
       write_comments ();
       break;
 
@@ -986,7 +994,8 @@ dsmOneArcInst (addr, state)
 	fieldB = fieldC;
 
       WRITE_FORMAT_x_RB (C);
-      my_sprintf (state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      my_sprintf (state, state->operandBuffer, formatString,
+		  fieldA, fieldB, fieldC);
       write_comments ();
       break;
 
@@ -1031,7 +1040,8 @@ dsmOneArcInst (addr, state)
 	  else
 	    WRITE_FORMAT_RB ();
 	}
-      my_sprintf (state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      my_sprintf (state, state->operandBuffer, formatString,
+		  fieldA, fieldB, fieldC);
       write_comments ();
       break;
 
@@ -1043,7 +1053,7 @@ dsmOneArcInst (addr, state)
 
       /* [B,A offset]  */
       if (dbg) printf("7:b reg %d %x off %x\n",
-				 fieldBisReg,fieldB,fieldA);
+		      fieldBisReg,fieldB,fieldA);
       state->_ea_present = 1;
       state->_offset = fieldA;
       if (fieldBisReg)
@@ -1076,7 +1086,8 @@ dsmOneArcInst (addr, state)
 	  else
 	    WRITE_FORMAT_RB();
 	}
-      my_sprintf (state, state->operandBuffer, formatString, fieldC, fieldB, fieldA);
+      my_sprintf (state, state->operandBuffer, formatString,
+		  fieldC, fieldB, fieldA);
       write_comments2(fieldA);
       break;
     case 8:
@@ -1143,7 +1154,7 @@ _coreRegName(arg, regval)
 static const char *
 _auxRegName(void *_this ATTRIBUTE_UNUSED, int regval)
 {
-    return arcExtMap_auxRegName(regval);
+  return arcExtMap_auxRegName(regval);
 }
 
 
@@ -1151,14 +1162,14 @@ _auxRegName(void *_this ATTRIBUTE_UNUSED
 static const char *
 _condCodeName(void *_this ATTRIBUTE_UNUSED, int regval)
 {
-    return arcExtMap_condCodeName(regval);
+  return arcExtMap_condCodeName(regval);
 }
 
 /* Returns the name the user specified extension instruction.  */
 static const char *
 _instName (void *_this ATTRIBUTE_UNUSED, int majop, int minop, int *flags)
 {
-    return arcExtMap_instName(majop, minop, flags);
+  return arcExtMap_instName(majop, minop, flags);
 }
 
 /* Decode an instruction returning the size of the instruction


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]