Branch data Line data Source code
1 : : /* Copyright (c) 2020, Red Hat, Inc.
2 : : *
3 : : * Authors: Jakub Jelen <jjelen@redhat.com>
4 : : *
5 : : * This code is licensed under the GNU LGPL, version 2.1 or later.
6 : : * See the COPYING file in the top-level directory.
7 : : */
8 : :
9 : : #include <stdlib.h>
10 : : #include <string.h>
11 : : #include <libcacard.h>
12 : :
13 : : #include "fuzzer.h"
14 : : #include "vcard_emul_type.h"
15 : :
16 : : /* Copied internal structures from vcard_emul_nss.c */
17 : : struct VirtualReaderOptionsStruct {
18 : : char *name;
19 : : char *vname;
20 : : VCardEmulType card_type;
21 : : char *type_params;
22 : : char **cert_name;
23 : : int cert_count;
24 : : };
25 : :
26 : : struct VCardEmulOptionsStruct {
27 : : char *nss_db;
28 : : struct VirtualReaderOptionsStruct *vreader;
29 : : int vreader_count;
30 : : VCardEmulType hw_card_type;
31 : : char *hw_type_params;
32 : : int use_hw;
33 : : };
34 : :
35 : : /* We do not want to fuzz inputs longer than 1024 bytes to avoid need for
36 : : * dynamic reallocation inside of the fuzzer. Anything longer should be
37 : : * possible to express with shorter strings
38 : : */
39 : : size_t kMaxInputLength = 1024;
40 : :
41 : 1 : int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
42 : : {
43 : : int i, j;
44 : : VCardEmulOptions *options = NULL;
45 : : struct VCardEmulOptionsStruct *my_options = NULL;
46 : : char args[1025];
47 : :
48 [ - + ]: 1 : if (Size > kMaxInputLength) {
49 : 0 : g_debug("Too long input option");
50 : 0 : return 0;
51 : : }
52 : :
53 : 1 : memcpy(args, Data, Size);
54 : 1 : args[Size] = '\0';
55 : 1 : options = vcard_emul_options(args);
56 [ - + ]: 1 : if (options == NULL) {
57 : : /* Invalid input -- the function should have cleaned up for itself */
58 : : return 0;
59 : : }
60 : :
61 : : /* There is no sensible way to free options if they were valid */
62 : : my_options = (struct VCardEmulOptionsStruct *)options;
63 [ # # ]: 0 : for (i = 0; i < my_options->vreader_count; i++) {
64 : 0 : g_free(my_options->vreader[i].name);
65 : 0 : g_free(my_options->vreader[i].vname);
66 : 0 : g_free(my_options->vreader[i].type_params);
67 [ # # ]: 0 : for (j = 0; j < my_options->vreader[i].cert_count; j++) {
68 : 0 : g_free(my_options->vreader[i].cert_name[j]);
69 : : }
70 : 0 : g_free(my_options->vreader[i].cert_name);
71 : : }
72 : 0 : g_free(my_options->vreader);
73 : 0 : g_free(my_options->hw_type_params);
74 : 0 : g_free(my_options->nss_db);
75 : : /* The invalid pointers will be overwritten on next call to parse the options */
76 : :
77 : 0 : return 0;
78 : : }
79 : :
80 : : /* vim: set ts=4 sw=4 tw=0 noet expandtab: */
|