• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2014, Google Inc.
2  *
3  * Permission to use, copy, modify, and/or distribute this software for any
4  * purpose with or without fee is hereby granted, provided that the above
5  * copyright notice and this permission notice appear in all copies.
6  *
7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14 
15 #include <errno.h>
16 #include <stdio.h>
17 #include <string.h>
18 
19 #include <gtest/gtest.h>
20 
21 #include <openssl/crypto.h>
22 #include <openssl/err.h>
23 #include <openssl/evp.h>
24 #include <openssl/mem.h>
25 
26 #include "./internal.h"
27 
28 #if defined(OPENSSL_WINDOWS)
29 OPENSSL_MSVC_PRAGMA(warning(push, 3))
30 #include <windows.h>
OPENSSL_MSVC_PRAGMA(warning (pop))31 OPENSSL_MSVC_PRAGMA(warning(pop))
32 #else
33 #include <errno.h>
34 #endif
35 
36 
37 TEST(ErrTest, Overflow) {
38   for (unsigned i = 0; i < ERR_NUM_ERRORS*2; i++) {
39     ERR_put_error(1, 0 /* unused */, i+1, "test", 1);
40   }
41 
42   for (unsigned i = 0; i < ERR_NUM_ERRORS - 1; i++) {
43     SCOPED_TRACE(i);
44     uint32_t err = ERR_get_error();
45     // Errors are returned in order they were pushed, with the least recent ones
46     // removed, up to |ERR_NUM_ERRORS - 1| errors. So the errors returned are
47     // |ERR_NUM_ERRORS + 2| through |ERR_NUM_ERRORS * 2|, inclusive.
48     EXPECT_NE(0u, err);
49     EXPECT_EQ(static_cast<int>(i + ERR_NUM_ERRORS + 2), ERR_GET_REASON(err));
50   }
51 
52   EXPECT_EQ(0u, ERR_get_error());
53 }
54 
TEST(ErrTest,PutError)55 TEST(ErrTest, PutError) {
56   ASSERT_EQ(0u, ERR_get_error())
57       << "ERR_get_error returned value before an error was added.";
58 
59   ERR_put_error(1, 0 /* unused */, 2, "test", 4);
60   ERR_add_error_data(1, "testing");
61 
62   int peeked_line, line, peeked_flags, flags;
63   const char *peeked_file, *file, *peeked_data, *data;
64   uint32_t peeked_packed_error =
65       ERR_peek_error_line_data(&peeked_file, &peeked_line, &peeked_data,
66                                &peeked_flags);
67   uint32_t packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
68 
69   EXPECT_EQ(peeked_packed_error, packed_error);
70   EXPECT_EQ(peeked_file, file);
71   EXPECT_EQ(peeked_data, data);
72   EXPECT_EQ(peeked_flags, flags);
73 
74   EXPECT_STREQ("test", file);
75   EXPECT_EQ(4, line);
76   EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED);
77   EXPECT_EQ(1, ERR_GET_LIB(packed_error));
78   EXPECT_EQ(2, ERR_GET_REASON(packed_error));
79   EXPECT_STREQ("testing", data);
80 
81   ERR_put_error(1, 0 /* unused */, 2, "test", 4);
82   ERR_set_error_data(const_cast<char *>("testing"), ERR_FLAG_STRING);
83   packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
84   EXPECT_STREQ("testing", data);
85 
86   ERR_put_error(1, 0 /* unused */, 2, "test", 4);
87   bssl::UniquePtr<char> str(OPENSSL_strdup("testing"));
88   ERR_set_error_data(str.release(), ERR_FLAG_STRING | ERR_FLAG_MALLOCED);
89   packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
90   EXPECT_STREQ("testing", data);
91 }
92 
TEST(ErrTest,ClearError)93 TEST(ErrTest, ClearError) {
94   ASSERT_EQ(0u, ERR_get_error())
95       << "ERR_get_error returned value before an error was added.";
96 
97   ERR_put_error(1, 0 /* unused */, 2, "test", 4);
98   ERR_clear_error();
99 
100   // The error queue should be cleared.
101   EXPECT_EQ(0u, ERR_get_error());
102 }
103 
TEST(ErrTest,Print)104 TEST(ErrTest, Print) {
105   ERR_put_error(1, 0 /* unused */, 2, "test", 4);
106   ERR_add_error_data(1, "testing");
107   uint32_t packed_error = ERR_get_error();
108 
109   char buf[256];
110   for (size_t i = 0; i <= sizeof(buf); i++) {
111     ERR_error_string_n(packed_error, buf, i);
112   }
113 }
114 
TEST(ErrTest,Release)115 TEST(ErrTest, Release) {
116   ERR_put_error(1, 0 /* unused */, 2, "test", 4);
117   ERR_remove_thread_state(NULL);
118 
119   // The error queue should be cleared.
120   EXPECT_EQ(0u, ERR_get_error());
121 }
122 
HasSuffix(const char * str,const char * suffix)123 static bool HasSuffix(const char *str, const char *suffix) {
124   size_t suffix_len = strlen(suffix);
125   size_t str_len = strlen(str);
126   if (str_len < suffix_len) {
127     return false;
128   }
129   return strcmp(str + str_len - suffix_len, suffix) == 0;
130 }
131 
TEST(ErrTest,PutMacro)132 TEST(ErrTest, PutMacro) {
133   int expected_line = __LINE__ + 1;
134   OPENSSL_PUT_ERROR(USER, ERR_R_INTERNAL_ERROR);
135 
136   int line;
137   const char *file;
138   uint32_t error = ERR_get_error_line(&file, &line);
139 
140   EXPECT_PRED2(HasSuffix, file, "err_test.cc");
141   EXPECT_EQ(expected_line, line);
142   EXPECT_EQ(ERR_LIB_USER, ERR_GET_LIB(error));
143   EXPECT_EQ(ERR_R_INTERNAL_ERROR, ERR_GET_REASON(error));
144 }
145 
TEST(ErrTest,SaveAndRestore)146 TEST(ErrTest, SaveAndRestore) {
147   // Restoring no state clears the error queue, including error data.
148   ERR_put_error(1, 0 /* unused */, 1, "test1.c", 1);
149   ERR_put_error(2, 0 /* unused */, 2, "test2.c", 2);
150   ERR_add_error_data(1, "data1");
151   ERR_restore_state(nullptr);
152   EXPECT_EQ(0u, ERR_get_error());
153 
154   // Add some entries to the error queue and save it.
155   ERR_put_error(1, 0 /* unused */, 1, "test1.c", 1);
156   ERR_add_error_data(1, "data1");
157   ERR_put_error(2, 0 /* unused */, 2, "test2.c", 2);
158   ERR_put_error(3, 0 /* unused */, 3, "test3.c", 3);
159   ERR_add_error_data(1, "data3");
160   bssl::UniquePtr<ERR_SAVE_STATE> saved(ERR_save_state());
161   ASSERT_TRUE(saved);
162 
163   // The existing error queue entries still exist.
164   int line, flags;
165   const char *file, *data;
166   uint32_t packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
167   EXPECT_EQ(ERR_GET_LIB(packed_error), 1);
168   EXPECT_EQ(ERR_GET_REASON(packed_error), 1);
169   EXPECT_STREQ("test1.c", file);
170   EXPECT_EQ(line, 1);
171   EXPECT_STREQ(data, "data1");
172   EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED);
173 
174   // The state may be restored, both over an empty and non-empty state.
175   for (unsigned i = 0; i < 2; i++) {
176     SCOPED_TRACE(i);
177     ERR_restore_state(saved.get());
178 
179     packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
180     EXPECT_EQ(ERR_GET_LIB(packed_error), 1);
181     EXPECT_EQ(ERR_GET_REASON(packed_error), 1);
182     EXPECT_STREQ("test1.c", file);
183     EXPECT_EQ(line, 1);
184     EXPECT_STREQ(data, "data1");
185     EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED);
186 
187     packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
188     EXPECT_EQ(ERR_GET_LIB(packed_error), 2);
189     EXPECT_EQ(ERR_GET_REASON(packed_error), 2);
190     EXPECT_STREQ("test2.c", file);
191     EXPECT_EQ(line, 2);
192     EXPECT_STREQ(data, "");  // No error data is reported as the empty string.
193     EXPECT_EQ(flags, 0);
194 
195     packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
196     EXPECT_EQ(ERR_GET_LIB(packed_error), 3);
197     EXPECT_EQ(ERR_GET_REASON(packed_error), 3);
198     EXPECT_STREQ("test3.c", file);
199     EXPECT_EQ(line, 3);
200     EXPECT_STREQ(data, "data3");
201     EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED);
202 
203     // The error queue is now empty for the next iteration.
204     EXPECT_EQ(0u, ERR_get_error());
205   }
206 
207   // Test a case where the error queue wraps around. The first set of errors
208   // will all be discarded, but result in wrapping the list around.
209   ERR_clear_error();
210   for (unsigned i = 0; i < ERR_NUM_ERRORS / 2; i++) {
211     ERR_put_error(0, 0 /* unused */, 0, "invalid", 0);
212   }
213   for (unsigned i = 1; i < ERR_NUM_ERRORS; i++) {
214     ERR_put_error(i, 0 /* unused */, i, "test", i);
215   }
216   saved.reset(ERR_save_state());
217 
218   // The state may be restored, both over an empty and non-empty state. Pop one
219   // error off so the first iteration is tested to not be a no-op.
220   ERR_get_error();
221   for (int i = 0; i < 2; i++) {
222     SCOPED_TRACE(i);
223     ERR_restore_state(saved.get());
224     for (int j = 1; j < ERR_NUM_ERRORS; j++) {
225       SCOPED_TRACE(j);
226       packed_error = ERR_get_error_line_data(&file, &line, &data, &flags);
227       EXPECT_EQ(ERR_GET_LIB(packed_error), j);
228       EXPECT_EQ(ERR_GET_REASON(packed_error), j);
229       EXPECT_STREQ("test", file);
230       EXPECT_EQ(line, j);
231     }
232     // The error queue is now empty for the next iteration.
233     EXPECT_EQ(0u, ERR_get_error());
234   }
235 }
236 
237 // Querying the error queue should not affect the OS error.
238 #if defined(OPENSSL_WINDOWS)
TEST(ErrTest,PreservesLastError)239 TEST(ErrTest, PreservesLastError) {
240   SetLastError(ERROR_INVALID_FUNCTION);
241   ERR_get_error();
242   EXPECT_EQ(static_cast<DWORD>(ERROR_INVALID_FUNCTION), GetLastError());
243 }
244 #else
TEST(ErrTest,PreservesErrno)245 TEST(ErrTest, PreservesErrno) {
246   errno = EINVAL;
247   ERR_get_error();
248   EXPECT_EQ(EINVAL, errno);
249 }
250 #endif
251 
TEST(ErrTest,String)252 TEST(ErrTest, String) {
253   char buf[128];
254   uint32_t err = ERR_PACK(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
255 
256   EXPECT_STREQ(
257       "error:0e000044:common libcrypto routines:OPENSSL_internal:internal "
258       "error",
259       ERR_error_string_n(err, buf, sizeof(buf)));
260 
261   // The buffer is exactly the right size.
262   EXPECT_STREQ(
263       "error:0e000044:common libcrypto routines:OPENSSL_internal:internal "
264       "error",
265       ERR_error_string_n(err, buf, 73));
266 
267   // If the buffer is too short, the string is truncated.
268   EXPECT_STREQ(
269       "error:0e000044:common libcrypto routines:OPENSSL_internal:internal "
270       "erro",
271       ERR_error_string_n(err, buf, 72));
272   EXPECT_STREQ("error:0e000044:common libcrypto routines:OPENSSL_internal:",
273                ERR_error_string_n(err, buf, 59));
274 
275   // Truncated log lines always have the right number of colons.
276   EXPECT_STREQ("error:0e000044:common libcrypto routines:OPENSSL_interna:",
277                ERR_error_string_n(err, buf, 58));
278   EXPECT_STREQ("error:0e000044:common libcrypto routines:OPENSSL_intern:",
279                ERR_error_string_n(err, buf, 57));
280   EXPECT_STREQ("error:0e000044:common libcryp::",
281                ERR_error_string_n(err, buf, 32));
282   EXPECT_STREQ("error:0e0000:::",
283                ERR_error_string_n(err, buf, 16));
284   EXPECT_STREQ("err::::",
285                ERR_error_string_n(err, buf, 8));
286   EXPECT_STREQ("::::",
287                ERR_error_string_n(err, buf, 5));
288 
289   // If the buffer is too short for even four colons, |ERR_error_string_n| does
290   // not bother trying to preserve the format.
291   EXPECT_STREQ("err", ERR_error_string_n(err, buf, 4));
292   EXPECT_STREQ("er", ERR_error_string_n(err, buf, 3));
293   EXPECT_STREQ("e", ERR_error_string_n(err, buf, 2));
294   EXPECT_STREQ("", ERR_error_string_n(err, buf, 1));
295 
296   // A buffer length of zero should not touch the buffer.
297   ERR_error_string_n(err, nullptr, 0);
298 
299   EXPECT_STREQ(ERR_lib_error_string(err), "common libcrypto routines");
300   EXPECT_STREQ(ERR_lib_symbol_name(err), "CRYPTO");
301   EXPECT_STREQ(ERR_reason_error_string(err), "internal error");
302   EXPECT_STREQ(ERR_reason_symbol_name(err), "INTERNAL_ERROR");
303 
304   // Check a normal error.
305   err = ERR_PACK(ERR_LIB_EVP, EVP_R_DECODE_ERROR);
306   EXPECT_STREQ(ERR_lib_error_string(err), "public key routines");
307   EXPECT_STREQ(ERR_lib_symbol_name(err), "EVP");
308   EXPECT_STREQ(ERR_reason_error_string(err), "DECODE_ERROR");
309   EXPECT_STREQ(ERR_reason_symbol_name(err), "DECODE_ERROR");
310 
311   // Check an error that forwards to another library.
312   err = ERR_PACK(ERR_LIB_EVP, ERR_R_BN_LIB);
313   EXPECT_STREQ(ERR_lib_error_string(err), "public key routines");
314   EXPECT_STREQ(ERR_lib_symbol_name(err), "EVP");
315   EXPECT_STREQ(ERR_reason_error_string(err), "bignum routines");
316   EXPECT_STREQ(ERR_reason_symbol_name(err), "BN_LIB");
317 
318   // Errors in |ERR_LIB_SYS| are |errno| values, so we don't have their symbolic
319   // names. Their human-readable strings are OS- and even locale-dependent.
320   err = ERR_PACK(ERR_LIB_SYS, ERANGE);
321   EXPECT_STREQ(ERR_lib_error_string(err), "system library");
322   EXPECT_STREQ(ERR_lib_symbol_name(err), "SYS");
323   EXPECT_NE(ERR_reason_error_string(err), nullptr);
324   EXPECT_STRNE(ERR_reason_error_string(err), "unknown error");
325   EXPECT_EQ(ERR_reason_symbol_name(err), nullptr);
326 }
327 
328 // Error-printing functions should return something with unknown errors.
TEST(ErrTest,UnknownError)329 TEST(ErrTest, UnknownError) {
330   uint32_t err = ERR_PACK(0xff, 0xfff);
331   EXPECT_TRUE(ERR_lib_error_string(err));
332   EXPECT_TRUE(ERR_reason_error_string(err));
333   char buf[128];
334   ERR_error_string_n(err, buf, sizeof(buf));
335   EXPECT_NE(0u, strlen(buf));
336 }
337