[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openvpn-devel
Subject:    Re: [Openvpn-devel] [PATCH] Fix management password prompt with redirected log
From:       WEi W- <wwei76922 () gmail ! com>
Date:       2021-06-21 16:58:02
Message-ID: CH2PR12MB3845305EE7FBD378C647BE85A40A9 () CH2PR12MB3845 ! namprd12 ! prod ! outlook ! com
[Download RAW message or body]

lev@openvpn.net

Get Outlook for Android<https://aka.ms/AAb9ysg>

________________________________
From: Lev Stipakov <lstipakov@gmail.com>
Sent: Friday, June 18, 2021 10:22:41 PM
To: openvpn-devel@lists.sourceforge.net <openvpn-devel@lists.sourceforge.net>
Cc: Lev Stipakov <lev@openvpn.net>
Subject: [Openvpn-devel] [PATCH] Fix management password prompt with redirected log

From: Lev Stipakov <lev@openvpn.net>

When management interface is password protected, openvpn
writes "Enter Management Password" to stderr. As it turns out,
when log is redirected to a file, that prompt is also written to that
file and not to the "original" stderr. Moreover, on recent Insider build
(21390.2025) openvpn exits with fatal error

  get_console_input_win32(): unexpected error: No such device or address (errno=6)

while attempting to write that prompt.

When redirecting stdout/stderr, we use _dup2() to associate stderr
descriptor with the log file. This call closes file associated
with stderr descriptor, which might explain why it has stopped
working (original stderr is closed and WriteFile() fails) and on
current versions it appears to work "by accident" - not failing
but use redirected stderr instead of original one.

I played a bit with DuplicateHandle() for STD_ERROR_HANDLE
but got the same behavior.

Fix fatal error on Insider build by always writing prompt
to the new stderr and removing concept of "orig_stderr".
For current Windows releases behavior doesn't change.

Signed-off-by: Lev Stipakov <lev@openvpn.net>
---
 src/openvpn/console_builtin.c |  2 +-
 src/openvpn/error.c           | 31 -------------------------------
 src/openvpn/error.h           |  6 ------
 3 files changed, 1 insertion(+), 38 deletions(-)

diff --git a/src/openvpn/console_builtin.c b/src/openvpn/console_builtin.c
index 9bf36347..31214536 100644
--- a/src/openvpn/console_builtin.c
+++ b/src/openvpn/console_builtin.c
@@ -73,7 +73,7 @@ get_console_input_win32(const char *prompt, const bool echo, char *input, const
     input[0] = '\0';

     in = GetStdHandle(STD_INPUT_HANDLE);
-    err = get_orig_stderr();
+    err = GetStdHandle(STD_ERROR_HANDLE);

     if (in == INVALID_HANDLE_VALUE
         || err == INVALID_HANDLE_VALUE
diff --git a/src/openvpn/error.c b/src/openvpn/error.c
index b94d387c..e807435c 100644
--- a/src/openvpn/error.c
+++ b/src/openvpn/error.c
@@ -490,25 +490,6 @@ close_syslog(void)
 #endif
 }

-#ifdef _WIN32
-
-static HANDLE orig_stderr;
-
-HANDLE
-get_orig_stderr(void)
-{
-    if (orig_stderr)
-    {
-        return orig_stderr;
-    }
-    else
-    {
-        return GetStdHandle(STD_ERROR_HANDLE);
-    }
-}
-
-#endif
-
 void
 redirect_stdout_stderr(const char *file, bool append)
 {
@@ -549,18 +530,6 @@ redirect_stdout_stderr(const char *file, bool append)
             }
         }

-        /* save original stderr for password prompts */
-        orig_stderr = GetStdHandle(STD_ERROR_HANDLE);
-
-#if 0 /* seems not be necessary with stdout/stderr redirection below*/
-        /* set up for redirection */
-        if (!SetStdHandle(STD_OUTPUT_HANDLE, log_handle)
-            || !SetStdHandle(STD_ERROR_HANDLE, log_handle))
-        {
-            msg(M_ERR, "Error: cannot redirect stdout/stderr to --log file: %s", file);
-        }
-#endif
-
         /* direct stdout/stderr to point to log_handle */
         log_fd = _open_osfhandle((intptr_t)log_handle, _O_TEXT);
         if (log_fd == -1)
diff --git a/src/openvpn/error.h b/src/openvpn/error.h
index f4528ef2..b91e54fb 100644
--- a/src/openvpn/error.h
+++ b/src/openvpn/error.h
@@ -255,12 +255,6 @@ void close_syslog(void);
 /* log file output */
 void redirect_stdout_stderr(const char *file, bool append);

-#ifdef _WIN32
-/* get original stderr handle, even if redirected by --log/--log-append */
-HANDLE get_orig_stderr(void);
-
-#endif
-
 /* exit program */
 void openvpn_exit(const int status);

--
2.23.0.windows.1



_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

[Attachment #3 (text/html)]

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: \
sans-serif; font-size: 11pt; color: black; "> lev@openvpn.net<span \
id="ms-outlook-android-cursor"></span><br> <br>
</div>
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: \
sans-serif; font-size: 11pt; color: black; "> <span id="OutlookSignature">
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: \
sans-serif; font-size: 11pt; color: black; "> Get <a \
href="https://aka.ms/AAb9ysg">Outlook for Android</a></div> </span><br>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" \
style="font-size:11pt" color="#000000"><b>From:</b> Lev Stipakov \
&lt;lstipakov@gmail.com&gt;<br> <b>Sent:</b> Friday, June 18, 2021 10:22:41 PM<br>
<b>To:</b> openvpn-devel@lists.sourceforge.net \
&lt;openvpn-devel@lists.sourceforge.net&gt;<br> <b>Cc:</b> Lev Stipakov \
&lt;lev@openvpn.net&gt;<br> <b>Subject:</b> [Openvpn-devel] [PATCH] Fix management \
password prompt with redirected log</font> <div>&nbsp;</div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">From: Lev Stipakov &lt;lev@openvpn.net&gt;<br>
<br>
When management interface is password protected, openvpn<br>
writes &quot;Enter Management Password&quot; to stderr. As it turns out,<br>
when log is redirected to a file, that prompt is also written to that<br>
file and not to the &quot;original&quot; stderr. Moreover, on recent Insider \
build<br> (21390.2025) openvpn exits with fatal error<br>
<br>
&nbsp; get_console_input_win32(): unexpected error: No such device or address \
(errno=6)<br> <br>
while attempting to write that prompt.<br>
<br>
When redirecting stdout/stderr, we use _dup2() to associate stderr<br>
descriptor with the log file. This call closes file associated<br>
with stderr descriptor, which might explain why it has stopped<br>
working (original stderr is closed and WriteFile() fails) and on<br>
current versions it appears to work &quot;by accident&quot; - not failing<br>
but use redirected stderr instead of original one.<br>
<br>
I played a bit with DuplicateHandle() for STD_ERROR_HANDLE<br>
but got the same behavior.<br>
<br>
Fix fatal error on Insider build by always writing prompt<br>
to the new stderr and removing concept of &quot;orig_stderr&quot;.<br>
For current Windows releases behavior doesn't change.<br>
<br>
Signed-off-by: Lev Stipakov &lt;lev@openvpn.net&gt;<br>
---<br>
&nbsp;src/openvpn/console_builtin.c |&nbsp; 2 +-<br>
&nbsp;src/openvpn/error.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
| 31 -------------------------------<br> \
&nbsp;src/openvpn/error.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
|&nbsp; 6 ------<br> &nbsp;3 files changed, 1 insertion(+), 38 deletions(-)<br>
<br>
diff --git a/src/openvpn/console_builtin.c b/src/openvpn/console_builtin.c<br>
index 9bf36347..31214536 100644<br>
--- a/src/openvpn/console_builtin.c<br>
+++ b/src/openvpn/console_builtin.c<br>
@@ -73,7 +73,7 @@ get_console_input_win32(const char *prompt, const bool echo, char \
*input, const<br> &nbsp;&nbsp;&nbsp;&nbsp; input[0] = '\0';<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; in = GetStdHandle(STD_INPUT_HANDLE);<br>
-&nbsp;&nbsp;&nbsp; err = get_orig_stderr();<br>
+&nbsp;&nbsp;&nbsp; err = GetStdHandle(STD_ERROR_HANDLE);<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (in == INVALID_HANDLE_VALUE<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || err == INVALID_HANDLE_VALUE<br>
diff --git a/src/openvpn/error.c b/src/openvpn/error.c<br>
index b94d387c..e807435c 100644<br>
--- a/src/openvpn/error.c<br>
+++ b/src/openvpn/error.c<br>
@@ -490,25 +490,6 @@ close_syslog(void)<br>
&nbsp;#endif<br>
&nbsp;}<br>
&nbsp;<br>
-#ifdef _WIN32<br>
-<br>
-static HANDLE orig_stderr;<br>
-<br>
-HANDLE<br>
-get_orig_stderr(void)<br>
-{<br>
-&nbsp;&nbsp;&nbsp; if (orig_stderr)<br>
-&nbsp;&nbsp;&nbsp; {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return orig_stderr;<br>
-&nbsp;&nbsp;&nbsp; }<br>
-&nbsp;&nbsp;&nbsp; else<br>
-&nbsp;&nbsp;&nbsp; {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return \
                GetStdHandle(STD_ERROR_HANDLE);<br>
-&nbsp;&nbsp;&nbsp; }<br>
-}<br>
-<br>
-#endif<br>
-<br>
&nbsp;void<br>
&nbsp;redirect_stdout_stderr(const char *file, bool append)<br>
&nbsp;{<br>
@@ -549,18 +530,6 @@ redirect_stdout_stderr(const char *file, bool append)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* save original stderr for password \
                prompts */<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orig_stderr = \
                GetStdHandle(STD_ERROR_HANDLE);<br>
-<br>
-#if 0 /* seems not be necessary with stdout/stderr redirection below*/<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* set up for redirection */<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!SetStdHandle(STD_OUTPUT_HANDLE, \
                log_handle)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || \
                !SetStdHandle(STD_ERROR_HANDLE, log_handle))<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg(M_ERR, \
                &quot;Error: cannot redirect stdout/stderr to --log file: %s&quot;, \
                file);<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
-#endif<br>
-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* direct stdout/stderr to point to \
log_handle */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_fd = \
_open_osfhandle((intptr_t)log_handle, _O_TEXT);<br> \
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (log_fd == \
                -1)<br>
diff --git a/src/openvpn/error.h b/src/openvpn/error.h<br>
index f4528ef2..b91e54fb 100644<br>
--- a/src/openvpn/error.h<br>
+++ b/src/openvpn/error.h<br>
@@ -255,12 +255,6 @@ void close_syslog(void);<br>
&nbsp;/* log file output */<br>
&nbsp;void redirect_stdout_stderr(const char *file, bool append);<br>
&nbsp;<br>
-#ifdef _WIN32<br>
-/* get original stderr handle, even if redirected by --log/--log-append */<br>
-HANDLE get_orig_stderr(void);<br>
-<br>
-#endif<br>
-<br>
&nbsp;/* exit program */<br>
&nbsp;void openvpn_exit(const int status);<br>
&nbsp;<br>
-- <br>
2.23.0.windows.1<br>
<br>
<br>
<br>
_______________________________________________<br>
Openvpn-devel mailing list<br>
Openvpn-devel@lists.sourceforge.net<br>
<a href="https://lists.sourceforge.net/lists/listinfo/openvpn-devel">https://lists.sourceforge.net/lists/listinfo/openvpn-devel</a><br>
 </div>
</span></font></div>
</body>
</html>


[Attachment #4 (--===============8455308379095868313==)]


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic