xref: /aosp_15_r20/external/mbedtls/programs/fuzz/onefile.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1 #include <stdint.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 
5 /* This file doesn't use any Mbed TLS function, but grab mbedtls_config.h anyway
6  * in case it contains platform-specific #defines related to malloc or
7  * stdio functions. */
8 #include "mbedtls/build_info.h"
9 
10 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
11 
main(int argc,char ** argv)12 int main(int argc, char **argv)
13 {
14     FILE *fp;
15     uint8_t *Data;
16     size_t Size;
17     const char *argv0 = argv[0] == NULL ? "PROGRAM_NAME" : argv[0];
18 
19     if (argc != 2) {
20         fprintf(stderr, "Usage: %s REPRODUCER_FILE\n", argv0);
21         return 1;
22     }
23     //opens the file, get its size, and reads it into a buffer
24     fp = fopen(argv[1], "rb");
25     if (fp == NULL) {
26         fprintf(stderr, "%s: Error in fopen\n", argv0);
27         perror(argv[1]);
28         return 2;
29     }
30     if (fseek(fp, 0L, SEEK_END) != 0) {
31         fprintf(stderr, "%s: Error in fseek(SEEK_END)\n", argv0);
32         perror(argv[1]);
33         fclose(fp);
34         return 2;
35     }
36     Size = ftell(fp);
37     if (Size == (size_t) -1) {
38         fprintf(stderr, "%s: Error in ftell\n", argv0);
39         perror(argv[1]);
40         fclose(fp);
41         return 2;
42     }
43     if (fseek(fp, 0L, SEEK_SET) != 0) {
44         fprintf(stderr, "%s: Error in fseek(0)\n", argv0);
45         perror(argv[1]);
46         fclose(fp);
47         return 2;
48     }
49     Data = malloc(Size);
50     if (Data == NULL) {
51         fprintf(stderr, "%s: Could not allocate memory\n", argv0);
52         perror(argv[1]);
53         fclose(fp);
54         return 2;
55     }
56     if (fread(Data, Size, 1, fp) != 1) {
57         fprintf(stderr, "%s: Error in fread\n", argv0);
58         perror(argv[1]);
59         free(Data);
60         fclose(fp);
61         return 2;
62     }
63 
64     //launch fuzzer
65     LLVMFuzzerTestOneInput(Data, Size);
66     free(Data);
67     fclose(fp);
68     return 0;
69 }
70