chgserver: restore pager fds attached within runcommand session
authorYuya Nishihara <yuya@tcha.org>
Wed, 19 Sep 2018 23:11:07 +0900
changeset 39739 7cdd47d9ccf8
parent 39738 a93fe297dfb3
child 39740 e0a7cfa9323f
chgserver: restore pager fds attached within runcommand session While rewriting chg in Rust, I noticed the server leaks the client's pager fd. This isn't a problem right now since the IPC process terminates earlier than the pager, but I believe the fds attached within a "runcommand" request should be released as soon as the session ends.
mercurial/chgserver.py
--- a/mercurial/chgserver.py	Wed Sep 19 22:57:47 2018 +0900
+++ b/mercurial/chgserver.py	Wed Sep 19 23:11:07 2018 +0900
@@ -456,7 +456,16 @@
         os.umask(mask)
 
     def runcommand(self):
-        return super(chgcmdserver, self).runcommand()
+        # pager may be attached within the runcommand session, which should
+        # be detached at the end of the session. otherwise the pager wouldn't
+        # receive EOF.
+        globaloldios = self._oldios
+        self._oldios = []
+        try:
+            return super(chgcmdserver, self).runcommand()
+        finally:
+            self._restoreio()
+            self._oldios = globaloldios
 
     def setenv(self):
         """Clear and update os.environ