* [PATCH] plugin: Call dlclose before return in try_load_plugin
@ 2020-02-18 12:50 H.J. Lu
2020-02-19 4:59 ` Alan Modra
0 siblings, 1 reply; 5+ messages in thread
From: H.J. Lu @ 2020-02-18 12:50 UTC (permalink / raw)
To: binutils
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] plugin: Call dlclose before return in try_load_plugin
2020-02-18 12:50 [PATCH] plugin: Call dlclose before return in try_load_plugin H.J. Lu
@ 2020-02-19 4:59 ` Alan Modra
2020-02-19 11:35 ` H.J. Lu
0 siblings, 1 reply; 5+ messages in thread
From: Alan Modra @ 2020-02-19 4:59 UTC (permalink / raw)
To: H.J. Lu; +Cc: binutils
On Tue, Feb 18, 2020 at 04:50:16AM -0800, H.J. Lu wrote:
> 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.
Looks OK to me.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] plugin: Call dlclose before return in try_load_plugin
2020-02-19 4:59 ` Alan Modra
@ 2020-02-19 11:35 ` H.J. Lu
2020-02-19 13:46 ` H.J. Lu
0 siblings, 1 reply; 5+ messages in thread
From: H.J. Lu @ 2020-02-19 11:35 UTC (permalink / raw)
To: Alan Modra; +Cc: Binutils
[-- Attachment #1: Type: text/plain, Size: 601 bytes --]
On Tue, Feb 18, 2020 at 8:59 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Tue, Feb 18, 2020 at 04:50:16AM -0800, H.J. Lu wrote:
> > 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.
>
> Looks OK to me.
>
This is the patch I am checking in. It kept
if (current_plugin)
memset (current_plugin, 0,
offsetof (struct plugin_list_entry, next));
--
H.J.
[-- Attachment #2: 0001-plugin-Call-dlclose-before-return-in-try_load_plugin.patch --]
[-- Type: text/x-patch, Size: 3546 bytes --]
From d9d92bacb7adb4bab0c26eb7458203345a0faf13 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Tue, 18 Feb 2020 04:22:34 -0800
Subject: [PATCH] plugin: Call dlclose before return in try_load_plugin
Since plugin can be used only once in try_load_plugin, call dlclose
before return.
PR binutils/25355
* plugin.c (plugin_list_entry): Remove handle.
(try_load_plugin): Call dlclose before return.
---
bfd/plugin.c | 39 ++++++++++++++++++---------------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 47c3439042c..93d562b9fed 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,18 @@ 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;
+ int result = 0;
/* 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;
- }
+ memset (current_plugin, 0,
+ offsetof (struct plugin_list_entry, next));
if (plugin_list_iter)
pname = plugin_list_iter->plugin_name;
@@ -628,12 +623,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 +639,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 +698,30 @@ 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:
+ dlclose (plugin_handle);
+ return result;
}
/* There may be plugin libraries in lib/bfd-plugins. */
--
2.24.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] plugin: Call dlclose before return in try_load_plugin
2020-02-19 11:35 ` H.J. Lu
@ 2020-02-19 13:46 ` H.J. Lu
2020-02-19 16:49 ` Nick Clifton
0 siblings, 1 reply; 5+ messages in thread
From: H.J. Lu @ 2020-02-19 13:46 UTC (permalink / raw)
To: Alan Modra, Nick Clifton; +Cc: Binutils
On Wed, Feb 19, 2020 at 3:35 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Tue, Feb 18, 2020 at 8:59 PM Alan Modra <amodra@gmail.com> wrote:
> >
> > On Tue, Feb 18, 2020 at 04:50:16AM -0800, H.J. Lu wrote:
> > > 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.
> >
> > Looks OK to me.
> >
>
> This is the patch I am checking in. It kept
>
> if (current_plugin)
> memset (current_plugin, 0,
> offsetof (struct plugin_list_entry, next));
>
Hi Nick,
Is it OK for backport to 2.34 branch?
--
H.J.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] plugin: Call dlclose before return in try_load_plugin
2020-02-19 13:46 ` H.J. Lu
@ 2020-02-19 16:49 ` Nick Clifton
0 siblings, 0 replies; 5+ messages in thread
From: Nick Clifton @ 2020-02-19 16:49 UTC (permalink / raw)
To: H.J. Lu, Alan Modra; +Cc: Binutils
Hi H.J.
>>>> PR binutils/25355
>>>> * plugin.c (plugin_list_entry): Remove handle.
>>>> (try_load_plugin): Call dlclose before return.
> Is it OK for backport to 2.34 branch?
Yes - please do.
Cheers
Nick
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-02-19 16:49 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-18 12:50 [PATCH] plugin: Call dlclose before return in try_load_plugin H.J. Lu
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
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).