changeset 31471:95be8b7181d3

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
author Jun Wu <quark@fb.com>
date Wed, 15 Mar 2017 20:43:12 -0700
parents bc445c556d3c
children 75e4bae56068
files mercurial/osutil.c
diffstat 1 files changed, 2 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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);