here the details: libio: Ensure output buffer for wchars bug 28828 libio: libio Flush onlu _IO_str_overflow must not return EOF bug 28949 linux: Fix _closefrom_fallback iterates until max int bug 28993
59 lines
2.0 KiB
Diff
59 lines
2.0 KiB
Diff
From 053fe273434056f551ed8f81daf750db9dab5931 Mon Sep 17 00:00:00 2001
|
|
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
Date: Wed, 23 Mar 2022 17:40:01 -0300
|
|
Subject: [PATCH] linux: Fix __closefrom_fallback iterates until max int
|
|
(BZ#28993)
|
|
|
|
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,
|
|
ENFILE, or ENOMEM.
|
|
|
|
Checked on x86_64-linux-gnu.
|
|
---
|
|
sysdeps/unix/sysv/linux/closefrom_fallback.c | 11 ++++++-----
|
|
1 file changed, 6 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/closefrom_fallback.c b/sysdeps/unix/sysv/linux/closefrom_fallback.c
|
|
index 60101aa..a9dd0c4 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));
|
|
--
|
|
1.8.3.1
|
|
|