AryaWu/sqlite
0
1/*2** This is a test interface for the ossfuzz.c module. The ossfuzz.c module3** is an adaptor for OSS-FUZZ. (https://github.com/google/oss-fuzz)4**5** This program links against ossfuzz.c. It reads files named on the6** command line and passes them one by one into ossfuzz.c.7*/8#include <stddef.h>9#if !defined(_MSC_VER)10# include <stdint.h>11#endif12#include <stdio.h>13#include <stdlib.h>14#include <string.h>15#include "sqlite3.h"16 17#if defined(_MSC_VER)18typedef unsigned char uint8_t;19#endif20 21/*22** The entry point in ossfuzz.c that this routine will be calling23*/24int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);25 26/* Must match equivalent #defines in ossfuzz.c */27#define FUZZ_SQL_TRACE 0x0001 /* Set an sqlite3_trace() callback */28#define FUZZ_SHOW_MAX_DELAY 0x0002 /* Show maximum progress callback delay */29#define FUZZ_SHOW_ERRORS 0x0004 /* Show SQL errors */30extern void ossfuzz_set_debug_flags(unsigned);31 32 33 34/*35** Read files named on the command-line and invoke the fuzzer for36** each one.37*/38int main(int argc, char **argv){39 FILE *in;40 int i;41 int nErr = 0;42 uint8_t *zBuf = 0;43 size_t sz;44 unsigned mDebug = 0;45 46 for(i=1; i<argc; i++){47 const char *zFilename = argv[i];48 if( zFilename[0]=='-' ){49 if( zFilename[1]=='-' ) zFilename++;50 if( strcmp(zFilename, "-show-errors")==0 ){51 mDebug |= FUZZ_SHOW_ERRORS;52 ossfuzz_set_debug_flags(mDebug);53 }else54 if( strcmp(zFilename, "-show-max-delay")==0 ){55 mDebug |= FUZZ_SHOW_MAX_DELAY;56 ossfuzz_set_debug_flags(mDebug);57 }else58 if( strcmp(zFilename, "-sql-trace")==0 ){59 mDebug |= FUZZ_SQL_TRACE;60 ossfuzz_set_debug_flags(mDebug);61 }else62 {63 printf("unknown option \"%s\"\n", argv[i]);64 printf("should be one of: --show-errors --show-max-delay"65 " --sql-trace\n");66 exit(1);67 }68 continue;69 }70 in = fopen(zFilename, "rb");71 if( in==0 ){72 fprintf(stderr, "cannot open \"%s\"\n", zFilename);73 nErr++;74 continue;75 }76 fseek(in, 0, SEEK_END);77 sz = ftell(in);78 rewind(in);79 zBuf = realloc(zBuf, sz);80 if( zBuf==0 ){81 fprintf(stderr, "cannot malloc() for %d bytes\n", (int)sz);82 exit(1);83 }84 if( fread(zBuf, sz, 1, in)!=1 ){85 fprintf(stderr, "cannot read %d bytes from \"%s\"\n",86 (int)sz, zFilename);87 nErr++;88 }else{89 printf("%s... ", zFilename);90 if( mDebug ) printf("\n");91 fflush(stdout);92 (void)LLVMFuzzerTestOneInput(zBuf, sz);93 if( mDebug ) printf("%s: ", zFilename);94 printf("ok\n");95 }96 fclose(in);97 }98 free(zBuf);99 return nErr;100}101 