bfd_error_on_input messages
bfd_errmsg uses asprintf for bfd_error_on_input, which means we currently leak memory. Keep a static pointer to the message and free it in various places to minimise the leaks. bfd_set_input_error (NULL, bfd_error_no_error) is a way to free up the last string if that matters. * bfd.c (input_error_msg): New static var. (bfd_set_input_error): Free it here.. (bfd_init): ..and here.. (bfd_errmsg): ..and here. Use it for asprintf output.
This commit is contained in:
parent
6fc018e9e5
commit
fc998e4cb7
1 changed files with 10 additions and 4 deletions
14
bfd/bfd.c
14
bfd/bfd.c
|
@ -703,8 +703,9 @@ CODE_FRAGMENT
|
|||
*/
|
||||
|
||||
static bfd_error_type bfd_error;
|
||||
static bfd *input_bfd;
|
||||
static bfd_error_type input_error;
|
||||
static bfd *input_bfd;
|
||||
static char *input_error_msg;
|
||||
|
||||
const char *const bfd_errmsgs[] =
|
||||
{
|
||||
|
@ -792,6 +793,8 @@ bfd_set_input_error (bfd *input, bfd_error_type error_tag)
|
|||
/* This is an error that occurred during bfd_close when writing an
|
||||
archive, but on one of the input files. */
|
||||
bfd_error = bfd_error_on_input;
|
||||
free (input_error_msg);
|
||||
input_error_msg = NULL;
|
||||
input_bfd = input;
|
||||
input_error = error_tag;
|
||||
if (input_error >= bfd_error_on_input)
|
||||
|
@ -818,12 +821,13 @@ bfd_errmsg (bfd_error_type error_tag)
|
|||
#endif
|
||||
if (error_tag == bfd_error_on_input)
|
||||
{
|
||||
char *buf;
|
||||
const char *msg = bfd_errmsg (input_error);
|
||||
|
||||
if (asprintf (&buf, _(bfd_errmsgs [error_tag]),
|
||||
free (input_error_msg);
|
||||
input_error_msg = NULL;
|
||||
if (asprintf (&input_error_msg, _(bfd_errmsgs [error_tag]),
|
||||
bfd_get_filename (input_bfd), msg) != -1)
|
||||
return buf;
|
||||
return input_error_msg;
|
||||
|
||||
/* Ick, what to do on out of memory? */
|
||||
return msg;
|
||||
|
@ -1659,6 +1663,8 @@ bfd_init (void)
|
|||
{
|
||||
bfd_error = bfd_error_no_error;
|
||||
input_bfd = NULL;
|
||||
free (input_error_msg);
|
||||
input_error_msg = NULL;
|
||||
input_error = bfd_error_no_error;
|
||||
_bfd_error_program_name = NULL;
|
||||
_bfd_error_internal = error_handler_fprintf;
|
||||
|
|
Loading…
Add table
Reference in a new issue