-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[sanitizer] Fix running sanitizer_bad_report_path_test on Linux as root #97732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
iii-i
commented
Jul 4, 2024
•
edited
Loading
edited
@llvm/pr-subscribers-compiler-rt-sanitizer Author: Ilya Leoshkevich (iii-i) ChangesRunning tests as root is not the greatest idea, however, there is one valid use case - running them in a container in order to verify LLVM on different distros. There is no reason to configure unprivileged users in a container, so one works as root. sanitizer_bad_report_path_test assumes that creating a file in a non-writable directory would fail, which is not the case if CAP_DAC_OVERRIDE, which root has, is in effect. So drop it. Full diff: https://github.com/llvm/llvm-project/pull/97732.diff 1 Files Affected:
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_bad_report_path_test.cpp b/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_bad_report_path_test.cpp
index fd4abf448b09d..a7312341b6f5c 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_bad_report_path_test.cpp
+++ b/compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_bad_report_path_test.cpp
@@ -13,9 +13,32 @@
#include <stdio.h>
#include <string.h>
+#if defined(__linux__)
+#include <linux/capability.h>
+
+/* Use capget() and capset() from glibc. */
+extern "C" int capget(cap_user_header_t header, cap_user_data_t data);
+extern "C" int capset(cap_user_header_t header, const cap_user_data_t data);
+
+static void try_drop_cap_dac_override(void) {
+ struct __user_cap_header_struct hdr = {
+ .version = _LINUX_CAPABILITY_VERSION_1,
+ .pid = 0,
+ };
+ struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_1];
+ if (!capget(&hdr, data)) {
+ data[CAP_DAC_OVERRIDE >> 5].effective &= ~(1 << (CAP_DAC_OVERRIDE & 31));
+ capset(&hdr, data);
+ }
+}
+#else
+static void try_drop_cap_dac_override(void) {}
+#endif
+
volatile int *null = 0;
int main(int argc, char **argv) {
+ try_drop_cap_dac_override();
char buff[1000];
sprintf(buff, "%s.report_path/report", argv[0]);
__sanitizer_set_report_path(buff);
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
ad37d3b
to
75895bd
Compare
compiler-rt/test/sanitizer_common/TestCases/Posix/sanitizer_bad_report_path_test.cpp
Outdated
Show resolved
Hide resolved
75895bd
to
a52001c
Compare
Running tests as root is not the greatest idea, however, there is one valid use case - running them in a container in order to verify LLVM on different distros. There is no reason to configure unprivileged users in a container, so one works as root. sanitizer_bad_report_path_test assumes that creating a file in a non-writable directory would fail, which is not the always case. For example, when we are on Linux and CAP_DAC_OVERRIDE, which root has, is in effect. Therefore, one solution is to drop it. However, that would be Linux-specific. Instead, use argv[0] as if it were a directory. mkdir() on top of a file should be prohibited by all supported Posix operating systems. Combine this with a partial revert of commit f4214e1 ("[sanitizer] Skip test on Android where chmod is not working"), since we shouldn't need to exclude Android anymore.
a52001c
to
0cd70b7
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice
Unfortunately this is now causing a buildbot failure on Android:
The problem is that I'm not sure how to investigate that |
I've posted #99469. |
…ot (#97732) Summary: Running tests as root is not the greatest idea, however, there is one valid use case - running them in a container in order to verify LLVM on different distros. There is no reason to configure unprivileged users in a container, so one works as root. sanitizer_bad_report_path_test assumes that creating a file in a non-writable directory would fail, which is not the always case. For example, when we are on Linux and CAP_DAC_OVERRIDE, which root has, is in effect. Therefore, one solution is to drop it. However, that would be Linux-specific. Instead, use argv[0] as if it were a directory. mkdir() on top of a file should be prohibited by all supported Posix operating systems. Combine this with a partial revert of commit f4214e1 ("[sanitizer] Skip test on Android where chmod is not working"), since we shouldn't need to exclude Android anymore. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251653