[Python-checkins] r76000 - python/trunk/Lib/getpass.py
gregory.p.smith
python-checkins at python.org
Sat Oct 31 22:26:08 CET 2009
Author: gregory.p.smith
Date: Sat Oct 31 22:26:08 2009
New Revision: 76000
Log:
Fixes issue7208 - getpass would still allow the password to be echoed on
Solaris due to not flushing the input buffer.
This change also incorporates some additional getpass implementation
suggestions for security based on an analysis of getpass.c linked to from the
issue.
Modified:
python/trunk/Lib/getpass.py
Modified: python/trunk/Lib/getpass.py
==============================================================================
--- python/trunk/Lib/getpass.py (original)
+++ python/trunk/Lib/getpass.py Sat Oct 31 22:26:08 2009
@@ -62,12 +62,16 @@
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 @@
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
More information about the Python-checkins
mailing list