summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2012-08-07 04:10:26 (GMT)
committerJunio C Hamano <gitster@pobox.com>2012-08-07 05:11:47 (GMT)
commit67ba123fd1fcb9a7699ae85f05f1229513322c1c (patch)
tree3c70f17eac81f82183b0419e8343b144a62eb851
parent21aeafceda2382d26bfa73a98ba45a937d65d77a (diff)
downloadgit-67ba123fd1fcb9a7699ae85f05f1229513322c1c.zip
git-67ba123fd1fcb9a7699ae85f05f1229513322c1c.tar.gz
git-67ba123fd1fcb9a7699ae85f05f1229513322c1c.tar.bz2
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>
-rw-r--r--compat/terminal.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/compat/terminal.c b/compat/terminal.c
index 6d16c8f..bbb038d 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);
}