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.
--- 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