tiff_read_rgba_fuzzer.cc: add a -DSTANDALONE mode for easier reproduction of oss-fuzz reports
This commit is contained in:
parent
760ecced1e
commit
4b2a343001
@ -23,6 +23,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <sstream>
|
||||
#include <tiffio.h>
|
||||
#include <tiffio.hxx>
|
||||
@ -39,8 +40,10 @@ extern "C" void handle_error(const char *unused, const char *unused2, va_list un
|
||||
}
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
#ifndef STANDALONE
|
||||
TIFFSetErrorHandler(handle_error);
|
||||
TIFFSetWarningHandler(handle_error);
|
||||
#endif
|
||||
#if defined(__has_feature)
|
||||
# if __has_feature(memory_sanitizer)
|
||||
// libjpeg-turbo has issues with MSAN and SIMD code
|
||||
@ -95,3 +98,82 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef STANDALONE
|
||||
|
||||
template<class T> static void CPL_IGNORE_RET_VAL(T) {}
|
||||
|
||||
static void Usage(int, char* argv[])
|
||||
{
|
||||
fprintf(stderr, "%s [--help] [-repeat N] filename.\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int nRet = 0;
|
||||
void* buf = NULL;
|
||||
int nLen = 0;
|
||||
int nLoops = 1;
|
||||
const char* pszFilename = NULL;
|
||||
|
||||
for(int i = 1; i < argc; i++ )
|
||||
{
|
||||
if( i + 1 < argc && strcmp(argv[i], "-repeat") == 0 )
|
||||
{
|
||||
nLoops = atoi(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
else if( strcmp(argv[i], "-dummy") == 0 )
|
||||
{
|
||||
uint8_t dummy = ' ';
|
||||
return LLVMFuzzerTestOneInput(&dummy, 1);
|
||||
}
|
||||
else if( strcmp(argv[i], "--help") == 0 )
|
||||
{
|
||||
Usage(argc, argv);
|
||||
}
|
||||
else if( argv[i][0] == '-' )
|
||||
{
|
||||
fprintf(stderr, "Unrecognized option: %s", argv[i]);
|
||||
Usage(argc, argv);
|
||||
}
|
||||
else
|
||||
{
|
||||
pszFilename = argv[i];
|
||||
}
|
||||
}
|
||||
if( pszFilename == nullptr )
|
||||
{
|
||||
fprintf(stderr, "No filename specified\n");
|
||||
Usage(argc, argv);
|
||||
}
|
||||
FILE* f = fopen(pszFilename, "rb");
|
||||
if( !f )
|
||||
{
|
||||
fprintf(stderr, "%s does not exist.\n", pszFilename);
|
||||
exit(1);
|
||||
}
|
||||
fseek(f, 0, SEEK_END);
|
||||
nLen = (int)ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
buf = malloc(nLen);
|
||||
if( !buf )
|
||||
{
|
||||
fprintf(stderr, "malloc failed.\n");
|
||||
fclose(f);
|
||||
exit(1);
|
||||
}
|
||||
CPL_IGNORE_RET_VAL(fread(buf, nLen, 1, f));
|
||||
fclose(f);
|
||||
for( int i = 0; i < nLoops; i++ )
|
||||
{
|
||||
nRet = LLVMFuzzerTestOneInput(static_cast<const uint8_t*>(buf), nLen);
|
||||
if( nRet != 0 )
|
||||
break;
|
||||
}
|
||||
free(buf);
|
||||
return nRet;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user