summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/getpass.py11
-rw-r--r--Misc/NEWS6
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
diff --git a/Misc/NEWS b/Misc/NEWS
index a8918db..caec215 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.