From: "H.J. Lu" <hjl.tools@gmail.com>
To: binutils@sourceware.org
Subject: [PATCH] plugin: Call dlclose before return in try_load_plugin
Date: Tue, 18 Feb 2020 12:50:00 -0000 [thread overview]
Message-ID: <20200218125016.140100-1-hjl.tools@gmail.com> (raw)
Since plugin can be used only once in try_load_plugin, call dlclose
before return.
OK for master and 2.34 branch?
PR binutils/25355
* plugin.c (plugin_list_entry): Remove handle.
(try_load_plugin): Call dlclose before return.
---
bfd/plugin.c | 43 ++++++++++++++++++-------------------------
1 file changed, 18 insertions(+), 25 deletions(-)
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 47c3439042c..84b96a20733 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -126,7 +126,6 @@ message (int level ATTRIBUTE_UNUSED,
struct plugin_list_entry
{
/* These must be initialized for each IR object with LTO wrapper. */
- void *handle;
ld_plugin_claim_file_handler claim_file;
ld_plugin_all_symbols_read_handler all_symbols_read;
ld_plugin_all_symbols_read_handler cleanup_handler;
@@ -596,22 +595,12 @@ try_load_plugin (const char *pname,
struct plugin_list_entry *plugin_list_iter,
bfd *abfd, bfd_boolean build_list_p)
{
- void *plugin_handle = NULL;
+ void *plugin_handle;
struct ld_plugin_tv tv[12];
int i;
ld_plugin_onload onload;
enum ld_plugin_status status;
-
- /* NB: Each object is independent. Reuse the previous plugin from
- the last run will lead to wrong result. */
- if (current_plugin)
- {
- if (current_plugin->handle)
- dlclose (current_plugin->handle);
- memset (current_plugin, 0,
- offsetof (struct plugin_list_entry, next));
- current_plugin = NULL;
- }
+ int result = 0;
if (plugin_list_iter)
pname = plugin_list_iter->plugin_name;
@@ -628,12 +617,12 @@ try_load_plugin (const char *pname,
size_t length_plugin_name = strlen (pname) + 1;
char *plugin_name = bfd_malloc (length_plugin_name);
if (plugin_name == NULL)
- return 0;
+ goto short_circuit;
plugin_list_iter = bfd_malloc (sizeof *plugin_list_iter);
if (plugin_list_iter == NULL)
{
free (plugin_name);
- return 0;
+ goto short_circuit;
}
/* Make a copy of PNAME since PNAME from load_plugin () will be
freed. */
@@ -644,13 +633,13 @@ try_load_plugin (const char *pname,
plugin_list = plugin_list_iter;
}
- plugin_list_iter->handle = plugin_handle;
+ current_plugin = plugin_list_iter;
if (build_list_p)
- return 0;
+ goto short_circuit;
onload = dlsym (plugin_handle, "onload");
if (!onload)
- return 0;
+ goto short_circuit;
i = 0;
tv[i].tv_tag = LDPT_MESSAGE;
@@ -703,28 +692,32 @@ try_load_plugin (const char *pname,
tv[i].tv_tag = LDPT_NULL;
tv[i].tv_u.tv_val = 0;
- current_plugin = plugin_list_iter;
-
/* LTO plugin will call handler hooks to set up plugin handlers. */
status = (*onload)(tv);
if (status != LDPS_OK)
- return 0;
+ goto short_circuit;
if (current_plugin->lto_wrapper
&& setup_lto_wrapper_env (current_plugin))
- return 0;
+ goto short_circuit;
abfd->plugin_format = bfd_plugin_no;
if (!current_plugin->claim_file)
- return 0;
+ goto short_circuit;
if (!try_claim (abfd))
- return 0;
+ goto short_circuit;
abfd->plugin_format = bfd_plugin_yes;
- return 1;
+ result = 1;
+
+short_circuit:
+ /* NB: Each object is independent. Reuse the previous plugin from
+ the last run will lead to wrong result. */
+ dlclose (plugin_handle);
+ return result;
}
/* There may be plugin libraries in lib/bfd-plugins. */
--
2.24.1
next reply other threads:[~2020-02-18 12:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-18 12:50 H.J. Lu [this message]
2020-02-19 4:59 ` Alan Modra
2020-02-19 11:35 ` H.J. Lu
2020-02-19 13:46 ` H.J. Lu
2020-02-19 16:49 ` Nick Clifton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200218125016.140100-1-hjl.tools@gmail.com \
--to=hjl.tools@gmail.com \
--cc=binutils@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).