summaryrefslogtreecommitdiff
path: root/Modules/_posixsubprocess.c
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2013-03-03 10:45:05 -0800
committerGregory P. Smith <greg@krypto.org>2013-03-03 10:45:05 -0800
commit255bf5b9ec2d25698240cc1bf760887cd3c28436 (patch)
treeb5a631d3db639885fafef297f435a36e206364e5 /Modules/_posixsubprocess.c
parentbce9a5d5cd783e116fe404c438cb08fc391be111 (diff)
downloadcpython-git-255bf5b9ec2d25698240cc1bf760887cd3c28436.tar.gz
Issue #16962: Use getdents64 instead of the obsolete getdents syscall in
the subprocess module on Linux.
Diffstat (limited to 'Modules/_posixsubprocess.c')
-rw-r--r--Modules/_posixsubprocess.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index b7b120ba51..07d709688c 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 &&