diff options
Diffstat (limited to 'custom_mutators/radamsa/libradamsa-test.c')
-rw-r--r-- | custom_mutators/radamsa/libradamsa-test.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/custom_mutators/radamsa/libradamsa-test.c b/custom_mutators/radamsa/libradamsa-test.c new file mode 100644 index 00000000..8a45f9b2 --- /dev/null +++ b/custom_mutators/radamsa/libradamsa-test.c @@ -0,0 +1,81 @@ +#include <radamsa.h> +#include <stdio.h> +#include <inttypes.h> +#include <string.h> +#include <stdlib.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/stat.h> + +size_t filesize(char *filename) { + + struct stat st; + stat(filename, &st); + return st.st_size; + +} + +#define BUFSIZE 1024 * 1024 + +void fail(char *why) { + + printf("fail: %s\n", why); + exit(1); + +} + +void write_output(char *data, size_t len, int num) { + + char path[32]; + int fd; + int wrote; + sprintf(path, "/tmp/libradamsa-%d.fuzz", num); + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + printf("Opened %s -> %d\n", path, fd); + if (fd < 0) { fail("failed to open output file"); } + wrote = write(fd, data, len); + printf("wrote %d of %zu bytes\n", wrote, len); + if (wrote != len) { fail("failed to write all of output at once"); } + close(fd); + printf("Wrote %zu bytes to %s\n", len, path); + +} + +int main(int nargs, char **argv) { + + char * spath = argv[1]; + int fd = open(spath, O_RDONLY, 0); + size_t len; + char * input; + char * output; + int seed = 0; + if (fd < 0) { fail("cannot open input file"); } + len = filesize(spath); + input = malloc(len); + output = malloc(BUFSIZE); + if (!input || !output) { fail("failed to allocate buffers\n"); } + radamsa_init(); + if (len != read(fd, input, len)) { + + fail("failed to read the entire sample at once"); + + } + + while (seed++ < 100) { + + size_t n; + n = radamsa((uint8_t *)input, len, (uint8_t *)output, BUFSIZE, seed); + write_output(output, n, seed); + printf("Fuzzed %zu -> %zu bytes\n", len, n); + + } + + printf("library test passed\n"); + free(output); + free(input); + return 0; + +} + |