Module Name: src
Committed By: christos
Date: Thu Jan 23 12:08:12 UTC 2025
Modified Files:
src/lib/libexecinfo: backtrace.3 backtrace.c execinfo.h
Log Message:
Add backtrace_sandbox_{init,fini} for backtrace use in sandboxes.
(Kyle Evans @ FreeBSD)
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/lib/libexecinfo/backtrace.3
cvs rdiff -u -r1.8 -r1.9 src/lib/libexecinfo/backtrace.c
cvs rdiff -u -r1.4 -r1.5 src/lib/libexecinfo/execinfo.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libexecinfo/backtrace.3
diff -u src/lib/libexecinfo/backtrace.3:1.10 src/lib/libexecinfo/backtrace.3:1.11
--- src/lib/libexecinfo/backtrace.3:1.10 Sun Oct 22 10:07:03 2017
+++ src/lib/libexecinfo/backtrace.3 Thu Jan 23 07:08:12 2025
@@ -1,4 +1,4 @@
-.\" $NetBSD: backtrace.3,v 1.10 2017/10/22 14:07:03 abhinav Exp $
+.\" $NetBSD: backtrace.3,v 1.11 2025/01/23 12:08:12 christos Exp $
.\"
.\" Copyright (c) 2012 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd November 5, 2015
+.Dd January 22, 2025
.Dt BACKTRACE 3
.Os
.Sh NAME
@@ -43,6 +43,10 @@
.In execinfo.h
.Ft size_t
.Fn backtrace "void **addrlist" "size_t len"
+.Ft "int"
+.Fn backtrace_sandbox_init "void"
+.Ft "void"
+.Fn backtrace_sandbox_fini "void"
.Ft "char **"
.Fn backtrace_symbols "void * const *addrlist" "size_t len"
.Ft int
@@ -64,6 +68,20 @@ The number of frames found (which can be
is returned.
.Pp
The
+.Fn backtrace_sandbox_init
+and
+.Fn backtrace_sandbox_fini
+functions are intended to enable sandbox usage of
+.Nm .
+The
+.Fn backtrace_sandbox_init
+function must be called before the sandbox is entered, and will acquire any
+resources needed to function in a sandbox.
+The
+.Fn backtrace_sandbox_fini
+function will release the resources it acquired.
+.Pp
+The
.Fn backtrace_symbols_fmt
function takes an array of previously filled addresses from
.Fn backtrace
Index: src/lib/libexecinfo/backtrace.c
diff -u src/lib/libexecinfo/backtrace.c:1.8 src/lib/libexecinfo/backtrace.c:1.9
--- src/lib/libexecinfo/backtrace.c:1.8 Sat Jun 25 02:51:37 2022
+++ src/lib/libexecinfo/backtrace.c Thu Jan 23 07:08:12 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: backtrace.c,v 1.8 2022/06/25 06:51:37 skrll Exp $ */
+/* $NetBSD: backtrace.c,v 1.9 2025/01/23 12:08:12 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: backtrace.c,v 1.8 2022/06/25 06:51:37 skrll Exp $");
+__RCSID("$NetBSD: backtrace.c,v 1.9 2025/01/23 12:08:12 christos Exp $");
#include <sys/param.h>
#include <assert.h>
@@ -55,6 +55,8 @@ __RCSID("$NetBSD: backtrace.c,v 1.8 2022
#define SELF "/proc/curproc/file"
#endif
+static int self_fd = -1;
+
static int
open_self(int flags)
{
@@ -73,6 +75,23 @@ open_self(int flags)
return open(pathname, flags);
}
+int
+backtrace_sandbox_init(void)
+{
+
+ if (self_fd == -1)
+ self_fd = open_self(O_RDONLY);
+ return self_fd >= 0 ? 0 : -1;
+}
+
+void
+backtrace_sandbox_fini(void)
+{
+ assert(self_fd >= 0);
+
+ close(self_fd);
+ self_fd = -1;
+}
static int __printflike(4, 5)
rasprintf(char **buf, size_t *bufsiz, size_t offs, const char *fmt, ...)
@@ -182,9 +201,9 @@ backtrace_symbols_fmt(void *const *trace
static const size_t slen = sizeof(char *) + 64; /* estimate */
char *ptr;
symtab_t *st;
- int fd;
+ int fd = self_fd;
- if ((fd = open_self(O_RDONLY)) != -1)
+ if (fd != -1 || (fd = open_self(O_RDONLY)) != -1)
st = symtab_create(fd, -1, STT_FUNC);
else
st = NULL;
@@ -216,7 +235,7 @@ backtrace_symbols_fmt(void *const *trace
out:
symtab_destroy(st);
- if (fd != -1)
+ if (fd != -1 && fd != self_fd)
(void)close(fd);
return (void *)ptr;
Index: src/lib/libexecinfo/execinfo.h
diff -u src/lib/libexecinfo/execinfo.h:1.4 src/lib/libexecinfo/execinfo.h:1.5
--- src/lib/libexecinfo/execinfo.h:1.4 Wed Aug 23 08:24:59 2023
+++ src/lib/libexecinfo/execinfo.h Thu Jan 23 07:08:12 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: execinfo.h,v 1.4 2023/08/23 12:24:59 rin Exp $ */
+/* $NetBSD: execinfo.h,v 1.5 2025/01/23 12:08:12 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -41,6 +41,8 @@ typedef _BSD_SIZE_T_ size_t;
#endif
__BEGIN_DECLS
+int backtrace_sandbox_init(void);
+void backtrace_sandbox_fini(void);
size_t backtrace(void **, size_t);
char **backtrace_symbols(void *const *, size_t);
int backtrace_symbols_fd(void *const *, size_t, int);