From 50c215df4af77575ffde2d31980ff5bbe39c3d65 Mon Sep 17 00:00:00 2001 From: Las Date: Sun, 26 May 2019 17:19:06 +0200 Subject: [PATCH] Fix chrootenv segfaulting on exit glibc 2.27 (and possibly other versions) can't handle an `nopenfd` value larger than 2^19 in `ntfw`, which is problematic if you've set the maximum number of fds per process to a value higher than that. --- .../build-support/build-fhs-userenv/chrootenv/chrootenv.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c b/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c index 0e9e36bc301..34e050dde4f 100644 --- a/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c +++ b/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c @@ -19,6 +19,10 @@ #include #include +int min(int a, int b) { + return a > b ? b : a; +} + const gchar *bind_blacklist[] = {"bin", "etc", "host", "usr", "lib", "lib64", "lib32", "sbin", NULL}; void bind_mount(const gchar *source, const gchar *target) { @@ -126,7 +130,9 @@ int main(gint argc, gchar **argv) { int status; fail_if(waitpid(cpid, &status, 0) != cpid); - fail_if(nftw(prefix, nftw_remove, getdtablesize(), + // glibc 2.27 (and possibly other versions) can't handle + // an nopenfd value larger than 2^19 + fail_if(nftw(prefix, nftw_remove, min(getdtablesize(), 1<<19), FTW_DEPTH | FTW_MOUNT | FTW_PHYS)); if (WIFEXITED(status))