Hi Bruno and all,
keinflue <[email protected]> writes:
>> Instead, how about
>> a) if you just ignore the test failures — since you know you are
>> running them in a very special environment, or
>> b) we can mark these 3 tests as expected test failures if you
>> provide an identifier to mark them with, and a corresponding
>> condition, so that we can extend gnulib/modules/test-xfail.
>
> I am only a relatively new user of guix, so I can't speak for which
> approach would be preferable from their perspective. I CC'ed Ludovic
> since he implemented the unprivileged guix daemon approach.
I’m not sure how ‘modules/test-xfail’ is supposed to work, I don’t see
any use of its conditionals.
My inclination would be to do something as attached (untested):
diff --git a/tests/test-chown.h b/tests/test-chown.h
index 6af6b69755..182eaa4cd0 100644
--- a/tests/test-chown.h
+++ b/tests/test-chown.h
@@ -32,6 +32,21 @@
headers are already included. If PRINT, warn before skipping
symlink tests with status 77. */
+static gid_t
+overflow_gid (void)
+{
+#ifdef __linux__
+ char buf[64];
+ int fd = open ("/proc/sys/kernel/overflowgid", O_RDONLY);
+ if (fd == -1)
+ return -1;
+ full_read (fd, buf, sizeof buf);
+ return atoi (buf);
+#else
+ return -1;
+#endif
+}
+
static int
test_chown (int (*func) (char const *, uid_t, gid_t), bool print)
{
@@ -138,6 +153,12 @@ test_chown (int (*func) (char const *, uid_t, gid_t), bool print)
gids_count = mgetgroups (NULL, st1.st_gid, &gids);
if (1 < gids_count)
{
+#ifdef __linux__
+ if (gids[1] == overflow_gid ())
+ /* Cannot chown to the "overflow GID", so mark test as skipped. */
+ return 77;
+#endif
+
ASSERT (gids[1] != st1.st_gid);
if (getgid () != (gid_t) -1)
ASSERT (gids[1] != (gid_t) -1);
WDYT?
(I agree that it’s unfortunate that Linux user namespaces break POSIX
semantics in surprising way. More and more programs are running in such
environments though, for example for CI.)
Thanks,
Ludo’.