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
--- 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);