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>
This commit is contained in:

committed by
Junio C Hamano

parent
21aeafceda
commit
67ba123fd1
@ -59,6 +59,7 @@ char *git_terminal_prompt(const char *prompt, int echo)
|
|||||||
|
|
||||||
r = strbuf_getline(&buf, fh, '\n');
|
r = strbuf_getline(&buf, fh, '\n');
|
||||||
if (!echo) {
|
if (!echo) {
|
||||||
|
fseek(fh, SEEK_CUR, 0);
|
||||||
putc('\n', fh);
|
putc('\n', fh);
|
||||||
fflush(fh);
|
fflush(fh);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user