summaryrefslogtreecommitdiff
path: root/fuzz/libtasn1_array2tree_fuzzer.c
diff options
context:
space:
mode:
Diffstat (limited to 'fuzz/libtasn1_array2tree_fuzzer.c')
-rw-r--r--fuzz/libtasn1_array2tree_fuzzer.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/fuzz/libtasn1_array2tree_fuzzer.c b/fuzz/libtasn1_array2tree_fuzzer.c
new file mode 100644
index 0000000..74b95dd
--- /dev/null
+++ b/fuzz/libtasn1_array2tree_fuzzer.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright(c) 2019 Free Software Foundation, Inc.
+ *
+ * This file is part of libtasn1.
+ *
+ * Libtasn1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Libtasn1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libtasn1. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * This fuzzer is testing asn1_array2tree()'s robustness with arbitrary
+ * input data.
+ */
+
+#include <config.h>
+
+#include <assert.h> /* assert */
+#include <stdlib.h> /* malloc, free */
+#include <string.h> /* memcpy */
+
+#include "libtasn1.h"
+#include "fuzzer.h"
+
+const asn1_static_node pkix_asn1_tab[] = {
+ {"PKIX1Implicit88", 536875024, NULL},
+ {NULL, 0, NULL}
+};
+
+#define NAMESIZE 20
+#define VALUESIZE 20
+struct fuzz_elem
+{
+ unsigned int type;
+ char name[NAMESIZE];
+ char value[VALUESIZE];
+};
+
+#define MAXELEM 100
+#define MAXDATASIZE (100 * sizeof(struct fuzz_elem))
+
+int
+LLVMFuzzerTestOneInput (const uint8_t * data, size_t size)
+{
+ if (size > MAXDATASIZE) /* same as max_len = <MAXDATASIZE> in .options file */
+ return 0;
+
+ struct fuzz_elem *elem = (struct fuzz_elem *) malloc (size);
+ assert (elem != NULL);
+ memcpy (elem, data, size);
+
+ int nelem = size / sizeof (struct fuzz_elem);
+ asn1_static_node tab[MAXELEM + 1]; /* avoid VLA here */
+ int it;
+
+ for (it = 0; it < nelem; it++)
+ {
+ tab[it].type = elem[it].type;
+ elem[it].name[NAMESIZE - 1] = 0;
+ if (strcmp (elem[it].name, "NULL"))
+ tab[it].name = elem[it].name;
+ else
+ tab[it].name = NULL;
+ elem[it].value[VALUESIZE - 1] = 0;
+ if (strcmp (elem[it].value, "NULL"))
+ tab[it].value = elem[it].value;
+ else
+ tab[it].value = NULL;
+ }
+
+ /* end-of-array indicator */
+ tab[nelem].type = 0;
+ tab[nelem].name = NULL;
+ tab[nelem].value = NULL;
+
+ int result;
+ asn1_node node = NULL;
+ char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
+
+ result = asn1_array2tree (tab, &node, errorDescription);
+
+ if (result == ASN1_SUCCESS)
+ asn1_delete_structure (&node);
+
+ free (elem);
+
+ return 0;
+}