summaryrefslogtreecommitdiff
path: root/debian/patches/0001-libshouldbeinlibc-add-assert.h-variant-that-prints-b.patch
blob: 1c23b384eda055830f6ad510f306ed92b91115a0 (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
From 7b40b0208f3ee9af379b83720ff624dd99fdf823 Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Fri, 20 Jun 2014 15:50:53 +0200
Subject: [PATCH hurd 1/3] libshouldbeinlibc: add assert.h variant that prints
 backtraces

* libshouldbeinlibc/assert-backtrace.h: New file.
* libshouldbeinlibc/Makefile (installhdrs): Add assert-backtrace.h.
---
 libshouldbeinlibc/Makefile           |  4 ++-
 libshouldbeinlibc/assert-backtrace.h | 70 ++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 libshouldbeinlibc/assert-backtrace.h

diff --git a/libshouldbeinlibc/Makefile b/libshouldbeinlibc/Makefile
index 14a7939..b32e1bd 100644
--- a/libshouldbeinlibc/Makefile
+++ b/libshouldbeinlibc/Makefile
@@ -29,7 +29,9 @@ SRCS = termsize.c timefmt.c exec-reauth.c maptime-funcs.c \
        ugids-auth.c ugids-xinl.c ugids-merge.c ugids-imply.c ugids-posix.c \
        ugids-verify-auth.c nullauth.c
 installhdrs = idvec.h timefmt.h maptime.h \
-	      wire.h portinfo.h portxlate.h cacheq.h ugids.h nullauth.h
+	      wire.h portinfo.h portxlate.h cacheq.h ugids.h nullauth.h \
+	      assert-backtrace.h \
+
 installhdrsubdir = .
 
 OBJS = $(SRCS:.c=.o)
diff --git a/libshouldbeinlibc/assert-backtrace.h b/libshouldbeinlibc/assert-backtrace.h
new file mode 100644
index 0000000..099a112
--- /dev/null
+++ b/libshouldbeinlibc/assert-backtrace.h
@@ -0,0 +1,70 @@
+/* Augment failing assertions with backtraces.
+
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with the GNU Hurd.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef __ASSERT_BACKTRACE__
+#define __ASSERT_BACKTRACE__
+
+#ifndef NDEBUG
+
+#include <assert.h>
+#include <errno.h>
+#include <execinfo.h>
+#include <stdio.h>
+#include <unistd.h>
+
+/* This prints an "Assertion failed" message and aborts.  */
+static void __assert_fail_backtrace (const char *__assertion,
+                                     const char *__file,
+                                     unsigned int __line,
+                                     const char *__function)
+  __attribute__ ((noreturn, unused));
+
+#undef assert
+#define assert(expr)							\
+  ((expr)								\
+   ? __ASSERT_VOID_CAST (0)						\
+   : __assert_fail_backtrace (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
+
+static inline void
+__assert_fail_backtrace (const char *__assertion, const char *__file,
+                         unsigned int __line, const char *__function)
+{
+#define SIZE		128
+#define SKIP		1
+#define MY_errno	(*__errno_location ())
+  int nptrs;
+  void *buffer[SIZE];
+
+  error (0, 0, "%s:%d: %s: Assertion `%s' failed.",
+         __file, __line, __function, __assertion);
+
+  nptrs = backtrace(buffer, SIZE);
+  if (nptrs == 0)
+    error (1, MY_errno, "backtrace");
+
+  backtrace_symbols_fd (&buffer[SKIP], nptrs - SKIP, STDERR_FILENO);
+  fflush (stderr);
+  exit (EXIT_FAILURE);
+#undef MY_errno
+#undef SKIP
+#undef SIZE
+}
+
+#endif /* NDEBUG */
+#endif /* __ASSERT_BACKTRACE__ */
-- 
2.1.1