unrar: fix getpass()

1. Use TCSANOW instead of TSAFLUSH to prevent failure on Android 8.
2. Return empty password if failed to read from console, fixes segfault.
This commit is contained in:
Leonid Pliushch 2018-07-03 14:09:45 +03:00 committed by Fredrik Fornwall
parent 4849877625
commit 20e5d8252f
2 changed files with 15 additions and 8 deletions

View File

@ -1,6 +1,7 @@
TERMUX_PKG_HOMEPAGE=https://www.rarlab.com/ TERMUX_PKG_HOMEPAGE=https://www.rarlab.com/
TERMUX_PKG_DESCRIPTION="Tool for extracting files from .rar archives" TERMUX_PKG_DESCRIPTION="Tool for extracting files from .rar archives"
TERMUX_PKG_VERSION=5.6.5 TERMUX_PKG_VERSION=5.6.5
TERMUX_PKG_REVISION=1
TERMUX_PKG_SHA256=eba36a421bf41491818dee9507d934064622bc0bd9db6bbb8422a4706f200898 TERMUX_PKG_SHA256=eba36a421bf41491818dee9507d934064622bc0bd9db6bbb8422a4706f200898
TERMUX_PKG_SRCURL=https://www.rarlab.com/rar/unrarsrc-${TERMUX_PKG_VERSION}.tar.gz TERMUX_PKG_SRCURL=https://www.rarlab.com/rar/unrarsrc-${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_DEPENDS="libandroid-support,readline" TERMUX_PKG_DEPENDS="libandroid-support,readline"

View File

@ -1,6 +1,6 @@
diff -uNr unrar.mod/consio.cpp unrar.mod2/consio.cpp diff -uNr unrar/consio.cpp unrar.mod/consio.cpp
--- unrar.mod/consio.cpp 2017-08-11 16:56:22.000000000 +0300 --- unrar/consio.cpp 2018-06-24 18:10:30.000000000 +0300
+++ unrar.mod2/consio.cpp 2017-09-14 20:34:17.247733000 +0300 +++ unrar.mod/consio.cpp 2018-07-03 14:07:07.362069977 +0300
@@ -1,6 +1,10 @@ @@ -1,6 +1,10 @@
#include "rar.hpp" #include "rar.hpp"
#include "log.cpp" #include "log.cpp"
@ -12,32 +12,38 @@ diff -uNr unrar.mod/consio.cpp unrar.mod2/consio.cpp
static MESSAGE_TYPE MsgStream=MSG_STDOUT; static MESSAGE_TYPE MsgStream=MSG_STDOUT;
static RAR_CHARSET RedirectCharset=RCH_DEFAULT; static RAR_CHARSET RedirectCharset=RCH_DEFAULT;
@@ -57,6 +61,32 @@ @@ -62,6 +66,38 @@
#ifndef SILENT #ifndef SILENT
+#ifdef __ANDROID__ +#ifdef __ANDROID__
+static char* getpass(const char *prompt) { +static char* getpass(const char *prompt) {
+ struct termios term_old, term_new; + struct termios term_old, term_new;
+ int nread;
+ +
+ /* Turn echoing off and fail if we can't. */ + /* Turn echoing off and fail if we can't. */
+ if (tcgetattr (0, &term_old) != 0) { + if (tcgetattr(0, &term_old) != 0) {
+ fprintf(stderr, "%s(): tcgetattr failed.\n", __func__);
+ return NULL; + return NULL;
+ } + }
+ +
+ term_new = term_old; + term_new = term_old;
+ term_new.c_lflag &= ~ECHO; + term_new.c_lflag &= ~ECHO;
+ +
+ if (tcsetattr (0, TCSAFLUSH, &term_new) != 0) { + if (tcsetattr(0, TCSANOW, &term_new) != 0) {
+ fprintf(stderr, "%s(): tcsetattr failed.\n", __func__);
+ return NULL; + return NULL;
+ } + }
+ +
+ /* Read the password. */ + /* Read the password. */
+ char *password = readline(prompt); + char *password = readline(prompt);
+ +
+ /* prevent segfault when failed to read password */
+ if (!password) {
+ password="";
+ }
+
+ /* Restore terminal. */ + /* Restore terminal. */
+ (void) tcsetattr (0, TCSAFLUSH, &term_old); + (void) tcsetattr(0, TCSANOW, &term_old);
+ +
+ return password; + return password;
+} +}