# HG changeset patch # User Jun Wu # Date 1489635792 25200 # Node ID 95be8b7181d36ee2da151117b9790b25ab5b24a2 # Parent bc445c556d3c1cac13f14577878f1f902b4cf740 osutil: fix potential wrong fd close According to POSIX closedir [1]: If a file descriptor is used to implement type DIR, that file descriptor shall be closed. According to POSIX fdopendir [2]: Upon calling closedir() the file descriptor shall be closed. So we should avoid "close(dfd)" after "closedir(dir)". With threads, there could be a race where an innocent fd gets closed. But Python GIL seems to help hiding the issue well. [1]: http://pubs.opengroup.org/onlinepubs/009695399/functions/closedir.html [2]: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopendir.html diff -r bc445c556d3c -r 95be8b7181d3 mercurial/osutil.c --- a/mercurial/osutil.c Thu Mar 09 12:09:31 2017 -0800 +++ b/mercurial/osutil.c Wed Mar 15 20:43:12 2017 -0700 @@ -400,6 +400,8 @@ Py_XDECREF(stat); error_list: closedir(dir); + /* closedir also closes its dirfd */ + goto error_value; error_dir: #ifdef AT_SYMLINK_NOFOLLOW close(dfd);