| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-05-06 20:03:23 +08:00
										 |  |  |  * Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:05:25 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  |  * 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  | #include <openssl/opensslconf.h>
 | 
					
						
							|  |  |  | #include <openssl/err.h>
 | 
					
						
							| 
									
										
										
										
											2020-05-27 10:10:52 +08:00
										 |  |  | #include <openssl/macros.h>
 | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "testutil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(OPENSSL_SYS_WINDOWS)
 | 
					
						
							|  |  |  | # include <windows.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | # include <errno.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | #ifndef OPENSSL_NO_DEPRECATED_3_0
 | 
					
						
							|  |  |  | # define IS_HEX(ch) ((ch >= '0' && ch <='9') || (ch >= 'A' && ch <='F'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test_print_error_format(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     /* Variables used to construct an error line */ | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     char *lib; | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     const char *func = OPENSSL_FUNC; | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     char *reason; | 
					
						
							|  |  |  | # ifdef OPENSSL_NO_ERR
 | 
					
						
							|  |  |  |     char reasonbuf[255]; | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | # ifndef OPENSSL_NO_FILENAMES
 | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     const char *file = OPENSSL_FILE; | 
					
						
							|  |  |  |     const int line = OPENSSL_LINE; | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | # else
 | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     const char *file = ""; | 
					
						
							|  |  |  |     const int line = 0; | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     /* The format for OpenSSL error lines */ | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     const char *expected_format = ":error:%08lX:%s:%s:%s:%s:%d"; | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     /*-
 | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |      *                                          ^^ ^^ ^^ ^^ ^^ | 
					
						
							|  |  |  |      * "library" name --------------------------++ || || || || | 
					
						
							|  |  |  |      * function name ------------------------------++ || || || | 
					
						
							|  |  |  |      * reason string (system error string) -----------++ || || | 
					
						
							|  |  |  |      * file name ----------------------------------------++ || | 
					
						
							|  |  |  |      * line number -----------------------------------------++ | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     char expected[512]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  |     char *out = NULL, *p = NULL; | 
					
						
							|  |  |  |     int ret = 0, len; | 
					
						
							|  |  |  |     BIO *bio = NULL; | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     const int syserr = EPERM; | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     unsigned long errorcode; | 
					
						
							|  |  |  |     unsigned long reasoncode; | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * We set a mark here so we can clear the system error that we generate | 
					
						
							|  |  |  |      * with ERR_PUT_error().  That is, after all, just a simulation to verify | 
					
						
							|  |  |  |      * ERR_print_errors() output, not a real error. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ERR_set_mark(); | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     ERR_PUT_error(ERR_LIB_SYS, 0, syserr, file, line); | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     errorcode = ERR_peek_error(); | 
					
						
							|  |  |  |     reasoncode = ERR_GET_REASON(errorcode); | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_int_eq(reasoncode, syserr)) { | 
					
						
							|  |  |  |         ERR_pop_to_mark(); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 09:04:28 +08:00
										 |  |  | # if !defined(OPENSSL_NO_ERR)
 | 
					
						
							|  |  |  | #  if defined(OPENSSL_NO_AUTOERRINIT)
 | 
					
						
							|  |  |  |     lib = "lib(2)"; | 
					
						
							|  |  |  | #  else
 | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     lib = "system library"; | 
					
						
							| 
									
										
										
										
											2021-04-22 09:04:28 +08:00
										 |  |  | #  endif
 | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |     reason = strerror(syserr); | 
					
						
							|  |  |  | # else
 | 
					
						
							|  |  |  |     lib = "lib(2)"; | 
					
						
							|  |  |  |     BIO_snprintf(reasonbuf, sizeof(reasonbuf), "reason(%lu)", reasoncode); | 
					
						
							|  |  |  |     reason = reasonbuf; | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     BIO_snprintf(expected, sizeof(expected), expected_format, | 
					
						
							| 
									
										
										
										
											2020-11-25 19:05:35 +08:00
										 |  |  |                  errorcode, lib, func, reason, file, line); | 
					
						
							| 
									
										
										
										
											2020-05-27 10:10:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  |     if (!TEST_ptr(bio = BIO_new(BIO_s_mem()))) | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |         goto err; | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ERR_print_errors(bio); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_int_gt(len = BIO_get_mem_data(bio, &out), 0)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     /* Skip over the variable thread id at the start of the string */ | 
					
						
							|  |  |  |     for (p = out; *p != ':' && *p != 0; ++p) { | 
					
						
							|  |  |  |         if (!TEST_true(IS_HEX(*p))) | 
					
						
							|  |  |  |             goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!TEST_true(*p != 0) | 
					
						
							|  |  |  |         || !TEST_strn_eq(expected, p, strlen(expected))) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = 1; | 
					
						
							|  |  |  | err: | 
					
						
							|  |  |  |     BIO_free(bio); | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  | /* 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 TEST_int_eq(GetLastError(), ERROR_INVALID_FUNCTION); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     errno = EINVAL; | 
					
						
							|  |  |  |     ERR_get_error(); | 
					
						
							|  |  |  |     return TEST_int_eq(errno, EINVAL); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 00:06:17 +08:00
										 |  |  | /* Test that calls to ERR_add_error_[v]data append */ | 
					
						
							|  |  |  | static int vdata_appends(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-04 19:23:19 +08:00
										 |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											2019-06-19 00:06:17 +08:00
										 |  |  |     ERR_add_error_data(1, "hello "); | 
					
						
							|  |  |  |     ERR_add_error_data(1, "world"); | 
					
						
							| 
									
										
										
										
											2019-09-05 04:04:08 +08:00
										 |  |  |     ERR_peek_error_data(&data, NULL); | 
					
						
							| 
									
										
										
										
											2019-06-19 00:06:17 +08:00
										 |  |  |     return TEST_str_eq(data, "hello world"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 21:10:43 +08:00
										 |  |  | static int raised_error(void) | 
					
						
							| 
									
										
										
										
											2019-06-12 03:42:42 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-07 16:47:43 +08:00
										 |  |  |     const char *f, *data; | 
					
						
							| 
									
										
										
										
											2019-06-12 03:42:42 +08:00
										 |  |  |     int l; | 
					
						
							|  |  |  |     unsigned long e; | 
					
						
							| 
									
										
										
										
											2019-09-03 21:10:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * When OPENSSL_NO_ERR or OPENSSL_NO_FILENAMES, no file name or line | 
					
						
							|  |  |  |      * number is saved, so no point checking them. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | #if !defined(OPENSSL_NO_FILENAMES) && !defined(OPENSSL_NO_ERR)
 | 
					
						
							| 
									
										
										
										
											2019-08-07 16:47:43 +08:00
										 |  |  |     const char *file; | 
					
						
							|  |  |  |     int line; | 
					
						
							| 
									
										
										
										
											2019-06-12 03:42:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-24 19:25:56 +08:00
										 |  |  |     file = __FILE__; | 
					
						
							| 
									
										
										
										
											2019-08-07 16:47:43 +08:00
										 |  |  |     line = __LINE__ + 2; /* The error is generated on the ERR_raise_data line */ | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-06-29 18:43:40 +08:00
										 |  |  |     ERR_raise_data(ERR_LIB_NONE, ERR_R_INTERNAL_ERROR, | 
					
						
							| 
									
										
										
										
											2019-08-01 03:24:20 +08:00
										 |  |  |                    "calling exit()"); | 
					
						
							| 
									
										
										
										
											2019-09-05 04:04:08 +08:00
										 |  |  |     if (!TEST_ulong_ne(e = ERR_get_error_all(&f, &l, NULL, &data, NULL), 0) | 
					
						
							| 
									
										
										
										
											2019-06-12 03:42:42 +08:00
										 |  |  |             || !TEST_int_eq(ERR_GET_REASON(e), ERR_R_INTERNAL_ERROR) | 
					
						
							| 
									
										
										
										
											2019-09-03 21:10:43 +08:00
										 |  |  | #if !defined(OPENSSL_NO_FILENAMES) && !defined(OPENSSL_NO_ERR)
 | 
					
						
							| 
									
										
										
										
											2019-06-12 03:42:42 +08:00
										 |  |  |             || !TEST_int_eq(l, line) | 
					
						
							|  |  |  |             || !TEST_str_eq(f, file) | 
					
						
							| 
									
										
										
										
											2019-08-07 16:47:43 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-08-01 03:24:20 +08:00
										 |  |  |             || !TEST_str_eq(data, "calling exit()")) | 
					
						
							| 
									
										
										
										
											2019-06-12 03:42:42 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 20:53:01 +08:00
										 |  |  | static int test_marks(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     unsigned long mallocfail, shouldnot; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Set an initial error */ | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  |     mallocfail = ERR_peek_last_error(); | 
					
						
							|  |  |  |     if (!TEST_ulong_gt(mallocfail, 0)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Setting and clearing a mark should not affect the error */ | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_peek_last_error()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_set_mark()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_clear_last_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Test popping errors */ | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR); | 
					
						
							|  |  |  |     if (!TEST_ulong_ne(mallocfail, ERR_peek_last_error()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Nested marks should also work */ | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR); | 
					
						
							|  |  |  |     if (!TEST_ulong_ne(mallocfail, ERR_peek_last_error()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 
					
						
							|  |  |  |     shouldnot = ERR_peek_last_error(); | 
					
						
							|  |  |  |     if (!TEST_ulong_ne(mallocfail, shouldnot) | 
					
						
							|  |  |  |             || !TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR); | 
					
						
							|  |  |  |     if (!TEST_ulong_ne(shouldnot, ERR_peek_last_error()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(shouldnot, ERR_peek_last_error()) | 
					
						
							|  |  |  |             || !TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Setting and clearing a mark should not affect the errors on the stack */ | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 
					
						
							|  |  |  |     if (!TEST_true(ERR_clear_last_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(shouldnot, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Popping where no mark has been set should pop everything - but return | 
					
						
							|  |  |  |      * a failure result | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     if (!TEST_false(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(0, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Clearing where there is no mark should fail */ | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  |     if (!TEST_false(ERR_clear_last_mark()) | 
					
						
							|  |  |  |                 /* "get" the last error to remove it */ | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_get_error()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(0, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Setting a mark where there are no errors in the stack should fail. | 
					
						
							|  |  |  |      * NOTE: This is somewhat surprising behaviour but is historically how this | 
					
						
							|  |  |  |      * function behaves. In practice we typically set marks without first | 
					
						
							|  |  |  |      * checking whether there is anything on the stack - but we also don't | 
					
						
							|  |  |  |      * tend to check the success of this function. It turns out to work anyway | 
					
						
							|  |  |  |      * because although setting a mark with no errors fails, a subsequent call | 
					
						
							|  |  |  |      * to ERR_pop_to_mark() or ERR_clear_last_mark() will do the right thing | 
					
						
							|  |  |  |      * anyway (even though they will report a failure result). | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     if (!TEST_false(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR); | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Should be able to "pop" past 2 errors */ | 
					
						
							|  |  |  |     if (!TEST_true(ERR_pop_to_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(mallocfail, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TEST_true(ERR_set_mark())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR); | 
					
						
							|  |  |  |     ERR_raise(ERR_LIB_CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Should be able to "clear" past 2 errors */ | 
					
						
							|  |  |  |     if (!TEST_true(ERR_clear_last_mark()) | 
					
						
							|  |  |  |             || !TEST_ulong_eq(shouldnot, ERR_peek_last_error())) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Clear remaining errors from last test */ | 
					
						
							|  |  |  |     ERR_clear_error(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 09:58:48 +08:00
										 |  |  | static int test_clear_error(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int flags = -1; | 
					
						
							|  |  |  |     const char *data = NULL; | 
					
						
							|  |  |  |     int res = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Raise an error with data and clear it */ | 
					
						
							|  |  |  |     ERR_raise_data(0, 0, "hello %s", "world"); | 
					
						
							|  |  |  |     ERR_peek_error_data(&data, &flags); | 
					
						
							|  |  |  |     if (!TEST_str_eq(data, "hello world") | 
					
						
							|  |  |  |             || !TEST_int_eq(flags, ERR_TXT_STRING | ERR_TXT_MALLOCED)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     ERR_clear_error(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Raise a new error without data */ | 
					
						
							|  |  |  |     ERR_raise(0, 0); | 
					
						
							|  |  |  |     ERR_peek_error_data(&data, &flags); | 
					
						
							|  |  |  |     if (!TEST_str_eq(data, "") | 
					
						
							|  |  |  |             || !TEST_int_eq(flags, ERR_TXT_MALLOCED)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     ERR_clear_error(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Raise a new error with data */ | 
					
						
							|  |  |  |     ERR_raise_data(0, 0, "goodbye %s world", "cruel"); | 
					
						
							|  |  |  |     ERR_peek_error_data(&data, &flags); | 
					
						
							|  |  |  |     if (!TEST_str_eq(data, "goodbye cruel world") | 
					
						
							|  |  |  |             || !TEST_int_eq(flags, ERR_TXT_STRING | ERR_TXT_MALLOCED)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     ERR_clear_error(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Raise a new error without data to check that the malloced storage | 
					
						
							|  |  |  |      * is freed properly | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ERR_raise(0, 0); | 
					
						
							|  |  |  |     ERR_peek_error_data(&data, &flags); | 
					
						
							|  |  |  |     if (!TEST_str_eq(data, "") | 
					
						
							|  |  |  |             || !TEST_int_eq(flags, ERR_TXT_MALLOCED)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     ERR_clear_error(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     res = 1; | 
					
						
							|  |  |  |  err: | 
					
						
							|  |  |  |      ERR_clear_error(); | 
					
						
							|  |  |  |     return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  | int setup_tests(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ADD_TEST(preserves_system_error); | 
					
						
							| 
									
										
										
										
											2019-06-19 00:06:17 +08:00
										 |  |  |     ADD_TEST(vdata_appends); | 
					
						
							| 
									
										
										
										
											2019-09-03 21:10:43 +08:00
										 |  |  |     ADD_TEST(raised_error); | 
					
						
							| 
									
										
										
										
											2020-05-26 10:44:36 +08:00
										 |  |  | #ifndef OPENSSL_NO_DEPRECATED_3_0
 | 
					
						
							|  |  |  |     ADD_TEST(test_print_error_format); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-11-06 20:53:01 +08:00
										 |  |  |     ADD_TEST(test_marks); | 
					
						
							| 
									
										
										
										
											2021-06-09 09:58:48 +08:00
										 |  |  |     ADD_TEST(test_clear_error); | 
					
						
							| 
									
										
										
										
											2018-05-21 05:24:30 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } |