commit:     04a58bcbdf1002ccaddeb03bb13505350baeb996
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Thu Oct 28 10:33:00 2021 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Thu Oct 28 10:33:00 2021 +0000
URL:        https://gitweb.gentoo.org/proj/sandbox.git/commit/?id=04a58bcb

libsandbox: hoist the *at pre-check functions up a level

The reason we put these in wrapper-funcs/ is because we normally
dynamically include them when the corresponding symbol is available.
For example, if the C library supports symbol foo, and there is a
wrapper-funcs/foo_pre_check.c, we'll automatically include it based
on the assumption that wrapper-funcs/foo.c needs it.  But if the C
library doesn't have a symbol foo, we won't include foo.c or the
foo_pre_check.c file at all.  Sounds fine.

The *at family of functions is a bit different because we end up
using them both in the wrapper-funcs/ files, and in the trace code,
the latter of which we use unconditionally.  This lead to a build
issue early on (see commit b27df46f349e850067ae388fe067b043abf3aecb
("libsandbox: fix missing *at pre_checks")) whereby we hacked in
these *at pre-check symbols all the time.  At which point, having
them be in wrapper-funcs/ was more out of convention with how we
manage all our other APIs.

We want to support running ptrace from the sandbox binary directly
which requires linking (most of) libsandbox into it, and to that
end, hoist these pre-check functions out of wrapper-funcs.  This
makes it a bit clearer that we always want to compile these.

Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>

 libsandbox/local.mk                                |  5 +++++
 .../__pre_at_check.c => pre_check_at.c}            |  5 +++++
 .../mkdirat_pre_check.c => pre_check_mkdirat.c}    |  5 +++++
 .../openat_pre_check.c => pre_check_openat.c}      |  5 +++++
 libsandbox/pre_check_openat64.c                    | 17 +++++++++++++++
 .../unlinkat_pre_check.c => pre_check_unlinkat.c}  |  5 +++++
 libsandbox/wrapper-funcs/__pre_check.c             | 24 ----------------------
 libsandbox/wrapper-funcs/openat64_pre_check.c      | 12 -----------
 scripts/gen_symbol_header.awk                      |  2 --
 9 files changed, 42 insertions(+), 38 deletions(-)

diff --git a/libsandbox/local.mk b/libsandbox/local.mk
index 131bcd8..50bc54d 100644
--- a/libsandbox/local.mk
+++ b/libsandbox/local.mk
@@ -27,6 +27,11 @@ libsbutil/.libs/libsbutil.a: libsbutil/libsbutil.la
        %D%/libsandbox.c \
        %D%/lock.c       \
        %D%/memory.c     \
+       %D%/pre_check_at.c \
+       %D%/pre_check_mkdirat.c \
+       %D%/pre_check_openat64.c \
+       %D%/pre_check_openat.c \
+       %D%/pre_check_unlinkat.c \
        %D%/trace.c      \
        %D%/wrappers.h   \
        %D%/wrappers.c   \

diff --git a/libsandbox/wrapper-funcs/__pre_at_check.c 
b/libsandbox/pre_check_at.c
similarity index 91%
rename from libsandbox/wrapper-funcs/__pre_at_check.c
rename to libsandbox/pre_check_at.c
index f72c40c..be6e634 100644
--- a/libsandbox/wrapper-funcs/__pre_at_check.c
+++ b/libsandbox/pre_check_at.c
@@ -5,6 +5,11 @@
  * Licensed under the GPL-2
  */
 
+#include "headers.h"
+#include "sbutil.h"
+#include "libsandbox.h"
+#include "wrappers.h"
+
 /* We assume the parent has nested use with save/restore errno */
 bool sb_common_at_pre_check(const char *func, const char **pathname, int dirfd,
                             char *dirfd_path, size_t dirfd_path_len)

diff --git a/libsandbox/wrapper-funcs/mkdirat_pre_check.c 
b/libsandbox/pre_check_mkdirat.c
similarity index 95%
rename from libsandbox/wrapper-funcs/mkdirat_pre_check.c
rename to libsandbox/pre_check_mkdirat.c
index 0b48d1f..8fb38bb 100644
--- a/libsandbox/wrapper-funcs/mkdirat_pre_check.c
+++ b/libsandbox/pre_check_mkdirat.c
@@ -5,6 +5,11 @@
  * Licensed under the GPL-2
  */
 
