diff options
-rw-r--r-- | Lib/getpass.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 6 |
2 files changed, 14 insertions, 3 deletions
diff --git a/Lib/getpass.py b/Lib/getpass.py index 05e9b72..3ca7fb2 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -62,12 +62,16 @@ def unix_getpass(prompt='Password: ', stream=None): try: old = termios.tcgetattr(fd) # a copy to save new = old[:] - new[3] &= ~termios.ECHO # 3 == 'lflags' + new[3] &= ~(termios.ECHO|termios.ISIG) # 3 == 'lflags' + tcsetattr_flags = termios.TCSAFLUSH + if hasattr(termios, 'TCSASOFT'): + tcsetattr_flags |= termios.TCSASOFT try: - termios.tcsetattr(fd, termios.TCSADRAIN, new) + termios.tcsetattr(fd, tcsetattr_flags, new) passwd = _raw_input(prompt, stream, input=input) finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old) + termios.tcsetattr(fd, tcsetattr_flags, old) + stream.flush() # issue7208 except termios.error, e: if passwd is not None: # _raw_input succeeded. The final tcsetattr failed. Reraise @@ -125,6 +129,7 @@ def _raw_input(prompt="", stream=None, input=None): if prompt: stream.write(prompt) stream.flush() + # NOTE: The Python C API calls flockfile() (and unlock) during readline. line = input.readline() if not line: raise EOFError @@ -24,6 +24,12 @@ Core and Builtins Library ------- +- Issue #7246 & Issue #7208: getpass now properly flushes input before + reading from stdin so that existing input does not confuse it and + lead to incorrect entry or an IOError. It also properly flushes it + afterwards to avoid the terminal echoing the input afterwards on + OSes such as Solaris. + - Issue #7244: itertools.izip_longest() no longer ignores exceptions raised during the formation of an output tuple. |