xref: /third_party/mbedtls/programs/fuzz/onefile.c (revision a8e1175b)
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
10int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
11
12int 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