osutil: fix potential wrong fd close
authorJun Wu <quark@fb.com>
Wed, 15 Mar 2017 20:43:12 -0700
changeset 31471 95be8b7181d3
parent 31470 bc445c556d3c
child 31472 75e4bae56068
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
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);