+#include "headers.h"
+#include "sbutil.h"
+#include "libsandbox.h"
+#include "wrappers.h"
+
 bool sb_mkdirat_pre_check(const char *func, const char *pathname, int dirfd)
 {
        char canonic[SB_PATH_MAX];

diff --git a/libsandbox/wrapper-funcs/openat_pre_check.c 
b/libsandbox/pre_check_openat.c
similarity index 90%
rename from libsandbox/wrapper-funcs/openat_pre_check.c
rename to libsandbox/pre_check_openat.c
index 5fd5eaa..8cf8133 100644
--- a/libsandbox/wrapper-funcs/openat_pre_check.c
+++ b/libsandbox/pre_check_openat.c
@@ -5,6 +5,11 @@
  * Licensed under the GPL-2
  */
 
+#include "headers.h"
+#include "sbutil.h"
+#include "libsandbox.h"
+#include "wrappers.h"
+
 bool sb_openat_pre_check(const char *func, const char *pathname, int dirfd, 
int flags)
 {
        /* If we're not trying to create, fail normally if

diff --git a/libsandbox/pre_check_openat64.c b/libsandbox/pre_check_openat64.c
new file mode 100644
index 0000000..9420c98
--- /dev/null
+++ b/libsandbox/pre_check_openat64.c
@@ -0,0 +1,17 @@
+/*
+ * open*64*() pre-check.
+ *
+ * Copyright 1999-2009 Gentoo Foundation
+ * Licensed under the GPL-2
+ */
+
+#include "headers.h"
+#include "sbutil.h"
+#include "libsandbox.h"
+#include "wrappers.h"
+
+#include "wrapper-funcs/__64_pre.h"
+#define sb_openat_pre_check sb_openat64_pre_check
+#include "pre_check_openat.c"
+#undef sb_openat_pre_check
+#include "wrapper-funcs/__64_post.h"

diff --git a/libsandbox/wrapper-funcs/unlinkat_pre_check.c 
b/libsandbox/pre_check_unlinkat.c
similarity index 92%
rename from libsandbox/wrapper-funcs/unlinkat_pre_check.c
rename to libsandbox/pre_check_unlinkat.c
index c004d15..93a0dd9 100644
--- a/libsandbox/wrapper-funcs/unlinkat_pre_check.c
+++ b/libsandbox/pre_check_unlinkat.c
@@ -5,6 +5,11 @@
  * Licensed under the GPL-2
  */
 
+#include "headers.h"
+#include "sbutil.h"
+#include "libsandbox.h"
+#include "wrappers.h"
+
 bool sb_unlinkat_pre_check(const char *func, const char *pathname, int dirfd)
 {
        char canonic[SB_PATH_MAX];

diff --git a/libsandbox/wrapper-funcs/__pre_check.c 
b/libsandbox/wrapper-funcs/__pre_check.c
deleted file mode 100644
index e7db0a2..0000000
--- a/libsandbox/wrapper-funcs/__pre_check.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * make sure some pre-checks are pulled in when needed
- *
- * Copyright 1999-2009 Gentoo Foundation
- * Licensed under the GPL-2
- */
-
-#if SB_NR_IS_DEFINED(SB_NR_MKDIR) && !SB_NR_IS_DEFINED(SB_NR_MKDIRAT)
-# include "mkdirat_pre_check.c"
-#endif
-
-#if SB_NR_IS_DEFINED(SB_NR_OPEN) && !SB_NR_IS_DEFINED(SB_NR_OPENAT)
-# include "openat_pre_check.c"
-#endif
-
-#if SB_NR_IS_DEFINED(SB_NR_OPEN64) && !SB_NR_IS_DEFINED(SB_NR_OPENAT64)
-# include "openat64_pre_check.c"
-#endif
-
-#if SB_NR_IS_DEFINED(SB_NR_UNLINK) && !SB_NR_IS_DEFINED(SB_NR_UNLINKAT)
-# include "unlinkat_pre_check.c"
-#endif
-
-#include "__pre_at_check.c"

diff --git a/libsandbox/wrapper-funcs/openat64_pre_check.c 
b/libsandbox/wrapper-funcs/openat64_pre_check.c
deleted file mode 100644
index 67dc0dc..0000000
--- a/libsandbox/wrapper-funcs/openat64_pre_check.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * open*64*() pre-check.
- *
- * Copyright 1999-2009 Gentoo Foundation
- * Licensed under the GPL-2
- */
-
-#include "__64_pre.h"
-#define sb_openat_pre_check sb_openat64_pre_check
-#include "openat_pre_check.c"
-#undef sb_openat_pre_check
-#include "__64_post.h"

diff --git a/scripts/gen_symbol_header.awk b/scripts/gen_symbol_header.awk
index e669c85..0180f6c 100644
--- a/scripts/gen_symbol_header.awk
+++ b/scripts/gen_symbol_header.awk
@@ -201,8 +201,6 @@ END {
                }
        }
 
-       printf("#include \"wrapper-funcs/__pre_check.c\"\n");
-
        printf("#define SB_MAX_STRING_LEN %i\n\n", SB_MAX_STRING_LEN);
 
        printf("#endif /* __symbols_h */\n");

Reply via email to