From b0b46903c0fa2cb8069d6b2b1bf62bb9f90c8316 Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Sat, 24 Sep 2011 15:20:30 -0400 Subject: [PATCH] Add test to check that passphrase_read turns on ECHONL --- cunit/test_utils.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/cunit/test_utils.c b/cunit/test_utils.c index d93b2b8..d03dcf7 100644 --- a/cunit/test_utils.c +++ b/cunit/test_utils.c @@ -438,10 +438,83 @@ void passphrase_read_resets_terminal_after_read() return; } +void passphrase_read_turns_on_newline_echo_during_read() +{ + static const int read_nbyte = 11; + int masterfd, slavefd; + char* slavedevice; + char read_buf[read_nbyte]; + fd_set fd_set_write; + struct termios term_flags; + + masterfd = posix_openpt(O_RDWR|O_NOCTTY); + + if (masterfd == -1 + || grantpt (masterfd) == -1 + || unlockpt (masterfd) == -1 + || (slavedevice = ptsname (masterfd)) == NULL) + CU_FAIL_FATAL("Could not create pty"); + + slavefd = open(slavedevice, O_RDWR|O_NOCTTY); + if (slavefd == -1) + CU_FAIL_FATAL("Could not open slave end of pty"); + + if (tcgetattr(slavefd, &term_flags) != 0) + CU_FAIL_FATAL("Could not get slave pty attributes"); + if (term_flags.c_lflag & ECHONL) + { + term_flags.c_lflag &= ~ECHONL; + if (tcsetattr(slavefd, TCSANOW, &term_flags) != 0) + CU_FAIL_FATAL("Could not turn ECHO on on slave pty"); + } + + switch (fork()) + { + case -1: + CU_FAIL_FATAL("Could not fork"); + case 0: + { + static const int password_size = 512; + int child_slavefd; + char buffer[password_size]; + if (setsid() == (pid_t) -1) + CU_FAIL_FATAL("Could not create new session"); + + if ((child_slavefd = open(slavedevice, O_RDWR)) == 0) + CU_FAIL_FATAL("Could not open slave end of pty"); + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + close(masterfd); + close(slavefd); + freerdp_passphrase_read("Password: ", buffer, password_size); + close(child_slavefd); + exit(EXIT_SUCCESS); + } + } + + read_buf[read_nbyte - 1] = '\0'; + + FD_ZERO(&fd_set_write); + FD_SET(masterfd, &fd_set_write); + if (select(masterfd + 1, NULL, &fd_set_write, NULL, NULL) == -1) + CU_FAIL_FATAL("Master end of pty not writeable"); + if (read(masterfd, read_buf, read_nbyte) == (ssize_t) -1) + CU_FAIL_FATAL("Nothing written to slave end of pty"); + + if (tcgetattr(slavefd, &term_flags) != 0) + CU_FAIL_FATAL("Could not get slave pty attributes"); + CU_ASSERT(term_flags.c_lflag & ECHONL) + write(masterfd, "\n", (size_t) 2); + close(masterfd); + close(slavefd); + return; +} void test_passphrase_read(void) { passphrase_read_prompts_to_tty(); passphrase_read_reads_from_tty(); passphrase_read_turns_off_echo_during_read(); passphrase_read_resets_terminal_after_read(); + passphrase_read_turns_on_newline_echo_during_read(); } -- 2.7.4