From 4ef2cf8be8a20090d7709672b0227e24172df3b3 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 2 Jan 2009 14:21:54 +0000 Subject: [PATCH] * or32-opc.c (or32_print_register, or32_print_immediate, disassemble_insn): Don't rely on undefined sprintf behaviour. * itbl-ops.c (itbl_disassemble): Don't rely on undefined sprintf behaviour. --- gas/ChangeLog | 5 +++++ gas/itbl-ops.c | 13 +++++++++---- opcodes/ChangeLog | 5 +++++ opcodes/or32-opc.c | 30 +++++++++++++++++++++--------- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index e9fa2984303..41ddb7d3935 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2009-01-02 Matthias Klose + + * itbl-ops.c (itbl_disassemble): Don't rely on undefined sprintf + behaviour. + 2008-12-23 Jon Beniston * NEWS: Record that support for LM32 has been added. diff --git a/gas/itbl-ops.c b/gas/itbl-ops.c index 948ec99672c..e2f39d1b252 100644 --- a/gas/itbl-ops.c +++ b/gas/itbl-ops.c @@ -1,6 +1,6 @@ /* itbl-ops.c - Copyright 1997, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright 1997, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, + 2009 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -593,6 +593,7 @@ itbl_disassemble (char *s, unsigned long insn) { struct itbl_entry *r; unsigned long value; + char s_value[20]; if (f == e->fields) /* First operand is preceded by tab. */ strcat (s, "\t"); @@ -611,14 +612,18 @@ itbl_disassemble (char *s, unsigned long insn) if (r) strcat (s, r->name); else - sprintf (s, "%s$%lu", s, value); + { + sprintf (s_value, "$%lu", value); + strcat (s, s_value); + } break; case e_addr: /* Use assembler's symbol table to find symbol. */ /* FIXME!! Do we need this? If so, what about relocs?? */ /* If not a symbol, fall through to IMMED. */ case e_immed: - sprintf (s, "%s0x%lx", s, value); + sprintf (s_value, "0x%lx", value); + strcat (s, s_value); break; default: return 0; /* error; invalid field spec */ diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 4b4f7ba6424..c6c6d6b799e 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2009-01-02 Matthias Klose + + * or32-opc.c (or32_print_register, or32_print_immediate, + disassemble_insn): Don't rely on undefined sprintf behaviour. + 2008-12-30 Martin Schwidefsky * s390-opc.txt: Add ptff instruction. diff --git a/opcodes/or32-opc.c b/opcodes/or32-opc.c index aa94c1365ce..24ab5cf2809 100644 --- a/opcodes/or32-opc.c +++ b/opcodes/or32-opc.c @@ -1,5 +1,5 @@ /* Table of opcodes for the OpenRISC 1000 ISA. - Copyright 2002, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright 2002, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Damjan Lampret (lampret@opencores.org). This file is part of the GNU opcodes library. @@ -951,8 +951,10 @@ static void or32_print_register (char param_ch, char *encoding, unsigned long insn) { int regnum = or32_extract(param_ch, encoding, insn); - - sprintf (disassembled, "%sr%d", disassembled, regnum); + char s_regnum[20]; + + sprintf (s_regnum, "r%d", regnum); + strcat (disassembled, s_regnum); } /* Print immediate. Used only by print_insn. */ @@ -961,18 +963,20 @@ static void or32_print_immediate (char param_ch, char *encoding, unsigned long insn) { int imm = or32_extract (param_ch, encoding, insn); + char s_imm[20]; imm = extend_imm (imm, param_ch); - + if (letter_signed (param_ch)) { if (imm < 0) - sprintf (disassembled, "%s%d", disassembled, imm); + sprintf (s_imm, "%d", imm); else - sprintf (disassembled, "%s0x%x", disassembled, imm); + sprintf (s_imm, "0x%x", imm); } else - sprintf (disassembled, "%s%#x", disassembled, imm); + sprintf (s_imm, "%#x", imm); + strcat (disassembled, s_imm); } /* Disassemble one instruction from insn to disassemble. @@ -1005,14 +1009,22 @@ disassemble_insn (unsigned long insn) if (strchr (opcode->encoding, *s)) or32_print_immediate (*s, opcode->encoding, insn); else - sprintf (disassembled, "%s%c", disassembled, *s); + { + char s_encoding[2] = { *s, '\0' }; + + strcat (disassembled, s_encoding); + } + } } } else { + char s_insn[20]; + /* This used to be %8x for binutils. */ - sprintf (disassembled, "%s.word 0x%08lx", disassembled, insn); + sprintf (s_insn, ".word 0x%08lx", insn); + strcat (disassembled, s_insn); } return insn_len (insn); -- 2.30.2