From 255bf5b9ec2d25698240cc1bf760887cd3c28436 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Sun, 3 Mar 2013 10:45:05 -0800 Subject: [PATCH] Issue #16962: Use getdents64 instead of the obsolete getdents syscall in the subprocess module on Linux. --- Misc/NEWS | 6 +++--- Modules/_posixsubprocess.c | 22 ++++++++-------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 983c1cccbb9..d569813b6a1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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). diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index b7b120ba510..07d709688c3 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -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 &&