mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #16962: Use getdents64 instead of the obsolete getdents syscall in
the subprocess module on Linux.
This commit is contained in:
parent
bce9a5d5cd
commit
255bf5b9ec
2 changed files with 11 additions and 17 deletions
|
@ -176,17 +176,11 @@ _close_fds_by_brute_force(int start_fd, int end_fd, PyObject *py_fds_to_keep)
|
|||
* This structure is very old and stable: It will not change unless the kernel
|
||||
* chooses to break compatibility with all existing binaries. Highly Unlikely.
|
||||
*/
|
||||
struct linux_dirent {
|
||||
#if defined(__x86_64__) && defined(__ILP32__)
|
||||
/* Support the wacky x32 ABI (fake 32-bit userspace speaking to x86_64
|
||||
* kernel interfaces) - https://sites.google.com/site/x32abi/ */
|
||||
struct linux_dirent64 {
|
||||
unsigned long long d_ino;
|
||||
unsigned long long d_off;
|
||||
#else
|
||||
unsigned long d_ino; /* Inode number */
|
||||
unsigned long d_off; /* Offset to next linux_dirent */
|
||||
#endif
|
||||
long long d_off;
|
||||
unsigned short d_reclen; /* Length of this linux_dirent */
|
||||
unsigned char d_type;
|
||||
char d_name[256]; /* Filename (null-terminated) */
|
||||
};
|
||||
|
||||
|
@ -228,16 +222,16 @@ _close_open_fd_range_safe(int start_fd, int end_fd, PyObject* py_fds_to_keep)
|
|||
_close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
|
||||
return;
|
||||
} else {
|
||||
char buffer[sizeof(struct linux_dirent)];
|
||||
char buffer[sizeof(struct linux_dirent64)];
|
||||
int bytes;
|
||||
while ((bytes = syscall(SYS_getdents, fd_dir_fd,
|
||||
(struct linux_dirent *)buffer,
|
||||
while ((bytes = syscall(SYS_getdents64, fd_dir_fd,
|
||||
(struct linux_dirent64 *)buffer,
|
||||
sizeof(buffer))) > 0) {
|
||||
struct linux_dirent *entry;
|
||||
struct linux_dirent64 *entry;
|
||||
int offset;
|
||||
for (offset = 0; offset < bytes; offset += entry->d_reclen) {
|
||||
int fd;
|
||||
entry = (struct linux_dirent *)(buffer + offset);
|
||||
entry = (struct linux_dirent64 *)(buffer + offset);
|
||||
if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
|
||||
continue; /* Not a number. */
|
||||
if (fd != fd_dir_fd && fd >= start_fd && fd < end_fd &&
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue