[Python-checkins] cpython (3.3): Issue #16962: Use getdents64 instead of the obsolete getdents syscall in

gregory.p.smith python-checkins at python.org
Sun Mar 3 19:53:34 CET 2013


http://hg.python.org/cpython/rev/30e643e36bae
changeset:   82460:30e643e36bae
branch:      3.3
parent:      82456:886df716cd09
user:        Gregory P. Smith <greg at krypto.org>
date:        Sun Mar 03 10:45:05 2013 -0800
summary:
  Issue #16962: Use getdents64 instead of the obsolete getdents syscall in
the subprocess module on Linux.

files:
  Misc/NEWS                  |   6 +++---
  Modules/_posixsubprocess.c |  22 ++++++++--------------
  2 files changed, 11 insertions(+), 17 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -191,6 +191,9 @@
 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 @@
 - 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
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -176,17 +176,11 @@
  * 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_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 &&

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list