X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Ftests%2Ffuzzer.c;fp=direct%2Ftests%2Ffuzzer.c;h=fed272a89fcc9bcc8143bf1b68792ba61fc93049;hp=0000000000000000000000000000000000000000;hb=5a7a15b0b01076e7f96a354e2999f8dcf2e6d28b;hpb=67569fb38f4d6cdf299a44ad864fdff7fd8e8742 diff --git a/direct/tests/fuzzer.c b/direct/tests/fuzzer.c new file mode 100644 index 0000000..fed272a --- /dev/null +++ b/direct/tests/fuzzer.c @@ -0,0 +1,75 @@ +/* + * Fuzzer to fuzz a file + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int prob = 10000; + int h; + int flen = 0; + int changesPerBuffer = 0; + int b; + char c; + unsigned char buffer[1000000]; + int bufsize; + int x; + int i; + int nbuffers; + + while((c = getopt(argc,argv,"p:")) != -1){ + switch(c){ + case 'p': + prob = atoi(optarg); + break; + } + } + if(prob < 100){ + printf("-p value less than 100 is invalid\n"); + return 1; + } + + if(optind >= argc){ + printf(" Needs a file name to fuzz\n"); + return 1; + } + + h = open(argv[optind], O_RDWR); + flen = lseek(h,0,SEEK_END); + lseek(h,0,SEEK_SET); + if(flen < 1){ + printf(" File is too short\n"); + return 1; + } + + nbuffers = (flen + sizeof(buffer) - 1) / sizeof(buffer); + + changesPerBuffer = 1+ (sizeof(buffer) * 8) / prob; + + printf("Fuzzing file %s. Size %d, probablity 1/%d, changing %d bits in each of %d buffers\n", + argv[optind],flen,prob,changesPerBuffer,nbuffers); + + srand(time(0)); + + for(b = 0; b < nbuffers; b++){ + printf("buffer %d\n",b); + lseek(h,b * sizeof(buffer),SEEK_SET); + bufsize = read(h,buffer,sizeof(buffer)); + for(i = 0; i < changesPerBuffer; i++){ + x = rand() % (sizeof(buffer) * 8); + buffer[x >> 3] ^= (1 << (x & 7)); + } + lseek(h,b * sizeof(buffer),SEEK_SET); + write(h,buffer,bufsize); + } + close(h); + return 0; +}