about summary refs log tree commit diff
path: root/custom_mutators/radamsa/libradamsa-test.c
blob: 8a45f9b2df5d634aa350f2f8291f7b52fa7305e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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;

}