summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorDavid Benjamin <davidben@google.com>2018-05-20 17:24:30 -0400
committerDavid Benjamin <davidben@google.com>2018-05-24 15:49:33 -0400
commit1ae891c6b15e28b280845858326fb50ea5b61ac7 (patch)
tree92b3941bbc56e8dc39dc339e26cb1661543b7e5d /test
parent926b21117df939241f1cd63f2f9e3ab87819f0ed (diff)
Save and restore the Windows error around TlsGetValue.
TlsGetValue clears the last error even on success, so that callers may distinguish it successfully returning NULL or failing. This error-mangling behavior interferes with the caller's use of GetLastError. In particular SSL_get_error queries the error queue to determine whether the caller should look at the OS's errors. To avoid destroying state, save and restore the Windows error. Fixes #6299. Reviewed-by: Rich Salz <rsalz@openssl.org> (cherry picked from commit 2de108dfa343c3e06eb98beb122cd06306bb12fd) (Merged from https://github.com/openssl/openssl/pull/6349)
Diffstat (limited to 'test')
-rw-r--r--test/build.info6
-rw-r--r--test/errtest.c40
-rw-r--r--test/recipes/04-test_err.t12
3 files changed, 57 insertions, 1 deletions
diff --git a/test/build.info b/test/build.info
index dcb398517c..87961bc834 100644
--- a/test/build.info
+++ b/test/build.info
@@ -18,7 +18,7 @@ IF[{- !$disabled{tests} -}]
dtlsv1listentest ct_test threadstest afalgtest d2i_test \
ssl_test_ctx_test ssl_test x509aux cipherlist_test asynciotest \
bioprinttest sslapitest dtlstest sslcorrupttest bio_enc_test \
- ocspapitest fatalerrtest x509_time_test
+ ocspapitest fatalerrtest x509_time_test errtest
SOURCE[versions]=versions.c
INCLUDE[versions]=../include
@@ -306,6 +306,10 @@ IF[{- !$disabled{tests} -}]
SOURCE[shlibloadtest]=shlibloadtest.c
INCLUDE[shlibloadtest]=../include
ENDIF
+
+ SOURCE[errtest]=errtest.c testutil.c
+ INCLUDE[errtest]=../include
+ DEPEND[errtest]=../libcrypto
ENDIF
{-
diff --git a/test/errtest.c b/test/errtest.c
new file mode 100644
index 0000000000..df4cddb096
--- /dev/null
+++ b/test/errtest.c
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include <openssl/opensslconf.h>
+#include <openssl/err.h>
+
+#include "testutil.h"
+
+#if defined(OPENSSL_SYS_WINDOWS)
+# include <windows.h>
+#else
+# include <errno.h>
+#endif
+
+/* Test that querying the error queue preserves the OS error. */
+static int preserves_system_error(void)
+{
+#if defined(OPENSSL_SYS_WINDOWS)
+ SetLastError(ERROR_INVALID_FUNCTION);
+ ERR_get_error();
+ return GetLastError() == ERROR_INVALID_FUNCTION;
+#else
+ errno = EINVAL;
+ ERR_get_error();
+ return errno == EINVAL;
+#endif
+}
+
+int main(int argc, char **argv)
+{
+ ADD_TEST(preserves_system_error);
+
+ return run_tests(argv[0]);
+}
diff --git a/test/recipes/04-test_err.t b/test/recipes/04-test_err.t
new file mode 100644
index 0000000000..dd7681afa4
--- /dev/null
+++ b/test/recipes/04-test_err.t
@@ -0,0 +1,12 @@
+#! /usr/bin/env perl
+# Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the OpenSSL license (the "License"). You may not use
+# this file except in compliance with the License. You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
+
+use OpenSSL::Test::Simple;
+
+simple_test("test_err", "errtest");