Coverage Report

Created: 2024-10-17 06:29

/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