From: Jeff King Date: Tue, 7 Aug 2012 04:10:26 +0000 (-0400) Subject: terminal: seek when switching between reading and writing X-Git-Tag: v1.7.12-rc3~5^2~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=67ba123fd1fcb9a7699ae85f05f1229513322c1c;p=git.git terminal: seek when switching between reading and writing When a stdio stream is opened in update mode (e.g., "w+"), the C standard forbids switching between reading or writing without an intervening positioning function. Many implementations are lenient about this, but Solaris libc will flush the recently-read contents to the output buffer. In this instance, that meant writing the non-echoed password that the user just typed to the terminal. Fix it by inserting a no-op fseek between the read and write. The opposite direction (writing followed by reading) is also disallowed, but our intervening fflush is an acceptable positioning function for that alternative. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- diff --git a/compat/terminal.c b/compat/terminal.c index 6d16c8fba..bbb038dd0 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -59,6 +59,7 @@ char *git_terminal_prompt(const char *prompt, int echo) r = strbuf_getline(&buf, fh, '\n'); if (!echo) { + fseek(fh, SEEK_CUR, 0); putc('\n', fh); fflush(fh); }