OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
TestNtfsDxe.c
Go to the documentation of this file.
1
6#include <NTFS.h>
7#include <Helper.h>
8
9#include <UserFile.h>
10#include <UserGlobalVar.h>
11
14CONST UINT8 *mFuzzPointer;
15
16EFI_STATUS
17EFIAPI
19 IN EFI_DISK_IO_PROTOCOL *This,
20 IN UINT32 MediaId,
21 IN UINT64 Offset,
22 IN UINTN BufferSize,
23 OUT VOID *Buffer
24 )
25{
26 if (Buffer == NULL) {
27 return EFI_INVALID_PARAMETER;
28 }
29
30 if ((mFuzzSize - mFuzzOffset) < BufferSize) {
31 return EFI_OUT_OF_RESOURCES;
32 }
33
34 CopyMem (Buffer, mFuzzPointer, BufferSize);
35 mFuzzPointer += BufferSize;
36 mFuzzOffset += BufferSize;
37
38 return EFI_SUCCESS;
39}
40
41VOID
43 IN CHAR16 *FileName,
44 IN EFI_FS *Instance
45 )
46{
47 FreePool (FileName);
48
49 if (Instance != NULL) {
50 if (Instance->DiskIo != NULL) {
51 FreePool (Instance->DiskIo);
52 }
53
54 if (Instance->BlockIo != NULL) {
55 if (Instance->BlockIo->Media != NULL) {
56 FreePool (Instance->BlockIo->Media);
57 }
58
59 FreePool (Instance->BlockIo);
60 }
61
62 if (Instance->RootIndex != NULL) {
63 FreeAttr (&Instance->RootIndex->Attr);
64 FreeAttr (&Instance->MftStart->Attr);
65 FreePool (Instance->RootIndex->FileRecord);
66 FreePool (Instance->MftStart->FileRecord);
67 FreePool (Instance->RootIndex->File);
68 }
69
70 FreePool (Instance);
71 }
72}
73
74INT32
76 CONST UINT8 *FuzzData,
77 UINTN FuzzSize
78 )
79{
80 EFI_STATUS Status;
81 EFI_FS *Instance;
82 EFI_FILE_PROTOCOL *This;
83 UINTN BufferSize;
84 VOID *Buffer;
85 VOID *TmpBuffer;
86 EFI_FILE_PROTOCOL *NewHandle;
87 CHAR16 *FileName;
88 VOID *Info;
89 UINTN Len;
90 UINT64 Position;
91
92 mFuzzOffset = 0;
93 mFuzzPointer = FuzzData;
94 mFuzzSize = FuzzSize;
95
96 Instance = NULL;
97 BufferSize = 100;
98
99 //
100 // Construct File Name
101 //
102 FileName = AllocateZeroPool (BufferSize);
103 if (FileName == NULL) {
104 return 0;
105 }
106
107 ASAN_CHECK_MEMORY_REGION (FileName, BufferSize);
108
109 if ((mFuzzSize - mFuzzOffset) < BufferSize) {
110 FreeAll (FileName, Instance);
111 return 0;
112 }
113
114 CopyMem (FileName, mFuzzPointer, BufferSize - 2);
115 mFuzzPointer += BufferSize - 2;
116 mFuzzOffset += BufferSize - 2;
117
118 //
119 // Construct File System
120 //
121 Instance = AllocateZeroPool (sizeof (EFI_FS));
122 if (Instance == NULL) {
123 FreeAll (FileName, Instance);
124 return 0;
125 }
126
127 ASAN_CHECK_MEMORY_REGION (Instance, sizeof (EFI_FS));
128
129 Instance->DiskIo = AllocateZeroPool (sizeof (EFI_DISK_IO_PROTOCOL));
130 if (Instance->DiskIo == NULL) {
131 FreeAll (FileName, Instance);
132 return 0;
133 }
134
135 ASAN_CHECK_MEMORY_REGION (Instance->DiskIo, sizeof (EFI_DISK_IO_PROTOCOL));
136
137 Instance->DiskIo->ReadDisk = FuzzReadDisk;
138
139 Instance->BlockIo = AllocateZeroPool (sizeof (EFI_BLOCK_IO_PROTOCOL));
140 if (Instance->BlockIo == NULL) {
141 FreeAll (FileName, Instance);
142 return 0;
143 }
144
145 ASAN_CHECK_MEMORY_REGION (Instance->BlockIo, sizeof (EFI_BLOCK_IO_PROTOCOL));
146
147 Instance->BlockIo->Media = AllocateZeroPool (sizeof (EFI_BLOCK_IO_MEDIA));
148 if (Instance->BlockIo->Media == NULL) {
149 FreeAll (FileName, Instance);
150 return 0;
151 }
152
153 ASAN_CHECK_MEMORY_REGION (Instance->BlockIo->Media, sizeof (EFI_BLOCK_IO_MEDIA));
154
155 Instance->EfiFile.Revision = EFI_FILE_PROTOCOL_REVISION2;
156 Instance->EfiFile.Open = FileOpen;
157 Instance->EfiFile.Close = FileClose;
158 Instance->EfiFile.Delete = FileDelete;
159 Instance->EfiFile.Read = FileRead;
160 Instance->EfiFile.Write = FileWrite;
161 Instance->EfiFile.GetPosition = FileGetPosition;
162 Instance->EfiFile.SetPosition = FileSetPosition;
163 Instance->EfiFile.GetInfo = FileGetInfo;
164 Instance->EfiFile.SetInfo = FileSetInfo;
165 Instance->EfiFile.Flush = FileFlush;
166
167 Status = NtfsMount (Instance);
168 if (EFI_ERROR (Status)) {
169 FreeAll (FileName, Instance);
170 return 0;
171 }
172
173 This = (EFI_FILE_PROTOCOL *)Instance->RootIndex->File;
174
175 //
176 // Test Ntfs Driver
177 //
178 Status = FileOpen (This, &NewHandle, FileName, EFI_FILE_MODE_READ, 0);
179 if (Status == EFI_SUCCESS) {
180 Buffer = AllocateZeroPool (100);
181 BufferSize = 100;
182 if (Buffer == NULL) {
183 FreeAll (FileName, Instance);
184 return 0;
185 }
186
187 Status = FileRead (NewHandle, &BufferSize, Buffer);
188 if (Status == EFI_BUFFER_TOO_SMALL) {
189 TmpBuffer = ReallocatePool (100, BufferSize, Buffer);
190 if (TmpBuffer == NULL) {
191 FreePool (Buffer);
192 FreeAll (FileName, Instance);
193 return 0;
194 }
195
196 Buffer = TmpBuffer;
197
198 ASAN_CHECK_MEMORY_REGION (Buffer, BufferSize);
199
200 FileRead (NewHandle, &BufferSize, Buffer);
201 }
202
203 FileWrite (NewHandle, &BufferSize, Buffer);
204
205 FileFlush (NewHandle);
206
207 FreePool (Buffer);
208
209 Len = 0;
210 Info = NULL;
211 Status = FileGetInfo (NewHandle, &gEfiFileInfoGuid, &Len, Info);
212 if (Status == EFI_BUFFER_TOO_SMALL) {
213 Info = AllocateZeroPool (Len);
214 if (Info == NULL) {
215 FreeAll (FileName, Instance);
216 return 0;
217 }
218
219 FileGetInfo (NewHandle, &gEfiFileInfoGuid, &Len, Info);
220 FreePool (Info);
221 }
222
223 Len = 0;
224 Status = FileGetInfo (NewHandle, &gEfiFileSystemInfoGuid, &Len, Info);
225 if (Status == EFI_BUFFER_TOO_SMALL) {
226 Info = AllocateZeroPool (Len);
227 if (Info == NULL) {
228 FreeAll (FileName, Instance);
229 return 0;
230 }
231
232 FileGetInfo (NewHandle, &gEfiFileSystemInfoGuid, &Len, Info);
233 FreePool (Info);
234 }
235
236 Len = 0;
237 Status = FileGetInfo (NewHandle, &gEfiFileSystemVolumeLabelInfoIdGuid, &Len, Info);
238 if (Status == EFI_BUFFER_TOO_SMALL) {
239 Info = AllocateZeroPool (Len);
240 if (Info == NULL) {
241 FreeAll (FileName, Instance);
242 return 0;
243 }
244
246 FreePool (Info);
247 }
248
250
251 FileGetPosition (NewHandle, &Position);
252 while (!EFI_ERROR (FileSetPosition (NewHandle, Position))) {
253 ++Position;
254 }
255
256 FileDelete (NewHandle);
257 }
258
259 FreeAll (FileName, Instance);
260
261 return 0;
262}
263
264int
266 int argc,
267 char **argv
268 )
269{
270 uint32_t f;
271 uint8_t *b;
272
273 if ((b = UserReadFile ((argc > 1) ? argv[1] : "in.bin", &f)) == NULL) {
274 DEBUG ((DEBUG_ERROR, "Read fail\n"));
275 return -1;
276 }
277
279 FreePool (b);
280 return 0;
281}
VOID FreeAttr(IN NTFS_ATTR *Attr)
Definition Disc.c:792
EFI_STATUS NtfsMount(IN EFI_FS *FileSystem)
Definition Disc.c:94
EFI_STATUS EFIAPI FileSetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer)
Definition Info.c:243
EFI_STATUS EFIAPI FileGetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *Type, IN OUT UINTN *Len, OUT VOID *Data)
Definition Info.c:104
EFI_STATUS EFIAPI FileClose(IN EFI_FILE_PROTOCOL *This)
Definition Open.c:353
EFI_STATUS EFIAPI FileFlush(IN EFI_FILE_PROTOCOL *This)
Definition Open.c:344
EFI_STATUS EFIAPI FileDelete(IN EFI_FILE_PROTOCOL *This)
Definition Open.c:333
EFI_STATUS EFIAPI FileSetPosition(IN EFI_FILE_PROTOCOL *This, IN UINT64 Position)
Definition Position.c:33
EFI_STATUS EFIAPI FileOpen(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
Definition Open.c:16
EFI_STATUS EFIAPI FileWrite(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, IN VOID *Buffer)
Definition Open.c:322
EFI_STATUS EFIAPI FileGetPosition(IN EFI_FILE_PROTOCOL *This, OUT UINT64 *Position)
Definition Position.c:14
EFI_STATUS EFIAPI FileRead(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition Open.c:299
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
EFI_STATUS EFIAPI FuzzReadDisk(IN EFI_DISK_IO_PROTOCOL *This, IN UINT32 MediaId, IN UINT64 Offset, IN UINTN BufferSize, OUT VOID *Buffer)
Definition TestNtfsDxe.c:18
CONST UINT8 * mFuzzPointer
Definition TestNtfsDxe.c:14
VOID FreeAll(IN CHAR16 *FileName, IN EFI_FS *Instance)
Definition TestNtfsDxe.c:42
INT32 LLVMFuzzerTestOneInput(CONST UINT8 *FuzzData, UINTN FuzzSize)
Definition TestNtfsDxe.c:75
UINTN mFuzzSize
Definition TestNtfsDxe.c:13
UINTN mFuzzOffset
Definition TestNtfsDxe.c:12
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
UINT8 * UserReadFile(IN CONST CHAR8 *FileName, OUT UINT32 *Size)
Definition UserFile.c:62
EFI_GUID gEfiFileInfoGuid
EFI_GUID gEfiFileSystemInfoGuid
#define ASAN_CHECK_MEMORY_REGION(addr, size)
EFI_GUID gEfiFileSystemVolumeLabelInfoIdGuid
#define Len
Definition deflate.h:82
UINT8 uint8_t
UINT32 uint32_t
int ENTRY_POINT(void)
EFI_FILE_PROTOCOL EfiFile
Definition Driver.h:641
EFI_DISK_IO_PROTOCOL * DiskIo
Definition Driver.h:643
EFI_BLOCK_IO_PROTOCOL * BlockIo
Definition Driver.h:642
NTFS_FILE * RootIndex
Definition Driver.h:646
EFI_NTFS_FILE * File
Definition Driver.h:623