forked from rpms/glibc
55 lines
2.2 KiB
Diff
55 lines
2.2 KiB
Diff
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 --git a/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c
|
|
index d5f418ab1848f0c4..9cb002ccfed2c7b4 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 95dc87519b80e0ec..cc2484033fe0d902 100644
|
|
--- a/sysdeps/generic/ldsodefs.h
|
|
+++ b/sysdeps/generic/ldsodefs.h
|
|
@@ -852,7 +852,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)
|