[v2] elf: Replace nsid with args.nsid [BZ #27609]

Message ID 20210930182311.3718571-1-hjl.tools@gmail.com
State New
Headers show
Series
  • [v2] elf: Replace nsid with args.nsid [BZ #27609]
Related show

Commit Message

Florian Weimer via Libc-alpha Sept. 30, 2021, 6:23 p.m.
do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls
dl_open_worker with args.nsid = nsid.  dl_open_worker updates args.nsid
if it is __LM_ID_CALLER.  After dl_open_worker returns, use args.nsid
instead of nsid.  This fixes BZ #27609.
---
 elf/dl-open.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.31.1

Comments

Florian Weimer via Libc-alpha Sept. 30, 2021, 6:27 p.m. | #1
* H. J. Lu:

> do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls

> dl_open_worker with args.nsid = nsid.  dl_open_worker updates args.nsid

> if it is __LM_ID_CALLER.  After dl_open_worker returns, use args.nsid

> instead of nsid.  This fixes BZ #27609.

> ---

>  elf/dl-open.c | 2 +-

>  1 file changed, 1 insertion(+), 1 deletion(-)

>

> diff --git a/elf/dl-open.c b/elf/dl-open.c

> index a25443f6d1..5295e931b0 100644

> --- a/elf/dl-open.c

> +++ b/elf/dl-open.c

> @@ -886,7 +886,7 @@ no more namespaces available for dlmopen()"));

>        /* Avoid keeping around a dangling reference to the libc.so link

>  	 map in case it has been cached in libc_map.  */

>        if (!args.libc_already_loaded)

> -	GL(dl_ns)[nsid].libc_map = NULL;

> +	GL(dl_ns)[args.nsid].libc_map = NULL;

>  

>        /* Remove the object from memory.  It may be in an inconsistent

>  	 state if relocation failed, for example.  */


Patch looks okay.  But could you reference the fixed commit in the
commit message?

Thanks,
Florian
Florian Weimer via Libc-alpha Sept. 30, 2021, 6:36 p.m. | #2
On Thu, Sep 30, 2021 at 11:27 AM Florian Weimer <fweimer@redhat.com> wrote:
>

> * H. J. Lu:

>

> > do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls

> > dl_open_worker with args.nsid = nsid.  dl_open_worker updates args.nsid

> > if it is __LM_ID_CALLER.  After dl_open_worker returns, use args.nsid

> > instead of nsid.  This fixes BZ #27609.

> > ---

> >  elf/dl-open.c | 2 +-

> >  1 file changed, 1 insertion(+), 1 deletion(-)

> >

> > diff --git a/elf/dl-open.c b/elf/dl-open.c

> > index a25443f6d1..5295e931b0 100644

> > --- a/elf/dl-open.c

> > +++ b/elf/dl-open.c

> > @@ -886,7 +886,7 @@ no more namespaces available for dlmopen()"));

> >        /* Avoid keeping around a dangling reference to the libc.so link

> >        map in case it has been cached in libc_map.  */

> >        if (!args.libc_already_loaded)

> > -     GL(dl_ns)[nsid].libc_map = NULL;

> > +     GL(dl_ns)[args.nsid].libc_map = NULL;

> >

> >        /* Remove the object from memory.  It may be in an inconsistent

> >        state if relocation failed, for example.  */

>

> Patch looks okay.  But could you reference the fixed commit in the

> commit message?

>


Done.   Here is the patch I am checking in.

Thanks.

-- 
H.J.
From 735f80b08b910c5e10c95fb5ea72b39726b143bb Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 30 Sep 2021 10:29:17 -0700
Subject: [PATCH v3] elf: Replace nsid with args.nsid [BZ #27609]

commit ec935dea6332cb22f9881cd1162bad156173f4b0
Author: Florian Weimer <fweimer@redhat.com>
Date:   Fri Apr 24 22:31:15 2020 +0200

    elf: Implement __libc_early_init

has

@@ -856,6 +876,11 @@ no more namespaces available for dlmopen()"));
   /* See if an error occurred during loading.  */
   if (__glibc_unlikely (exception.errstring != NULL))
     {
+      /* Avoid keeping around a dangling reference to the libc.so link
+   map in case it has been cached in libc_map.  */
+      if (!args.libc_already_loaded)
+  GL(dl_ns)[nsid].libc_map = NULL;
+

do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls
dl_open_worker with args.nsid = nsid.  dl_open_worker updates args.nsid
if it is __LM_ID_CALLER.  After dl_open_worker returns, it is wrong to
use nsid.

Replace nsid with args.nsid after dl_open_worker returns.  This fixes
BZ #27609.
---
 elf/dl-open.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/elf/dl-open.c b/elf/dl-open.c
index a25443f6d1..5295e931b0 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -886,7 +886,7 @@ no more namespaces available for dlmopen()"));
       /* Avoid keeping around a dangling reference to the libc.so link
 	 map in case it has been cached in libc_map.  */
       if (!args.libc_already_loaded)
-	GL(dl_ns)[nsid].libc_map = NULL;
+	GL(dl_ns)[args.nsid].libc_map = NULL;
 
       /* Remove the object from memory.  It may be in an inconsistent
 	 state if relocation failed, for example.  */

Patch

diff --git a/elf/dl-open.c b/elf/dl-open.c
index a25443f6d1..5295e931b0 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -886,7 +886,7 @@  no more namespaces available for dlmopen()"));
       /* Avoid keeping around a dangling reference to the libc.so link
 	 map in case it has been cached in libc_map.  */
       if (!args.libc_already_loaded)
-	GL(dl_ns)[nsid].libc_map = NULL;
+	GL(dl_ns)[args.nsid].libc_map = NULL;
 
       /* Remove the object from memory.  It may be in an inconsistent
 	 state if relocation failed, for example.  */