changeset 329:6e3d84a335f5

Add fuzzer work in progress
author charles <charles>
date Mon, 14 Dec 2009 19:46:27 +0000
parents 1ec0197afc8d
children e5c603a4b786
files direct/tests/Makefile direct/tests/fuzzer.c
diffstat 2 files changed, 83 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/direct/tests/Makefile
+++ b/direct/tests/Makefile
@@ -14,7 +14,7 @@
 #
 # NB Warning this Makefile does not include header dependencies.
 #
-# $Id: Makefile,v 1.4 2009-11-09 19:16:33 charles Exp $
+# $Id: Makefile,v 1.5 2009-12-14 19:46:27 charles Exp $
 
 #EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC
 
@@ -60,7 +60,7 @@ YAFFSDIRECTSYMLINKS =  yaffscfg2k.c yaff
 SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS)
 #all: directtest2k boottest
 
-all: yaffs_test
+all: yaffs_test fuzzer
 
 $(ALLOBJS): %.o: %.c
 	gcc -c $(CFLAGS) -o $@ $<
@@ -74,10 +74,14 @@ all: yaffs_test
 
 
 yaffs_test: $(SYMLINKS) $(YAFFSTESTOBJS)
-	gcc -o $@ $(YAFFSTESTOBJS)
+	gcc $(CFLLAG) -o $@ $(YAFFSTESTOBJS)
+
+fuzzer: fuzzer.c
+	gcc $(CFLAGS) -o $@ $<
+
 
 
 
 
 clean:
-	rm -f yaffs_test $(ALLOBJS) core $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS)
+	rm -f yaffs_test fuzzer fuzzer.o $(ALLOBJS) core $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS)
new file mode 100644
--- /dev/null
+++ b/direct/tests/fuzzer.c
@@ -0,0 +1,75 @@
+/*
+ * Fuzzer to fuzz a file
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+                     
+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;
+}