diff options
Diffstat (limited to 'src/third_party/libradamsa/libradamsa-test.c')
-rw-r--r-- | src/third_party/libradamsa/libradamsa-test.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/third_party/libradamsa/libradamsa-test.c b/src/third_party/libradamsa/libradamsa-test.c new file mode 100644 index 00000000..793c059d --- /dev/null +++ b/src/third_party/libradamsa/libradamsa-test.c @@ -0,0 +1,75 @@ +#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"); + } + 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; +} + |