mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-02 01:36:13 +00:00
util: Fix UB in SetStdinEcho when ENOTTY
This commit is contained in:
parent
b65ff0e5a1
commit
fa692974ac
@ -14,12 +14,6 @@
|
||||
# Note that suppressions may depend on OS and/or library versions.
|
||||
# Tested on aarch64 and x86_64 with Ubuntu Noble system libs, using clang-16
|
||||
# and GCC, without gui.
|
||||
{
|
||||
Suppress uninitialized bytes warning in compat code
|
||||
Memcheck:Param
|
||||
ioctl(TCSET{S,SW,SF})
|
||||
fun:tcsetattr
|
||||
}
|
||||
{
|
||||
Suppress leaks on shutdown
|
||||
Memcheck:Leak
|
||||
|
||||
@ -18,25 +18,38 @@
|
||||
// https://stackoverflow.com/questions/1413445/reading-a-password-from-stdcin
|
||||
void SetStdinEcho(bool enable)
|
||||
{
|
||||
if (!StdinTerminal()) {
|
||||
return;
|
||||
}
|
||||
#ifdef WIN32
|
||||
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
|
||||
DWORD mode;
|
||||
GetConsoleMode(hStdin, &mode);
|
||||
if (!GetConsoleMode(hStdin, &mode)) {
|
||||
fputs("GetConsoleMode failed\n", stderr);
|
||||
return;
|
||||
}
|
||||
if (!enable) {
|
||||
mode &= ~ENABLE_ECHO_INPUT;
|
||||
} else {
|
||||
mode |= ENABLE_ECHO_INPUT;
|
||||
}
|
||||
SetConsoleMode(hStdin, mode);
|
||||
if (!SetConsoleMode(hStdin, mode)) {
|
||||
fputs("SetConsoleMode failed\n", stderr);
|
||||
}
|
||||
#else
|
||||
struct termios tty;
|
||||
tcgetattr(STDIN_FILENO, &tty);
|
||||
if (tcgetattr(STDIN_FILENO, &tty) != 0) {
|
||||
fputs("tcgetattr failed\n", stderr);
|
||||
return;
|
||||
}
|
||||
if (!enable) {
|
||||
tty.c_lflag &= ~ECHO;
|
||||
} else {
|
||||
tty.c_lflag |= ECHO;
|
||||
}
|
||||
(void)tcsetattr(STDIN_FILENO, TCSANOW, &tty);
|
||||
if (tcsetattr(STDIN_FILENO, TCSANOW, &tty) != 0) {
|
||||
fputs("tcsetattr failed\n", stderr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user