diff options
author | Jeff King <peff@peff.net> | 2012-08-07 00:10:26 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-08-06 22:11:47 -0700 |
commit | 67ba123fd1fcb9a7699ae85f05f1229513322c1c (patch) | |
tree | 3c70f17eac81f82183b0419e8343b144a62eb851 /compat/terminal.c | |
parent | 21aeafceda2382d26bfa73a98ba45a937d65d77a (diff) | |
download | git-67ba123fd1fcb9a7699ae85f05f1229513322c1c.tar.gz |
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 <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat/terminal.c')
-rw-r--r-- | compat/terminal.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/compat/terminal.c b/compat/terminal.c index 6d16c8fba0..bbb038dd01 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); } |