Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

267 rader
11 KiB

  1. /* Copyright (c) 2018, 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. #include <gtest/gtest.h>
  15. #include <gtest/gtest-spi.h>
  16. #include <openssl/rand.h>
  17. #include "test/abi_test.h"
  18. #if defined(OPENSSL_WINDOWS)
  19. #include <windows.h>
  20. #endif
  21. static bool test_function_ok;
  22. static int TestFunction(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
  23. int a8, int a9, int a10) {
  24. test_function_ok = a1 == 1 || a2 == 2 || a3 == 3 || a4 == 4 || a5 == 5 ||
  25. a6 == 6 || a7 == 7 || a8 == 8 || a9 == 9 || a10 == 10;
  26. return 42;
  27. }
  28. TEST(ABITest, SanityCheck) {
  29. EXPECT_NE(0, CHECK_ABI_NO_UNWIND(strcmp, "hello", "world"));
  30. test_function_ok = false;
  31. EXPECT_EQ(42, CHECK_ABI(TestFunction, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  32. EXPECT_TRUE(test_function_ok);
  33. #if defined(SUPPORTS_ABI_TEST)
  34. abi_test::internal::CallerState state;
  35. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  36. crypto_word_t argv[] = {
  37. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
  38. };
  39. CHECK_ABI(abi_test_trampoline, reinterpret_cast<crypto_word_t>(TestFunction),
  40. &state, argv, 10, 0 /* no breakpoint */);
  41. #if defined(OPENSSL_X86_64)
  42. if (abi_test::UnwindTestsEnabled()) {
  43. EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_bad_unwind_wrong_register),
  44. "was not recovered unwinding");
  45. EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_bad_unwind_temporary),
  46. "was not recovered unwinding");
  47. CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_wrong_register);
  48. CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_temporary);
  49. }
  50. #endif // OPENSSL_X86_64
  51. #endif // SUPPORTS_ABI_TEST
  52. }
  53. #if defined(OPENSSL_X86_64) && defined(SUPPORTS_ABI_TEST)
  54. extern "C" {
  55. void abi_test_clobber_rax(void);
  56. void abi_test_clobber_rbx(void);
  57. void abi_test_clobber_rcx(void);
  58. void abi_test_clobber_rdx(void);
  59. void abi_test_clobber_rsi(void);
  60. void abi_test_clobber_rdi(void);
  61. void abi_test_clobber_rbp(void);
  62. void abi_test_clobber_r8(void);
  63. void abi_test_clobber_r9(void);
  64. void abi_test_clobber_r10(void);
  65. void abi_test_clobber_r11(void);
  66. void abi_test_clobber_r12(void);
  67. void abi_test_clobber_r13(void);
  68. void abi_test_clobber_r14(void);
  69. void abi_test_clobber_r15(void);
  70. void abi_test_clobber_xmm0(void);
  71. void abi_test_clobber_xmm1(void);
  72. void abi_test_clobber_xmm2(void);
  73. void abi_test_clobber_xmm3(void);
  74. void abi_test_clobber_xmm4(void);
  75. void abi_test_clobber_xmm5(void);
  76. void abi_test_clobber_xmm6(void);
  77. void abi_test_clobber_xmm7(void);
  78. void abi_test_clobber_xmm8(void);
  79. void abi_test_clobber_xmm9(void);
  80. void abi_test_clobber_xmm10(void);
  81. void abi_test_clobber_xmm11(void);
  82. void abi_test_clobber_xmm12(void);
  83. void abi_test_clobber_xmm13(void);
  84. void abi_test_clobber_xmm14(void);
  85. void abi_test_clobber_xmm15(void);
  86. } // extern "C"
  87. TEST(ABITest, X86_64) {
  88. // abi_test_trampoline hides unsaved registers from the caller, so we can
  89. // safely call the abi_test_clobber_* functions below.
  90. abi_test::internal::CallerState state;
  91. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  92. CHECK_ABI_NO_UNWIND(abi_test_trampoline,
  93. reinterpret_cast<crypto_word_t>(abi_test_clobber_rbx),
  94. &state, nullptr, 0, 0 /* no breakpoint */);
  95. CHECK_ABI_NO_UNWIND(abi_test_clobber_rax);
  96. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rbx),
  97. "rbx was not restored after return");
  98. CHECK_ABI_NO_UNWIND(abi_test_clobber_rcx);
  99. CHECK_ABI_NO_UNWIND(abi_test_clobber_rdx);
  100. #if defined(OPENSSL_WINDOWS)
  101. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rdi),
  102. "rdi was not restored after return");
  103. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rsi),
  104. "rsi was not restored after return");
  105. #else
  106. CHECK_ABI_NO_UNWIND(abi_test_clobber_rdi);
  107. CHECK_ABI_NO_UNWIND(abi_test_clobber_rsi);
  108. #endif
  109. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rbp),
  110. "rbp was not restored after return");
  111. CHECK_ABI_NO_UNWIND(abi_test_clobber_r8);
  112. CHECK_ABI_NO_UNWIND(abi_test_clobber_r9);
  113. CHECK_ABI_NO_UNWIND(abi_test_clobber_r10);
  114. CHECK_ABI_NO_UNWIND(abi_test_clobber_r11);
  115. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r12),
  116. "r12 was not restored after return");
  117. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r13),
  118. "r13 was not restored after return");
  119. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r14),
  120. "r14 was not restored after return");
  121. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r15),
  122. "r15 was not restored after return");
  123. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm0);
  124. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm1);
  125. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm2);
  126. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm3);
  127. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm4);
  128. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm5);
  129. #if defined(OPENSSL_WINDOWS)
  130. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6),
  131. "xmm6 was not restored after return");
  132. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7),
  133. "xmm7 was not restored after return");
  134. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm8),
  135. "xmm8 was not restored after return");
  136. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm9),
  137. "xmm9 was not restored after return");
  138. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm10),
  139. "xmm10 was not restored after return");
  140. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm11),
  141. "xmm11 was not restored after return");
  142. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm12),
  143. "xmm12 was not restored after return");
  144. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm13),
  145. "xmm13 was not restored after return");
  146. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm14),
  147. "xmm14 was not restored after return");
  148. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm15),
  149. "xmm15 was not restored after return");
  150. #else
  151. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6);
  152. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7);
  153. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm8);
  154. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm9);
  155. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm10);
  156. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm11);
  157. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm12);
  158. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm13);
  159. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm14);
  160. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm15);
  161. #endif
  162. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_set_direction_flag),
  163. "Direction flag set after return");
  164. EXPECT_EQ(0, abi_test_get_and_clear_direction_flag())
  165. << "CHECK_ABI did not insulate the caller from direction flag errors";
  166. }
  167. #if defined(OPENSSL_WINDOWS)
  168. static void ThrowWindowsException() {
  169. DebugBreak();
  170. }
  171. static void ExceptionTest() {
  172. bool handled = false;
  173. __try {
  174. CHECK_ABI_NO_UNWIND(ThrowWindowsException);
  175. } __except (GetExceptionCode() == EXCEPTION_BREAKPOINT
  176. ? EXCEPTION_EXECUTE_HANDLER
  177. : EXCEPTION_CONTINUE_SEARCH) {
  178. handled = true;
  179. }
  180. EXPECT_TRUE(handled);
  181. }
  182. // Test that the trampoline's SEH metadata works.
  183. TEST(ABITest, TrampolineSEH) {
  184. // Wrap the test in |CHECK_ABI|, to confirm the register-restoring annotations
  185. // were correct.
  186. CHECK_ABI_NO_UNWIND(ExceptionTest);
  187. }
  188. #endif // OPENSSL_WINDOWS
  189. #endif // OPENSSL_X86_64 && SUPPORTS_ABI_TEST
  190. #if defined(OPENSSL_X86) && defined(SUPPORTS_ABI_TEST)
  191. extern "C" {
  192. void abi_test_clobber_eax(void);
  193. void abi_test_clobber_ebx(void);
  194. void abi_test_clobber_ecx(void);
  195. void abi_test_clobber_edx(void);
  196. void abi_test_clobber_esi(void);
  197. void abi_test_clobber_edi(void);
  198. void abi_test_clobber_ebp(void);
  199. void abi_test_clobber_xmm0(void);
  200. void abi_test_clobber_xmm1(void);
  201. void abi_test_clobber_xmm2(void);
  202. void abi_test_clobber_xmm3(void);
  203. void abi_test_clobber_xmm4(void);
  204. void abi_test_clobber_xmm5(void);
  205. void abi_test_clobber_xmm6(void);
  206. void abi_test_clobber_xmm7(void);
  207. } // extern "C"
  208. TEST(ABITest, X86) {
  209. // abi_test_trampoline hides unsaved registers from the caller, so we can
  210. // safely call the abi_test_clobber_* functions below.
  211. abi_test::internal::CallerState state;
  212. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  213. CHECK_ABI_NO_UNWIND(abi_test_trampoline,
  214. reinterpret_cast<crypto_word_t>(abi_test_clobber_ebx),
  215. &state, nullptr, 0, 0 /* no breakpoint */);
  216. CHECK_ABI_NO_UNWIND(abi_test_clobber_eax);
  217. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebx),
  218. "ebx was not restored after return");
  219. CHECK_ABI_NO_UNWIND(abi_test_clobber_ecx);
  220. CHECK_ABI_NO_UNWIND(abi_test_clobber_edx);
  221. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_edi),
  222. "edi was not restored after return");
  223. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_esi),
  224. "esi was not restored after return");
  225. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebp),
  226. "ebp was not restored after return");
  227. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm0);
  228. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm1);
  229. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm2);
  230. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm3);
  231. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm4);
  232. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm5);
  233. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6);
  234. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7);
  235. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_set_direction_flag),
  236. "Direction flag set after return");
  237. EXPECT_EQ(0, abi_test_get_and_clear_direction_flag())
  238. << "CHECK_ABI did not insulate the caller from direction flag errors";
  239. }
  240. #endif // OPENSSL_X86 && SUPPORTS_ABI_TEST