diff options
Diffstat (limited to 'security/lxqt-sudo/files/patch-sudo.cpp')
-rw-r--r-- | security/lxqt-sudo/files/patch-sudo.cpp | 86 |
1 files changed, 66 insertions, 20 deletions
diff --git a/security/lxqt-sudo/files/patch-sudo.cpp b/security/lxqt-sudo/files/patch-sudo.cpp index 791d5159c9d1..90b6b023d2ac 100644 --- a/security/lxqt-sudo/files/patch-sudo.cpp +++ b/security/lxqt-sudo/files/patch-sudo.cpp @@ -1,9 +1,9 @@ ---- sudo.cpp.orig 2018-05-21 19:10:17 UTC +--- sudo.cpp.orig 2019-01-25 23:40:04 UTC +++ sudo.cpp -@@ -36,7 +36,13 @@ - #include <QSocketNotifier> - #include <QDebug> +@@ -38,7 +38,13 @@ #include <QThread> + #include <QProcessEnvironment> + #include <QTimer> +#if defined(__linux__) #include <pty.h> +#elif defined(__FreeBSD__) @@ -14,7 +14,7 @@ #include <unistd.h> #include <memory> #include <csignal> -@@ -52,6 +58,9 @@ namespace +@@ -56,6 +62,9 @@ namespace const QString su_prog{QStringLiteral(LXQTSUDO_SU)}; const QString sudo_prog{QStringLiteral(LXQTSUDO_SUDO)}; @@ -24,37 +24,83 @@ const QString pwd_prompt_end{QStringLiteral(": ")}; const QChar nl{QLatin1Char('\n')}; -@@ -179,6 +188,10 @@ void Sudo::child() - if (BACK_SU == mBackend) - { - program = su_prog.toStdString(); -+#ifdef __FreeBSD__ -+ *(param_arg++) = "-m"; -+ *(param_arg++) = "root"; +@@ -240,27 +249,39 @@ QString Sudo::backendName (backend_t backEnd) + void Sudo::child() + { + int params_cnt = 3 //1. su/sudo & "shell command" & last nullptr ++#ifndef __FreeBSD__ + + (BACK_SU == mBackend ? 1 : 3); //-c for su | -E /bin/sh -c for sudo ++#else ++ + (BACK_SU == mBackend ? 3 : 3); +#endif - *(param_arg++) = "-c"; //run command + std::unique_ptr<char const *[]> params{new char const *[params_cnt]}; + const char ** param_arg = params.get() + 1; + + std::string program = backendName().toLocal8Bit().data(); ++ if (BACK_SU == mBackend) ++ { ++ *(param_arg++) = "-m"; ++ *(param_arg++) = "root"; ++ *(param_arg++) = "-c"; ++ } + if (BACK_SUDO == mBackend) + { ++ + *(param_arg++) = "-E"; //preserve environment + *(param_arg++) = "/bin/sh"; ++ *(param_arg++) = "-c"; //run command + } +- *(param_arg++) = "-c"; //run command + + params[0] = program.c_str(); +- + // Note: we force the su/sudo to communicate with us in the simplest + // locale and then set the locale back for the command +- char const * const env_lc_all = getenv("LC_ALL"); ++ + std::string command; ++#ifndef __FreeBSD__ ++ char const * const env_lc_all = getenv("LC_ALL"); + if (env_lc_all == nullptr) + { +- command = "unset LC_ALL; "; ++ command = "unset LC_ALL;"; } else { -@@ -200,7 +213,6 @@ void Sudo::child() + // Note: we need to check if someone is not trying to inject commands +@@ -276,6 +297,9 @@ void Sudo::child() + } + command += "exec "; + command += squashedArgs().toLocal8Bit().data(); ++#else ++ command = squashedArgs().toLocal8Bit().data(); ++#endif + *(param_arg++) = command.c_str(); + + *param_arg = nullptr; +@@ -283,12 +307,11 @@ void Sudo::child() + setenv("LC_ALL", "C", 1); + env_workarounds(); +- setsid(); //session leader execvp(params[0], const_cast<char **>(params.get())); - //exec never returns in case of success QTextStream{stderr, QIODevice::WriteOnly} << tr("%1: Failed to exec '%2': %3\n").arg(app_master).arg(params[0]).arg(strerror(errno)); ++ exit(1); -@@ -277,8 +289,13 @@ int Sudo::parent() - lxqtApp->quit(); + } + +@@ -354,7 +377,11 @@ int Sudo::parent() + } } else { -- if (line.endsWith(pwd_prompt_end)) +#ifdef __FreeBSD__ + if( line.endsWith(pwd_prompt_end_c_locale) || line.endsWith(pwd_prompt_end)) +#else -+ if(line.endsWith(pwd_prompt_end)) + if (line.endsWith(pwd_prompt_end)) +#endif { -+ //if now echo is turned off, su/sudo requests password struct termios tios; - //loop to be sure we don't miss the flag (we can afford such small delay in "normal" output processing) |