[Leptonica] Added fuzzer with seed corpus (#3702)

* Added fuzzer with seed corpus

* Removed flag

* Added license header
This commit is contained in:
AdamKorcz 2020-04-24 05:05:38 +01:00 committed by GitHub
parent 3a6127217e
commit d967b71245
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 1 deletions

View File

@ -27,4 +27,4 @@ RUN git clone https://www.cl.cam.ac.uk/~mgk25/git/jbigkit jbigkit
RUN git clone --depth 1 https://github.com/libjpeg-turbo/libjpeg-turbo libjpeg-turbo
RUN git clone --depth 1 https://github.com/facebook/zstd zstd
WORKDIR leptonica
COPY build.sh pix_rotate_shear_fuzzer.cc $SRC/
COPY build.sh pixa_recog_fuzzer.cc pix_rotate_shear_fuzzer.cc $SRC/

View File

@ -117,3 +117,17 @@ $CXX $CXXFLAGS -std=c++11 -I"$WORK/include" \
"$WORK/lib/libz.a" \
$LIB_FUZZING_ENGINE
$CXX $CXXFLAGS -std=c++11 -I"$WORK/include" \
"$SRC/pixa_recog_fuzzer.cc" -o "$OUT/pixa_recog_fuzzer" \
-Isrc/ \
"$WORK/lib/liblept.a" \
"$WORK/lib/libtiff.a" \
"$WORK/lib/libwebp.a" \
"$WORK/lib/libpng.a" \
"$WORK/lib/libjpeg.a" \
"$WORK/lib/libjbig.a" \
"$WORK/lib/libzstd.a" \
"$WORK/lib/libz.a" \
$LIB_FUZZING_ENGINE
cd $SRC/leptonica/prog/recog/sets && zip pixa_recog_fuzzer_seed_corpus.zip test01.pa && mv pixa_recog_fuzzer_seed_corpus.zip /out/

View File

@ -0,0 +1,79 @@
/*
# Copyright 2020 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################
*/
#include "string.h"
#include "allheaders.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
extern "C" int
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
if(size<20) return 0;
char filename[256];
sprintf(filename, "/tmp/libfuzzer.pa");
FILE *fp = fopen(filename, "wb");
if (!fp)
return 0;
fwrite(data, size, 1, fp);
fclose(fp);
char *text;
l_int32 histo[10];
PIXA *pixa1, *pixa2, *pixa3, *pixa4;
L_RECOG *recog1;
l_int32 i, n, ival;
PIX *pix1;
pixa1 = pixaRead(filename);
pixa2 = pixaCreate(0);
pixa3 = pixaCreate(0);
n = pixaGetCount(pixa1);
for (i = 0; i < 10; i++)
histo[i] = 0;
for (i = 0; i < n; i++) {
pix1 = pixaGetPix(pixa1, i, L_COPY);
text = pixGetText(pix1);
ival = text[0] - '0';
if (ival == 4 || (ival == 7 && histo[7] == 2) ||
(ival == 9 && histo[9] == 2)) {
pixaAddPix(pixa3, pix1, L_INSERT);
} else {
pixaAddPix(pixa2, pix1, L_INSERT);
histo[ival]++;
}
}
recog1 = recogCreateFromPixa(pixa2, 0, 40, 1, 128, 1);
pixa4 = recogTrainFromBoot(recog1, pixa3, 0.75, 128, 1);
recogDestroy(&recog1);
pixaDestroy(&pixa1);
pixaDestroy(&pixa2);
pixaDestroy(&pixa3);
pixaDestroy(&pixa4);
unlink(filename);
return 0;
}