ref: 52bd05c217fdaa140e294dd7b104e81d82c882be
parent: 32dfab624c2d80aedb3158035a7d6f2a6662116e
author: Steven Sleder <ssleder@iastate.edu>
date: Wed Nov 14 01:04:53 EST 2018
More printing changes
--- a/fuzz.h
+++ b/fuzz.h
@@ -96,10 +96,18 @@
// Enum to track types of inputs
typedef int type;
enum type {
-t_int, // int
-t_long, // long
-t_DirS, // Dir*
-t_charS // char*
+t_int,
+t_uint,
+t_IOchunkS,
+t_long,
+t_ulong,
+t_vlong,
+t_longS,
+t_DirS,
+t_DirSS,
+t_char,
+t_uchar,
+t_charS
};
// Structure to track an instance of a given type
--- /dev/null
+++ b/fuzz.h.orig
@@ -1,0 +1,163 @@
+#ifndef FUZZ_H
+#define FUZZ_H
+
+#include <u.h>
+#include <libc.h>
+#include "list.h"
+#include "mutate.h"
+
+// Number of calls in enum calls
+#define NCALLS 66
+#define NTYPES 4
+
+// Global variables
+extern int logfd;
+
+/*
+For full list of syscalls:
+
+If systab doesn't exist, do: cd /sys/src/9/port && mk
+/sys/src/9/port/systab.h
+/sys/src/libc/9syscall/sys.h
+/sys/include/libc.h:537
+*/
+
+// User space syscall definitions as per libc.h with sc_ prefix added
+typedef int call;
+enum call {
+sc_exits , // _exits(char*);
+sc_abort , // abort(void);
+sc_access , // access(char*, int);
+sc_alarm , // alarm(ulong);
+sc_await , // await(char*, int);
+sc_bind , // bind(char*, char*, int);
+sc_brk , // brk(void*);
+sc_chdir , // chdir(char*);
+sc_close , // close(int);
+sc_create , // create(char*, int, ulong);
+sc_dup , // dup(int, int);
+sc_errstr , // errstr(char*, uint);
+sc_exec , // exec(char*, char*[]);
+sc_execl , // execl(char*, ...);
+sc_fork , // fork(void);
+sc_rfork , // rfork(int);
+sc_fauth , // fauth(int, char*);
+sc_fstat , // fstat(int, uchar*, int);
+sc_fwstat , // fwstat(int, uchar*, int);
+sc_fversion, // fversion(int, int, char*, int);
+sc_mount , // mount(int, int, char*, int, char*);
+sc_unmount, // unmount(char*, char*);
+sc_noted , // noted(int);
+sc_notify , // notify(void(*)(void*, char*));
+sc_open , // open(char*, int);
+sc_fd2path, // fd2path(int, char*, int);
+sc_pipe , // pipe(int*);
+sc_pread , // pread(int, void*, long, vlong);
+sc_preadv, // preadv(int, IOchunk*, int, vlong);
+sc_pwrite , // pwrite(int, void*, long, vlong);
+sc_pwritev, // pwritev(int, IOchunk*, int, vlong);
+sc_read , // read(int, void*, long);
+sc_readn , // readn(int, void*, long);
+sc_readv , // readv(int, IOchunk*, int);
+sc_remove, // remove(char*);
+sc_sbrk , // sbrk(ulong);
+sc_oseek , // oseek(int, long, int);
+sc_seek, // seek(int, vlong, int);
+sc_segattach, // segattach(int, char*, void*, ulong);
+sc_segbrk , // segbrk(void*, void*);
+sc_segdetach, // segdetach(void*);
+sc_segflush, // segflush(void*, ulong);
+sc_segfree, // segfree(void*, ulong);
+sc_semacquire, // semacquire(long*, int);
+sc_semrelease, // semrelease(long*, long);
+sc_sleep, // sleep(long);
+sc_stat, // stat(char*, uchar*, int);
+sc_tsemacquire, // tsemacquire(long*, ulong);
+sc_wait, // wait(void);
+sc_waitpid, // waitpid(void);
+sc_write, // write(int, void*, long);
+sc_writev, // writev(int, IOchunk*, int);
+sc_wstat, // wstat(char*, uchar*, int);
+sc_rendezvous, // rendezvous(void*, void*);
+sc_dirstat, // dirstat(char*);
+sc_dirfstat, // dirfstat(int);
+sc_dirwstat, // dirwstat(char*, Dir*);
+sc_dirfwstat, // dirfwstat(int, Dir*);
+sc_dirread, // dirread(int, Dir**);
+sc_nulldir, // nulldir(Dir*);
+sc_dirreadall, // dirreadall(int, Dir**);
+sc_getpid , // getpid(void);
+sc_getppid, // getppid(void);
+sc_rerrstr, // rerrstr(char*, uint);
+sc_sysname, // sysname(void);
+sc_werrstr // werrstr(char*, ...);
+};
+
+// Enum to track types of inputs
+typedef int type;
+enum type {
+<<<<<<< working copy
+t_int,
+t_uint,
+t_IOchunkS,
+t_long,
+t_ulong,
+t_vlong,
+t_longS,
+t_DirS,
+t_DirSS,
+t_char,
+t_uchar,
+t_charS
+=======
+t_int, // int
+t_long, // long
+t_DirS, // Dir*
+t_charS // char*
+>>>>>>> destination
+};
+
+// Structure to track an instance of a given type
+typedef struct t_type t_type;
+struct t_type
+{
+ void* var; // Variable to track
+ type t; // Type of the variable to cast to
+};
+
+// Type names table -- in input.c
+extern char *typenames[NTYPES];
+
+// User space system call names table -- NCALLS length -- in input.c
+extern char *callnames[NCALLS];
+
+// Structure to track state of system calling
+typedef struct caller caller;
+struct caller
+{
+ call c; // System call in use
+ char* name; // Real name of syscall
+ int round; // Last run executed
+ int seed; // Seed call was initialized with
+ List inputs; // List of input types in order from left→right
+};
+
+// Index of system calls -- one for each enum'd system call
+caller syscalls[NCALLS];
+
+/* == Function prototypes == */
+
+// input.c
+void fuzz(caller*);
+void hjsync(void);
+void log_call(caller*);
+
+// inlist.c
+List* mkinlist(List*, call);
+
+
+// list.c → See list.h
+
+// mutate.c → See mutate.h
+
+#endif
--- a/input.c
+++ b/input.c
@@ -102,8 +102,34 @@
fprint(logfd, "\n\tSeed: %d", sc->seed);
int x;
- for (x; x < ((sc->inputs).size); x++) {
- //fprint(logfd, "\n\t\t%s", callnames[ ((t_type*) lget(&(sc->inputs), x))->t ]);
+ for (x; x < (sc->inputs.size); x++) {
+ t_type* ele = lget(&(sc->inputs), x);
+
+ fprint(logfd, "\n\t\t%s : ", callnames[ele->t]);
+
+ switch(ele->t) {
+ case t_int :
+ fprint(logfd, "%d", (int) ele->var);
+ break;
+ case t_uint :
+ fprint(logfd, "%d", (uint) ele->var);
+ case t_long :
+ fprint(logfd, "%ld", (long) ele->var);
+ break;
+ case t_ulong :
+ fprint(logfd, "%lu", (ulong) ele->var);
+ break;
+ case t_DirS :
+ fprint(logfd, "%s", (Dir*) ele->var);
+ break;
+ case t_charS :
+ fprint(logfd, "%s", (char*) ele->var);
+ break;
+ case t_char :
+ fprint(logfd, "%c", (char) ele->var);
+ default :
+ exits("Unknown input variable type!");
+ }
}
}
--- /dev/null
+++ b/input.c.orig
@@ -1,0 +1,222 @@
+#include "fuzz.h"
+
+// Procedurally generate input to syscall
+void
+fuzz(caller *sc)
+{
+ // TODO
+ switch(sc->c) {
+ case sc_exits : // _exits(char*);
+ case sc_abort : // abort(void);
+ case sc_access : // access(char* : int);
+ case sc_alarm : // alarm(ulong);
+ case sc_await : // await(char* : int);
+ case sc_bind : // bind(char* : char* : int);
+ case sc_brk : // brk(void*);
+ case sc_chdir : // chdir(char*);
+ case sc_close : // close(int);
+ // increment the round counter
+ (sc->round)++;
+
+ // mutate the input
+ int fd;
+
+ // log the variables
+ log_call(sc);
+
+ // sync the disk
+ hjsync();
+
+ // execute the call
+ close(fd);
+
+ break;
+ case sc_create : // create(char* : int : ulong);
+ case sc_dup : // dup(int : int);
+ case sc_errstr : // errstr(char* : uint);
+ case sc_exec : // exec(char* : char*[]);
+ case sc_execl : // execl(char* : ...);
+ case sc_fork : // fork(void);
+ case sc_rfork : // rfork(int);
+ case sc_fauth : // fauth(int : char*);
+ case sc_fstat : // fstat(int : uchar* : int);
+ case sc_fwstat : // fwstat(int : uchar* : int);
+ case sc_fversion : // fversion(int : int : char* : int);
+ case sc_mount : // mount(int : int : char* : int : char*);
+ case sc_unmount : // unmount(char* : char*);
+ case sc_noted : // noted(int);
+ case sc_notify : // notify(void(*)(void* : char*));
+ case sc_open : // open(char* : int);
+ case sc_fd2path : // fd2path(int : char* : int);
+ case sc_pipe : // pipe(int*);
+ case sc_pread : // pread(int : void* : long : vlong);
+ case sc_preadv : // preadv(int : IOchunk* : int : vlong);
+ case sc_pwrite : // pwrite(int : void* : long : vlong);
+ case sc_pwritev : // pwritev(int : IOchunk* : int : vlong);
+ case sc_read : // read(int : void* : long);
+ case sc_readn : // readn(int : void* : long);
+ case sc_readv : // readv(int : IOchunk* : int);
+ case sc_remove : // remove(char*);
+ case sc_sbrk : // sbrk(ulong);
+ case sc_oseek : // oseek(int : long : int);
+ case sc_seek : // seek(int : vlong : int);
+ case sc_segattach : // segattach(int : char* : void* : ulong);
+ case sc_segbrk : // segbrk(void* : void*);
+ case sc_segdetach : // segdetach(void*);
+ case sc_segflush : // segflush(void* : ulong);
+ case sc_segfree : // segfree(void* : ulong);
+ case sc_semacquire : // semacquire(long* : int);
+ case sc_semrelease : // semrelease(long* : long);
+ case sc_sleep : // sleep(long);
+ case sc_stat : // stat(char* : uchar* : int);
+ case sc_tsemacquire : // tsemacquire(long* : ulong);
+ case sc_wait : // wait(void);
+ case sc_waitpid : // waitpid(void);
+ case sc_write : // write(int : void* : long);
+ case sc_writev : // writev(int : IOchunk* : int);
+ case sc_wstat : // wstat(char* : uchar* : int);
+ case sc_rendezvous : // rendezvous(void* : void*);
+ case sc_dirstat : // dirstat(char*);
+ case sc_dirfstat : // dirfstat(int);
+ case sc_dirwstat : // dirwstat(char* : Dir*);
+ case sc_dirfwstat : // dirfwstat(int : Dir*);
+ case sc_dirread : // dirread(int : Dir**);
+ case sc_nulldir : // nulldir(Dir*);
+ case sc_dirreadall : // dirreadall(int : Dir**);
+ case sc_getpid : // getpid(void);
+ case sc_getppid : // getppid(void);
+ case sc_rerrstr : // rerrstr(char* : uint);
+ case sc_sysname : // sysname(void);
+ case sc_werrstr : // werrstr(char* : ...);
+ default :
+ exits("Unknown system call!");
+ }
+}
+
+// Logs the syscall arguments
+void
+log_call(caller *sc)
+{
+ fprint(logfd, "\nSystem Call: %s", sc->name);
+ fprint(logfd, "\n\tRound #: %d", sc->round);
+ fprint(logfd, "\n\tSeed: %d", sc->seed);
+
+ int x;
+ for (x; x < (sc->inputs.size); x++) {
+ t_type* ele = lget(&(sc->inputs), x);
+
+ fprint(logfd, "\n\t\t%s : ", callnames[ele->t]);
+
+ switch(ele->t) {
+ case t_int :
+ fprintf(logfd, "%d", (int) ele->var);
+ break;
+ case t_uint :
+ fprintf(logfd, "%d", (uint) ele->var);
+ case t_long :
+ fprintf(logfd, "%ld", (long) ele->var);
+ break;
+ case t_ulong :
+ fprintf(logfd, "%lu", (ulong) ele->var);
+ break;
+ case t_DirS :
+ fprintf(logfd, "%s", (Dir*) ele->var);
+ break;
+ case t_charS :
+ fprintf(logfd, "%s", (char*) ele->var);
+ break;
+ case t_char :
+ fprintf(logfd, "%c", (char) ele->var);
+ default :
+ exit("Unknown input variable type!");
+ }
+ }
+}
+
+// Syncs the disk in hjfs
+void
+hjsync()
+{
+ // open file and write to sync disk
+ int hjfs = open("/srv/hjfs.cmd", OWRITE);
+ fprint(hjfs, "sync\n");
+ close(hjfs);
+}
+
+// Init callnames here, is extern in fuzz.h
+char *callnames[NCALLS]= {
+"_exits",
+"abort",
+"access",
+"alarm",
+"await",
+"bind",
+"brk",
+"chdir",
+"close",
+"create",
+"dup",
+"errstr",
+"exec",
+"execl",
+"fork",
+"rfork",
+"fauth",
+"fstat",
+"fwstat",
+"fversion",
+"mount",
+"unmount",
+"noted",
+"notify",
+"open",
+"fd2path",
+"pipe",
+"pread",
+"preadv",
+"pwrite",
+"pwritev",
+"read",
+"readn",
+"readv",
+"remove",
+"sbrk",
+"oseek",
+"seek",
+"segattach",
+"segbrk",
+"segdetach",
+"segflush",
+"segfree",
+"semacquire",
+"semrelease",
+"sleep",
+"stat",
+"tsemacquire",
+"wait",
+"waitpid",
+"write",
+"writev",
+"wstat",
+"rendezvous",
+"dirstat",
+"dirfstat",
+"dirwstat",
+"dirfwstat",
+"dirread",
+"nulldir",
+"dirreadall",
+"getpid",
+"getppid",
+"rerrstr",
+"sysname",
+"werrstr"
+};
+
+// Init callnames here, is extern in fuzz.h
+char *typenames[NTYPES]= {
+"int",
+"long",
+"Dir*",
+"char*"
+};