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
|
@ -191,6 +191,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #16962: Use getdents64 instead of the obsolete getdents syscall
|
||||
in the subprocess module on Linux.
|
||||
|
||||
- Issue #17018: Make Process.join() retry if os.waitpid() fails with EINTR.
|
||||
|
||||
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
|
||||
|
@ -626,9 +629,6 @@ Library
|
|||
- Issue #15906: Fix a regression in `argparse` caused by the preceding change,
|
||||
when ``action='append'``, ``type='str'`` and ``default=[]``.
|
||||
|
||||
Extension Modules
|
||||
-----------------
|
||||
|
||||
- Issue #12268: The io module file object write methods no longer abort early
|
||||
when one of its write system calls is interrupted (EINTR).
|
||||
|
||||
|
|
|
@ -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…
Reference in New Issue