Message ID | 20220404210131.702898-1-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v3] linux: Fix __closefrom_fallback iterates until max int (BZ#28993) | expand |
* Adhemerval Zanella via Libc-alpha: > The __closefrom_fallback tries to get a available file descriptor > if the initial open ("/proc/self/fd/", ...) fails. It assumes the > failure would be only if procfs is not mount (ENOENT), however if > the the proc file is not accessible (due some other kernel filtering > such apparmor) it will iterate over a potentially large file set > issuing close calls. > > It should only try the close fallback if open returns EMFILE. The last line no longer matches the patch. Rest looks okay. Thanks, Florian
On 05/04/2022 04:09, Florian Weimer wrote: > * Adhemerval Zanella via Libc-alpha: > >> The __closefrom_fallback tries to get a available file descriptor >> if the initial open ("/proc/self/fd/", ...) fails. It assumes the >> failure would be only if procfs is not mount (ENOENT), however if >> the the proc file is not accessible (due some other kernel filtering >> such apparmor) it will iterate over a potentially large file set >> issuing close calls. >> >> It should only try the close fallback if open returns EMFILE. > > The last line no longer matches the patch. Ack, I will update it. > > Rest looks okay. Thanks.
diff --git a/sysdeps/unix/sysv/linux/closefrom_fallback.c b/sysdeps/unix/sysv/linux/closefrom_fallback.c index 60101aa3ba..a9dd0c46b2 100644 --- a/sysdeps/unix/sysv/linux/closefrom_fallback.c +++ b/sysdeps/unix/sysv/linux/closefrom_fallback.c @@ -30,16 +30,16 @@ _Bool __closefrom_fallback (int from, _Bool dirfd_fallback) { - bool ret = false; - int dirfd = __open_nocancel (FD_TO_FILENAME_PREFIX, O_RDONLY | O_DIRECTORY, 0); if (dirfd == -1) { - /* The closefrom should work even when process can't open new files. */ - if (errno == ENOENT || !dirfd_fallback) - goto err; + /* Return if procfs can not be opened for some reason. */ + if ((errno != EMFILE && errno != ENFILE && errno != ENOMEM) + || !dirfd_fallback) + return false; + /* The closefrom should work even when process can't open new files. */ for (int i = from; i < INT_MAX; i++) { int r = __close_nocancel (i); @@ -54,6 +54,7 @@ __closefrom_fallback (int from, _Bool dirfd_fallback) } char buffer[1024]; + bool ret = false; while (true) { ssize_t ret = __getdents64 (dirfd, buffer, sizeof (buffer));