aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorArne Schwabe2024-01-08 18:13:49 +0100
committerGert Doering2024-01-08 22:15:59 +0100
commitf0a17ed8513405af0efb1df2ab2bda3956e01910 (patch)
treec35cf285225ec11262610d2884e7dd7ab66b56d4 /src
parent7268e14dba61254b04a0b2db37c12c8ab58423ea (diff)
downloadopenvpn-f0a17ed8513405af0efb1df2ab2bda3956e01910.zip
openvpn-f0a17ed8513405af0efb1df2ab2bda3956e01910.tar.gz
Move get_tmp_dir to win32-util.c and error out on failure
Currently we only warn in get_tmp_dir fails and set o->tmp_dir to a null pointer. This will not be caught by check_file_access_chroot either since that ignores NULL pointers but other parts of OpenVPN will assume that tmp_dir is set to a non-NULL string. Also move get_tmp_dir to win32-util.c to use it in unit tests. Change-Id: I525ccf7872880367b248ebebb0ddc83551498042 Signed-off-by: Arne Schwabe <arne@rfc2549.org> Acked-by: Frank Lichtenheld <frank@lichtenheld.com> Message-Id: <20240108171349.15871-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg27964.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
Diffstat (limited to 'src')
-rw-r--r--src/openvpn/options.c10
-rw-r--r--src/openvpn/win32-util.c22
-rw-r--r--src/openvpn/win32-util.h3
-rw-r--r--src/openvpn/win32.c28
-rw-r--r--src/openvpn/win32.h3
5 files changed, 34 insertions, 32 deletions
diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index 1b28a19..f54f276 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -885,7 +885,15 @@ init_options(struct options *o, const bool init_gc)
#ifdef _WIN32
/* On Windows, find temp dir via environment variables */
o->tmp_dir = win_get_tempdir();
-#else
+
+ if (!o->tmp_dir)
+ {
+ /* Error out if we can't find a valid temporary directory, which should
+ * be very unlikely. */
+ msg(M_USAGE, "Could not find a suitable temporary directory."
+ " (GetTempPath() failed). Consider using --tmp-dir");
+ }
+#else /* ifdef _WIN32 */
/* Non-windows platforms use $TMPDIR, and if not set, default to '/tmp' */
o->tmp_dir = getenv("TMPDIR");
if (!o->tmp_dir)
diff --git a/src/openvpn/win32-util.c b/src/openvpn/win32-util.c
index 81e504a..c5e7505 100644
--- a/src/openvpn/win32-util.c
+++ b/src/openvpn/win32-util.c
@@ -147,4 +147,26 @@ win_safe_filename(const char *fn)
}
return true;
}
+
+const char *
+win_get_tempdir(void)
+{
+ static char tmpdir[MAX_PATH];
+ WCHAR wtmpdir[MAX_PATH];
+
+ if (!GetTempPathW(_countof(wtmpdir), wtmpdir))
+ {
+ return NULL;
+ }
+
+ if (WideCharToMultiByte(CP_UTF8, 0, wtmpdir, -1, NULL, 0, NULL, NULL) > sizeof(tmpdir))
+ {
+ msg(M_WARN, "Could not get temporary directory. Path is too long."
+ " Consider using --tmp-dir");
+ return NULL;
+ }
+
+ WideCharToMultiByte(CP_UTF8, 0, wtmpdir, -1, tmpdir, sizeof(tmpdir), NULL, NULL);
+ return tmpdir;
+}
#endif /* _WIN32 */
diff --git a/src/openvpn/win32-util.h b/src/openvpn/win32-util.h
index ac37979..98bf74b 100644
--- a/src/openvpn/win32-util.h
+++ b/src/openvpn/win32-util.h
@@ -40,5 +40,8 @@ char *utf16to8(const wchar_t *utf16, struct gc_arena *gc);
/* return true if filename is safe to be used on Windows */
bool win_safe_filename(const char *fn);
+/* Find temporary directory */
+const char *win_get_tempdir(void);
+
#endif /* OPENVPN_WIN32_UTIL_H */
#endif /* ifdef _WIN32 */
diff --git a/src/openvpn/win32.c b/src/openvpn/win32.c
index e998d90..6b7ba5e 100644
--- a/src/openvpn/win32.c
+++ b/src/openvpn/win32.c
@@ -1137,34 +1137,6 @@ set_win_sys_path_via_env(struct env_set *es)
set_win_sys_path(buf, es);
}
-
-const char *
-win_get_tempdir(void)
-{
- static char tmpdir[MAX_PATH];
- WCHAR wtmpdir[MAX_PATH];
-
- if (!GetTempPathW(_countof(wtmpdir), wtmpdir))
- {
- /* Warn if we can't find a valid temporary directory, which should
- * be unlikely.
- */
- msg(M_WARN, "Could not find a suitable temporary directory."
- " (GetTempPath() failed). Consider using --tmp-dir");
- return NULL;
- }
-
- if (WideCharToMultiByte(CP_UTF8, 0, wtmpdir, -1, NULL, 0, NULL, NULL) > sizeof(tmpdir))
- {
- msg(M_WARN, "Could not get temporary directory. Path is too long."
- " Consider using --tmp-dir");
- return NULL;
- }
-
- WideCharToMultiByte(CP_UTF8, 0, wtmpdir, -1, tmpdir, sizeof(tmpdir), NULL, NULL);
- return tmpdir;
-}
-
static bool
win_block_dns_service(bool add, int index, const HANDLE pipe)
{
diff --git a/src/openvpn/win32.h b/src/openvpn/win32.h
index 3605966..aa8513b 100644
--- a/src/openvpn/win32.h
+++ b/src/openvpn/win32.h
@@ -286,9 +286,6 @@ char *get_win_sys_path(void);
/* call self in a subprocess */
void fork_to_self(const char *cmdline);
-/* Find temporary directory */
-const char *win_get_tempdir(void);
-
bool win_wfp_block_dns(const NET_IFINDEX index, const HANDLE msg_channel);
bool win_wfp_uninit(const NET_IFINDEX index, const HANDLE msg_channel);