This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[glibc] Enhance _dl_catch_exception to allow disabling exception handling


https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=2a764c6ee848dfe92cb2921ed3b14085f15d9e79

commit 2a764c6ee848dfe92cb2921ed3b14085f15d9e79
Author: Florian Weimer <fweimer@redhat.com>
Date:   Thu Oct 31 13:23:06 2019 +0100

    Enhance _dl_catch_exception to allow disabling exception handling
    
    In some cases, it is necessary to introduce noexcept regions
    where raised dynamic loader exceptions (e.g., from lazy binding)
    are fatal, despite being nested in a code region with an active
    exception handler.  This change enhances _dl_catch_exception with
    to provide such a capability.  The existing function is reused,
    so that it is not necessary to introduce yet another function with
    a similar purpose.
    
    Change-Id: Iec1bf642ff95a349fdde8040e9baf851ac7b8904

Diff:
---
 elf/dl-error-skeleton.c    | 12 ++++++++++++
 sysdeps/generic/ldsodefs.h |  4 +++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c
index a261af6..7caf28f 100644
--- a/elf/dl-error-skeleton.c
+++ b/elf/dl-error-skeleton.c
@@ -173,6 +173,18 @@ int
 _dl_catch_exception (struct dl_exception *exception,
 		     void (*operate) (void *), void *args)
 {
+  /* If exception is NULL, temporarily disable exception handling.
+     Exceptions during operate (args) are fatal.  */
+  if (exception == NULL)
+    {
+      struct catch *const old = catch_hook;
+      catch_hook = NULL;
+      operate (args);
+      /* If we get here, the operation was successful.  */
+      catch_hook = old;
+      return 0;
+    }
+
   /* We need not handle `receiver' since setting a `catch' is handled
      before it.  */
 
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 4d67c05..891049d 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -861,7 +861,9 @@ libc_hidden_proto (_dl_catch_error)
 
 /* Call OPERATE (ARGS).  If no error occurs, set *EXCEPTION to zero.
    Otherwise, store a copy of the raised exception in *EXCEPTION,
-   which has to be freed by _dl_exception_free.  */
+   which has to be freed by _dl_exception_free.  As a special case, if
+   EXCEPTION is null, call OPERATE (ARGS) with exception handling
+   disabled (so that exceptions are fatal).  */
 int _dl_catch_exception (struct dl_exception *exception,
 			 void (*operate) (void *), void *args);
 libc_hidden_proto (_dl_catch_exception)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]