diff options
author | Indu Bhagat <indu.bhagat@oracle.com> | 2024-05-21 12:59:55 -0700 |
---|---|---|
committer | Indu Bhagat <indu.bhagat@oracle.com> | 2024-05-21 12:59:55 -0700 |
commit | 002ccda0ef390fc2f02c0a27f01993bd5009f03d (patch) | |
tree | 0a462c5ae923126e45b477f51ee809f88558827b | |
parent | e63b1d595021ce64d20e06a32c0ec69c9a3e56e7 (diff) | |
download | binutils-002ccda0ef390fc2f02c0a27f01993bd5009f03d.zip binutils-002ccda0ef390fc2f02c0a27f01993bd5009f03d.tar.gz binutils-002ccda0ef390fc2f02c0a27f01993bd5009f03d.tar.bz2 |
gas: ginsn: remove unnecessary buffer allocation and free
A previous commit 80ec235 fixed the memory leaks, but brought to light
that the code should ideally make consistent use of snprintf and not
allocate/free more buffers than necessary.
gas/
* ginsn.c (ginsn_dst_print): Use snprintf consistently.
-rw-r--r-- | gas/ginsn.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/gas/ginsn.c b/gas/ginsn.c index b60b2e5..20e83c5 100644 --- a/gas/ginsn.c +++ b/gas/ginsn.c @@ -497,28 +497,25 @@ ginsn_src_print (struct ginsn_src *src) static char* ginsn_dst_print (struct ginsn_dst *dst) { + int str_size = 0; size_t len = GINSN_LISTING_OPND_LEN; char *dst_str = XNEWVEC (char, len); memset (dst_str, 0, len); if (dst->type == GINSN_DST_REG) - { - char *buf = XNEWVEC (char, 32); - sprintf (buf, "%%r%d", ginsn_get_dst_reg (dst)); - strcat (dst_str, buf); - free (buf); - } + str_size = snprintf (dst_str, GINSN_LISTING_OPND_LEN, + "%%r%d", ginsn_get_dst_reg (dst)); else if (dst->type == GINSN_DST_INDIRECT) - { - char *buf = XNEWVEC (char, 32); - sprintf (buf, "[%%r%d+%lld]", ginsn_get_dst_reg (dst), - (long long int) ginsn_get_dst_disp (dst)); - strcat (dst_str, buf); - free (buf); - } - - gas_assert (strlen (dst_str) < GINSN_LISTING_OPND_LEN); + str_size = snprintf (dst_str, GINSN_LISTING_OPND_LEN, + "[%%r%d+%lld]", ginsn_get_dst_reg (dst), + (long long int) ginsn_get_dst_disp (dst)); + else if (dst->type != GINSN_DST_UNKNOWN) + /* Other dst types are unexpected. */ + gas_assert (false); + + /* str_size will remain 0 when GINSN_DST_UNKNOWN. */ + gas_assert (str_size >= 0 && str_size < GINSN_LISTING_OPND_LEN); return dst_str; } |