mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +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
|
|
@ -191,6 +191,9 @@ Core and Builtins
|
||||||
Library
|
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 #17018: Make Process.join() retry if os.waitpid() fails with EINTR.
|
||||||
|
|
||||||
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
|
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
|
||||||
|
|
@ -626,9 +629,6 @@ Library
|
||||||
- Issue #15906: Fix a regression in `argparse` caused by the preceding change,
|
- Issue #15906: Fix a regression in `argparse` caused by the preceding change,
|
||||||
when ``action='append'``, ``type='str'`` and ``default=[]``.
|
when ``action='append'``, ``type='str'`` and ``default=[]``.
|
||||||
|
|
||||||
Extension Modules
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
- Issue #12268: The io module file object write methods no longer abort early
|
- Issue #12268: The io module file object write methods no longer abort early
|
||||||
when one of its write system calls is interrupted (EINTR).
|
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
|
* This structure is very old and stable: It will not change unless the kernel
|
||||||
* chooses to break compatibility with all existing binaries. Highly Unlikely.
|
* chooses to break compatibility with all existing binaries. Highly Unlikely.
|
||||||
*/
|
*/
|
||||||
struct linux_dirent {
|
struct linux_dirent64 {
|
||||||
#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/ */
|
|
||||||
unsigned long long d_ino;
|
unsigned long long d_ino;
|
||||||
unsigned long long d_off;
|
long long d_off;
|
||||||
#else
|
|
||||||
unsigned long d_ino; /* Inode number */
|
|
||||||
unsigned long d_off; /* Offset to next linux_dirent */
|
|
||||||
#endif
|
|
||||||
unsigned short d_reclen; /* Length of this linux_dirent */
|
unsigned short d_reclen; /* Length of this linux_dirent */
|
||||||
|
unsigned char d_type;
|
||||||
char d_name[256]; /* Filename (null-terminated) */
|
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);
|
_close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
char buffer[sizeof(struct linux_dirent)];
|
char buffer[sizeof(struct linux_dirent64)];
|
||||||
int bytes;
|
int bytes;
|
||||||
while ((bytes = syscall(SYS_getdents, fd_dir_fd,
|
while ((bytes = syscall(SYS_getdents64, fd_dir_fd,
|
||||||
(struct linux_dirent *)buffer,
|
(struct linux_dirent64 *)buffer,
|
||||||
sizeof(buffer))) > 0) {
|
sizeof(buffer))) > 0) {
|
||||||
struct linux_dirent *entry;
|
struct linux_dirent64 *entry;
|
||||||
int offset;
|
int offset;
|
||||||
for (offset = 0; offset < bytes; offset += entry->d_reclen) {
|
for (offset = 0; offset < bytes; offset += entry->d_reclen) {
|
||||||
int fd;
|
int fd;
|
||||||
entry = (struct linux_dirent *)(buffer + offset);
|
entry = (struct linux_dirent64 *)(buffer + offset);
|
||||||
if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
|
if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
|
||||||
continue; /* Not a number. */
|
continue; /* Not a number. */
|
||||||
if (fd != fd_dir_fd && fd >= start_fd && fd < end_fd &&
|
if (fd != fd_dir_fd && fd >= start_fd && fd < end_fd &&
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue