[PATCH] libstdc++: Add error handler for <stacktrace>
François Dumont
frs.dumont@gmail.com
Wed Nov 30 06:04:29 GMT 2022
Good catch, then we also need this patch.
I still need to test it thought, just to make sure it compiles. Unless
you have a nice way to force call to the error callback ?
François
On 29/11/22 22:41, Björn Schäpers wrote:
> From: Björn Schäpers <bjoern@hazardy.de>
>
> Not providing an error handler results in a nullpointer dereference when
> an error occurs.
>
> libstdc++-v3/ChangeLog
>
> * include/std/stacktrace: Add __backtrace_error_handler and use
> it in all calls to libbacktrace.
> ---
> libstdc++-v3/include/std/stacktrace | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/stacktrace b/libstdc++-v3/include/std/stacktrace
> index e7cbbee5638..b786441cbad 100644
> --- a/libstdc++-v3/include/std/stacktrace
> +++ b/libstdc++-v3/include/std/stacktrace
> @@ -85,6 +85,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
> #define __cpp_lib_stacktrace 202011L
>
> + inline void
> + __backtrace_error_handler(void*, const char*, int) {}
> +
> // [stacktrace.entry], class stacktrace_entry
> class stacktrace_entry
> {
> @@ -159,7 +162,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> _S_init()
> {
> static __glibcxx_backtrace_state* __state
> - = __glibcxx_backtrace_create_state(nullptr, 1, nullptr, nullptr);
> + = __glibcxx_backtrace_create_state(nullptr, 1,
> + __backtrace_error_handler, nullptr);
> return __state;
> }
>
> @@ -192,7 +196,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> return __function != nullptr;
> };
> const auto __state = _S_init();
> - if (::__glibcxx_backtrace_pcinfo(__state, _M_pc, +__cb, nullptr, &__data))
> + if (::__glibcxx_backtrace_pcinfo(__state, _M_pc, +__cb,
> + __backtrace_error_handler, &__data))
> return true;
> if (__desc && __desc->empty())
> {
> @@ -201,8 +206,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> if (__symname)
> *static_cast<_Data*>(__data)->_M_desc = _S_demangle(__symname);
> };
> - if (::__glibcxx_backtrace_syminfo(__state, _M_pc, +__cb2, nullptr,
> - &__data))
> + if (::__glibcxx_backtrace_syminfo(__state, _M_pc, +__cb2,
> + __backtrace_error_handler, &__data))
> return true;
> }
> return false;
> @@ -252,7 +257,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> if (auto __cb = __ret._M_prepare()) [[likely]]
> {
> auto __state = stacktrace_entry::_S_init();
> - if (__glibcxx_backtrace_simple(__state, 1, __cb, nullptr,
> + if (__glibcxx_backtrace_simple(__state, 1, __cb,
> + __backtrace_error_handler,
> std::__addressof(__ret)))
> __ret._M_clear();
> }
> @@ -270,7 +276,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> if (auto __cb = __ret._M_prepare()) [[likely]]
> {
> auto __state = stacktrace_entry::_S_init();
> - if (__glibcxx_backtrace_simple(__state, __skip + 1, __cb, nullptr,
> + if (__glibcxx_backtrace_simple(__state, __skip + 1, __cb,
> + __backtrace_error_handler,
> std::__addressof(__ret)))
> __ret._M_clear();
> }
> @@ -294,7 +301,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> {
> auto __state = stacktrace_entry::_S_init();
> int __err = __glibcxx_backtrace_simple(__state, __skip + 1, __cb,
> - nullptr,
> + __backtrace_error_handler,
> std::__addressof(__ret));
> if (__err < 0)
> __ret._M_clear();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: debug.patch
Type: text/x-patch
Size: 960 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20221130/010b0791/attachment-0001.bin>
More information about the Libstdc++
mailing list