/src/hbfa-fl/HBFA/UefiHostFuzzTestPkg/Library/ToolChainHarnessLib/ToolChainHarnessLib.c
Line | Count | Source (jump to first uncovered line) |
1 | | /** @file |
2 | | |
3 | | Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> |
4 | | SPDX-License-Identifier: BSD-2-Clause-Patent |
5 | | |
6 | | **/ |
7 | | |
8 | | #include <stdio.h> |
9 | | #include <stdlib.h> |
10 | | #include <string.h> |
11 | | #include <assert.h> |
12 | | |
13 | | #include <Uefi.h> |
14 | | |
15 | | #include <Library/BaseLib.h> |
16 | | #include <Library/BaseMemoryLib.h> |
17 | | #include <Library/MemoryAllocationLib.h> |
18 | | #include <Library/ToolChainHarnessLib.h> |
19 | | |
20 | | #ifdef TEST_WITH_INSTRUMENT |
21 | | #include <Library/InstrumentHookLib.h> |
22 | | #endif |
23 | | |
24 | | #ifdef TEST_WITH_LIBFUZZER |
25 | | #include <stdint.h> |
26 | | #include <stddef.h> |
27 | | #endif |
28 | | |
29 | | #ifdef TEST_WITH_KLEE |
30 | | #include <klee/klee.h> |
31 | | #endif |
32 | | |
33 | | // TODO: xxx Improve coding style: naming, data type, etc |
34 | | |
35 | | #ifdef TEST_WITH_INSTRUMENT |
36 | | VOID |
37 | | ReadInstrumentProfile ( |
38 | | IN CHAR8 *FileName |
39 | | ) |
40 | | { |
41 | | VOID *Buffer; |
42 | | |
43 | | FILE *f = fopen(FileName, "rb"); |
44 | | if (f==NULL) { |
45 | | fputs ("File error",stderr); |
46 | | exit (1); |
47 | | } |
48 | | fseek(f, 0, SEEK_END); |
49 | | |
50 | | UINTN fsize = ftell(f); |
51 | | rewind(f); |
52 | | |
53 | | Buffer = malloc (fsize); |
54 | | size_t bytes_read = fread((void *)Buffer, 1, fsize, f); |
55 | | if ((UINTN)bytes_read!=fsize) { |
56 | | fputs ("File error",stderr); |
57 | | exit (1); |
58 | | } |
59 | | fclose(f); |
60 | | |
61 | | InstrumentHookLibInit (Buffer, fsize); |
62 | | } |
63 | | #endif |
64 | | |
65 | | VOID |
66 | | InitTestBuffer ( |
67 | | int argc, |
68 | | char **argv, |
69 | | IN UINTN MaxBufferSize, |
70 | | IN VOID **TestBuffer, |
71 | | OUT UINTN *BufferSize |
72 | | ) |
73 | 0 | { |
74 | | // 1. Allocate buffer |
75 | 0 | VOID *Buffer = AllocatePool (MaxBufferSize); |
76 | | |
77 | | // 2. Assign to TestBuffer and BufferSize |
78 | 0 | *TestBuffer = Buffer; |
79 | 0 | if (BufferSize != NULL) { |
80 | 0 | *BufferSize = MaxBufferSize; |
81 | 0 | } else { |
82 | 0 | printf ("error - Null pointer for Buffersize"); |
83 | 0 | exit(1); |
84 | 0 | } |
85 | | |
86 | | // 3. Initialize TestBuffer |
87 | | #ifdef TEST_WITH_KLEE |
88 | | // 3.1 For test with KLEE: write symbolic values to TestBuffer |
89 | | klee_make_symbolic((UINT8 *)Buffer, MaxBufferSize, "Buffer"); |
90 | | return; |
91 | | #endif |
92 | | |
93 | | // 3.2 For other tests: read values from file to TestBuffer |
94 | | // (may also update the value of BufferSize) |
95 | 0 | if (argc == 1) { |
96 | 0 | printf ("error - missing input file\n"); |
97 | 0 | exit(1); |
98 | 0 | } |
99 | 0 | CHAR8 *FileName = argv[1]; |
100 | |
|
101 | 0 | FILE *f = fopen(FileName, "rb"); |
102 | 0 | if (f==NULL) { |
103 | 0 | fputs ("File error",stderr); |
104 | 0 | exit (1); |
105 | 0 | } |
106 | 0 | fseek(f, 0, SEEK_END); |
107 | |
|
108 | 0 | UINTN fsize = ftell(f); |
109 | 0 | rewind(f); |
110 | |
|
111 | 0 | fsize = fsize > MaxBufferSize ? MaxBufferSize : fsize; |
112 | 0 | size_t bytes_read = fread((void *)Buffer, 1, fsize, f); |
113 | 0 | if ((UINTN)bytes_read!=fsize) { |
114 | 0 | fputs ("File error",stderr); |
115 | 0 | exit (1); |
116 | 0 | } |
117 | 0 | fclose(f); |
118 | 0 | if (BufferSize != NULL) { |
119 | 0 | *BufferSize = fsize; |
120 | 0 | } else { |
121 | 0 | printf ("error - Null pointer for Buffersize"); |
122 | 0 | exit(1); |
123 | 0 | } |
124 | | |
125 | | // 3.3 For ErrorInjection: read instrument profile for initialization |
126 | | #ifdef TEST_WITH_INSTRUMENT |
127 | | if (argc >= 3) { |
128 | | ReadInstrumentProfile (argv[2]); |
129 | | } |
130 | | #endif |
131 | 0 | } |
132 | | |
133 | | #ifdef TEST_WITH_LIBFUZZER |
134 | 3.23k | int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
135 | 3.23k | VOID *TestBuffer; |
136 | 3.23k | UINTN MaxBufferSize; |
137 | | |
138 | | // 1. Initialize TestBuffer |
139 | 3.23k | MaxBufferSize = GetMaxBufferSize(); |
140 | 3.23k | TestBuffer = AllocateZeroPool (MaxBufferSize); |
141 | 3.23k | if (Size > MaxBufferSize) { |
142 | 40 | Size = MaxBufferSize; |
143 | 40 | } |
144 | 3.23k | CopyMem (TestBuffer, Data, Size); |
145 | | // 2. Run test |
146 | 3.23k | RunTestHarness(TestBuffer, Size); |
147 | | // 3. Clean up |
148 | 3.23k | FreePool (TestBuffer); |
149 | 3.23k | return 0; |
150 | 3.23k | } |
151 | | #else |
152 | | #ifdef TEST_WITH_LIBFUZZERWIN |
153 | | int LLVMFuzzerTestOneInput(const wint_t *Data, size_t Size) { |
154 | | VOID *TestBuffer; |
155 | | UINTN MaxBufferSize; |
156 | | |
157 | | // 1. Initialize TestBuffer |
158 | | MaxBufferSize = GetMaxBufferSize(); |
159 | | TestBuffer = AllocateZeroPool (MaxBufferSize); |
160 | | if (Size > MaxBufferSize) { |
161 | | Size = MaxBufferSize; |
162 | | } |
163 | | CopyMem (TestBuffer, Data, Size); |
164 | | // 2. Run test |
165 | | RunTestHarness(TestBuffer, Size); |
166 | | // 3. Clean up |
167 | | FreePool (TestBuffer); |
168 | | return 0; |
169 | | } |
170 | | #else |
171 | | int main(int argc, char **argv) |
172 | | { |
173 | | VOID *TestBuffer; |
174 | | UINTN TestBufferSize; |
175 | | |
176 | | // 1. Initialize TestBuffer |
177 | | InitTestBuffer (argc, argv, GetMaxBufferSize(), &TestBuffer, &TestBufferSize); |
178 | | // 2. Run test |
179 | | RunTestHarness(TestBuffer, TestBufferSize); |
180 | | // 3. Clean up |
181 | | FreePool (TestBuffer); |
182 | | return 0; |
183 | | } |
184 | | #endif |
185 | | #endif |