summaryrefslogtreecommitdiff
path: root/net-fs/samba/files/samba-4.15.9-libunwind-automagic.patch
blob: c3a2c802e6e987735cf5792fae543934b5e09f73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
https://gitlab.com/samba-team/samba/-/commit/14feb93d481011765f62614ab49b304e17e4f6fd
https://gitlab.com/samba-team/samba/-/merge_requests/2401?commit_id=ac8064cb0d79db377df75a22a240632dbc37f99f
https://bugs.gentoo.org/791349

From 14feb93d481011765f62614ab49b304e17e4f6fd Mon Sep 17 00:00:00 2001
From: Andrew Bartlett <abartlet@samba.org>
Date: Tue, 7 Jun 2022 15:07:59 +1200
Subject: [PATCH] lib/util: Prefer backtrace_symbols() for internal backtraces

Backtraces when Samba is in PANIC state are better with
backtrace_symbols() than with libunwind on Ubuntu 20.04 x86_64
so move libunwind to a off-by-default option, prompted for
if backtrace_symbols() is not available.

Based on a request by Fco Javier Felix <ffelix@inode64.com>

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Joseph Sutton <josephsutton@catalyst.net.nz>
--- a/lib/util/fault.c
+++ b/lib/util/fault.c
@@ -222,9 +222,13 @@ _PUBLIC_ void smb_panic(const char *why)
 void log_stack_trace(void)
 {
 #ifdef HAVE_LIBUNWIND
-	/* Try to use libunwind before any other technique since on ia64
-	 * libunwind correctly walks the stack in more circumstances than
-	 * backtrace.
+	/*
+	 * --with-libunwind is required to use libunwind, the
+	 * backtrace_symbols() code below is the default.
+	 *
+	 * This code is available because a previous version of this
+	 * comment asserted that on ia64 libunwind correctly walks the
+	 * stack in more circumstances than backtrace.
 	 */
 	unw_cursor_t cursor;
 	unw_context_t uc;
--- a/lib/util/wscript
+++ b/lib/util/wscript
@@ -2,6 +2,15 @@ def options(opt):
     ''' This is a bit strange, but disable is the flag, not enable. '''
     opt.add_option('--disable-fault-handling', action='store_true', dest='disable_fault_handling', help=('disable the fault handlers'), default=False)
 
+    # We do not want libunwind by default (backtrace_symbols() in
+    # glibc is better) but allow (eg) IA-64 to build with it where it
+    # might be better (per old comment in fault.c)
+    opt.samba_add_onoff_option('libunwind',
+                               default=None,
+                               help='''Use libunwind instead of the default backtrace_symbols()
+                               from libc, for example on IA-64 where it might give a better
+                               backtrace.''')
+
     opt.add_option('--with-systemd',
                    help=("Enable systemd integration"),
                    action='store_true', dest='enable_systemd')
--- a/lib/util/wscript_configure
+++ b/lib/util/wscript_configure
@@ -1,23 +1,35 @@
 #!/usr/bin/env python
-from waflib import Logs, Options
+from waflib import Logs, Options, Errors
 
 import os, sys
 
 if Options.options.disable_fault_handling:
     conf.DEFINE('HAVE_DISABLE_FAULT_HANDLING',1)
 
-# backtrace could be in libexecinfo or in libc
+# backtrace could be in libexecinfo or in libc.
+# This is our preferred backtrace handler (more useful output than libunwind as at Ubuntu 20.04 x86_64)
 conf.CHECK_FUNCS_IN('backtrace backtrace_symbols', 'execinfo', checklibc=True, headers='execinfo.h')
 conf.CHECK_HEADERS('execinfo.h')
 
 conf.SET_TARGET_TYPE('LIBUNWIND', 'EMPTY')
-if conf.check_cfg(package='libunwind-generic',
-                  args='--cflags --libs',
-                  msg='Checking for libunwind',
-                  uselib_store='LIBUNWIND',
-                  mandatory=False):
-    if conf.CHECK_HEADERS('libunwind.h'):
-        conf.SET_TARGET_TYPE('LIBUNWIND', 'SYSLIB')
+if Options.options.with_libunwind:
+    if conf.check_cfg(package='libunwind-generic',
+                      args='--cflags --libs',
+                      msg='Checking for libunwind',
+                      uselib_store='LIBUNWIND',
+                      mandatory=False):
+        if conf.CHECK_HEADERS('libunwind.h'):
+            conf.SET_TARGET_TYPE('LIBUNWIND', 'SYSLIB')
+    else:
+        raise Errors.WafError('--with-libunwind specified but libunwind not found')
+elif Options.options.with_libunwind == None:
+    if not conf.CONFIG_SET('HAVE_BACKTRACE_SYMBOLS') \
+       and not Options.options.disable_fault_handling:
+        raise Errors.WafError(
+'''backtrace_symbols() not found but
+--with-libunwind not specified.
+Use --without-libunwind to build without internal backtrace support or
+--disable-fault-handling to totally defer fault handling to the OS.''')
 
 conf.CHECK_STRUCTURE_MEMBER('struct statvfs', 'f_frsize', define='HAVE_FRSIZE', headers='sys/statvfs.h')
 
--- a/script/autobuild.py
+++ b/script/autobuild.py
@@ -480,10 +480,11 @@ tasks = {
     # MIT Kerberos from the current system.  Runtime behaviour is
     # confirmed via the ktest (static ccache and keytab) environment
 
+    # This environment also used to confirm we can still build with --with-libunwind
     "samba-ktest-mit": {
         "sequence": [
             ("random-sleep", random_sleep(300, 900)),
-            ("configure", "./configure.developer --without-ad-dc --with-system-mitkrb5 " + samba_configure_params),
+            ("configure", "./configure.developer --without-ad-dc --with-libunwind --with-system-mitkrb5 " + samba_configure_params),
             ("make", "make -j"),
             ("test", make_test(include_envs=[
             "ktest", # ktest is also tested in fileserver, samba and
GitLab