/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d9f1a6f43e7bab45d6be857a5800f5d4a1861db3:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0010: 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 20 66  test interface f
0020: 6f 72 20 74 68 65 20 6f 73 73 66 75 7a 7a 2e 63  or the ossfuzz.c
0030: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 6f 73   module.  The os
0040: 73 66 75 7a 7a 2e 63 20 6d 6f 64 75 6c 65 0a 2a  sfuzz.c module.*
0050: 2a 20 69 73 20 61 6e 20 61 64 61 70 74 6f 72 20  * is an adaptor 
0060: 66 6f 72 20 4f 53 53 2d 46 55 5a 5a 2e 20 20 28  for OSS-FUZZ.  (
0070: 68 74 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63  https://github.c
0080: 6f 6d 2f 67 6f 6f 67 6c 65 2f 6f 73 73 2d 66 75  om/google/oss-fu
0090: 7a 7a 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  zz).**.** This p
00a0: 72 6f 67 72 61 6d 20 6c 69 6e 6b 73 20 61 67 61  rogram links aga
00b0: 69 6e 73 74 20 6f 73 73 66 75 7a 7a 2e 63 2e 20  inst ossfuzz.c. 
00c0: 20 49 74 20 72 65 61 64 73 20 66 69 6c 65 73 20   It reads files 
00d0: 6e 61 6d 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  named on the.** 
00e0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64  command line and
00f0: 20 70 61 73 73 65 73 20 74 68 65 6d 20 6f 6e 65   passes them one
0100: 20 62 79 20 6f 6e 65 20 69 6e 74 6f 20 6f 73 73   by one into oss
0110: 66 75 7a 7a 2e 63 2e 0a 2a 2f 0a 23 69 6e 63 6c  fuzz.c..*/.#incl
0120: 75 64 65 20 3c 73 74 64 64 65 66 2e 68 3e 0a 23  ude <stddef.h>.#
0130: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e  include <stdint.
0140: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0150: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0160: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0170: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
0180: 2f 2a 0a 2a 2a 20 54 68 65 20 65 6e 74 72 79 20  /*.** The entry 
0190: 70 6f 69 6e 74 20 69 6e 20 6f 73 73 66 75 7a 7a  point in ossfuzz
01a0: 2e 63 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  .c that this rou
01b0: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
01c0: 6c 69 6e 67 0a 2a 2f 0a 69 6e 74 20 4c 4c 56 4d  ling.*/.int LLVM
01d0: 46 75 7a 7a 65 72 54 65 73 74 4f 6e 65 49 6e 70  FuzzerTestOneInp
01e0: 75 74 28 63 6f 6e 73 74 20 75 69 6e 74 38 5f 74  ut(const uint8_t
01f0: 2a 20 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 73  * data, size_t s
0200: 69 7a 65 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize);.../*.** Re
0210: 61 64 20 66 69 6c 65 73 20 6e 61 6d 65 64 20 6f  ad files named o
0220: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  n the command-li
0230: 6e 65 20 61 6e 64 20 69 6e 76 6f 6b 65 20 74 68  ne and invoke th
0240: 65 20 66 75 7a 7a 65 72 20 66 6f 72 0a 2a 2a 20  e fuzzer for.** 
0250: 65 61 63 68 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  each one..*/.int
0260: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
0270: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
0280: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 69 6e 74 20  FILE *in;.  int 
0290: 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  i;.  int nErr = 
02a0: 30 3b 0a 20 20 75 69 6e 74 38 5f 74 20 2a 7a 42  0;.  uint8_t *zB
02b0: 75 66 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  uf = 0;.  size_t
02c0: 20 73 7a 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b   sz;..  for(i=1;
02d0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
02e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
02f0: 46 69 6c 65 6e 61 6d 65 20 3d 20 61 72 67 76 5b  Filename = argv[
0300: 69 5d 3b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70  i];.    in = fop
0310: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72  en(zFilename, "r
0320: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
0330: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
0340: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
0350: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
0360: 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  n", zFilename);.
0370: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
0380: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
0390: 20 20 7d 0a 20 20 20 20 66 73 65 65 6b 28 69 6e    }.    fseek(in
03a0: 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  , 0, SEEK_END);.
03b0: 20 20 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28 69      sz = ftell(i
03c0: 6e 29 3b 0a 20 20 20 20 72 65 77 69 6e 64 28 69  n);.    rewind(i
03d0: 6e 29 3b 0a 20 20 20 20 7a 42 75 66 20 3d 20 72  n);.    zBuf = r
03e0: 65 61 6c 6c 6f 63 28 7a 42 75 66 2c 20 73 7a 29  ealloc(zBuf, sz)
03f0: 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d  ;.    if( zBuf==
0400: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
0410: 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
0420: 6f 74 20 6d 61 6c 6c 6f 63 28 29 20 66 6f 72 20  ot malloc() for 
0430: 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 28 69 6e  %d bytes\n", (in
0440: 74 29 73 7a 29 3b 0a 20 20 20 20 20 20 65 78 69  t)sz);.      exi
0450: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(1);.    }.    
0460: 69 66 28 20 66 72 65 61 64 28 7a 42 75 66 2c 20  if( fread(zBuf, 
0470: 73 7a 2c 20 31 2c 20 69 6e 29 21 3d 31 20 29 7b  sz, 1, in)!=1 ){
0480: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
0490: 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 72  tderr, "cannot r
04a0: 65 61 64 20 25 64 20 62 79 74 65 73 20 66 72 6f  ead %d bytes fro
04b0: 6d 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  m \"%s\"\n",.   
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 20 20 20 28 69 6e 74 29 73 7a 2c 20 7a 46 69      (int)sz, zFi
04e0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6e  lename);.      n
04f0: 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  Err++;.    }else
0500: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
0510: 25 73 2e 2e 2e 20 22 2c 20 7a 46 69 6c 65 6e 61  %s... ", zFilena
0520: 6d 65 29 3b 0a 20 20 20 20 20 20 66 66 6c 75 73  me);.      fflus
0530: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
0540: 20 28 76 6f 69 64 29 4c 4c 56 4d 46 75 7a 7a 65   (void)LLVMFuzze
0550: 72 54 65 73 74 4f 6e 65 49 6e 70 75 74 28 7a 42  rTestOneInput(zB
0560: 75 66 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70  uf, sz);.      p
0570: 72 69 6e 74 66 28 22 6f 6b 5c 6e 22 29 3b 0a 20  rintf("ok\n");. 
0580: 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28     }.    fclose(
0590: 69 6e 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  in);.  }.  free(
05a0: 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  zBuf);.  return 
05b0: 6e 45 72 72 3b 0a 7d 0a                          nErr;.}.