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