Skip to content

Commit 8eee7c6

Browse files
author
Grok Compression
committed
core_example: close memory leak in FUZZER code
1 parent 8835f4a commit 8eee7c6

File tree

1 file changed

+66
-59
lines changed

1 file changed

+66
-59
lines changed

examples/core/core_decompress.cpp

Lines changed: 66 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,65 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char** argv)
580580
// initialize library
581581
grk_initialize(nullptr, numThreads);
582582

583-
// #define TEST_FUZZER
583+
// initialize decompress parameters
584+
grk_decompress_parameters decompressParams = {};
585+
decompressParams.core.skip_allocate_composite = !doStore;
586+
// differential: disable as it breaks differential decompression
587+
if(!doDifferential)
588+
{
589+
decompressParams.asynchronous = true;
590+
decompressParams.simulate_synchronous = true;
591+
}
592+
593+
bool fromBuffer = fileOpt->count() == 0;
594+
if(dWindowOpt->count() > 0)
595+
{
596+
decompressParams.dw_x0 = dwindow[0];
597+
decompressParams.dw_y0 = dwindow[1];
598+
decompressParams.dw_x1 = dwindow[2];
599+
decompressParams.dw_y1 = dwindow[3];
600+
printf("Window set to %f,%f,%f,%f\n", dwindow[0], dwindow[1], dwindow[2], dwindow[3]);
601+
}
602+
603+
grk_image* image = nullptr;
604+
const char* inputFileStr = nullptr;
605+
bool useCallbacks = false;
606+
if(useCallbacks && !fromBuffer && isNetwork(inputFilePath))
607+
{
608+
printf("[WARNING] Disabling callbacks for network file %s\n", inputFilePath.c_str());
609+
useCallbacks = false;
610+
}
611+
612+
bool differentialByLayer = true;
613+
if(layersOpt->count() > 0 && maxLayers == 0)
614+
differentialByLayer = false;
615+
bool differentialByResolution = true;
616+
if(resOpt->count() > 0 && maxResolutions == 0)
617+
differentialByResolution = false;
618+
619+
// if we store, then no need to cache images, otherwise we choose minimum caching - image
620+
uint32_t fullCacheStrategy = doStore ? GRK_TILE_CACHE_NONE : GRK_TILE_CACHE_IMAGE;
621+
622+
// if true, decompress a particular tile, otherwise decompress
623+
// all tiles
624+
bool decompressTile = tileOpt->count() > 0;
625+
626+
grk_object* codec_diff = nullptr;
627+
grk_object* codec_full = nullptr;
628+
grk_header_info headerInfo = {};
629+
std::pair<grk_object*, bool> drc;
630+
631+
// create j2k file stream
632+
inputFileStr = inputFilePath.c_str();
633+
if(fromBuffer)
634+
printf("Decompressing buffer\n");
635+
else
636+
printf("Decompressing file %s\n", inputFilePath.c_str());
637+
638+
grk_stream_params streamParams = {};
639+
ReadStreamInfoExample sinfo(&streamParams);
640+
641+
#define TEST_FUZZER
584642
#ifdef TEST_FUZZER
585643
{
586644
grk_header_info headerInfo = {};
@@ -592,6 +650,7 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char** argv)
592650
size_t len = 0;
593651
uint8_t* buf = nullptr;
594652
FILE* file = nullptr;
653+
size_t bytesRead = 0;
595654

596655
auto cleanup = [&]() {
597656
if(buf)
@@ -626,7 +685,7 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char** argv)
626685
}
627686

628687
// Read file into buffer
629-
size_t bytesRead = fread(buf, 1, len, file);
688+
bytesRead = fread(buf, 1, len, file);
630689
if(bytesRead != len)
631690
{
632691
fprintf(stderr, "Failed to read file: %s\n", inputFilePath.c_str());
@@ -636,11 +695,14 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char** argv)
636695

637696
// Close the file
638697
fclose(file);
698+
file = nullptr;
639699

640700
// Set stream parameters
641701
stream_params.buf = buf;
642702
stream_params.buf_len = len;
643703

704+
grk_initialize(nullptr, 0);
705+
644706
// Proceed with decompression
645707
codec = grk_decompress_init(&stream_params, &parameters);
646708
if(!codec)
@@ -658,66 +720,11 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char** argv)
658720
cleanup();
659721
return -1;
660722
}
723+
cleanup();
724+
goto beach;
661725
}
662726
#endif
663727

664-
// initialize decompress parameters
665-
grk_decompress_parameters decompressParams = {};
666-
decompressParams.core.skip_allocate_composite = !doStore;
667-
// differential: disable as it breaks differential decompression
668-
if(!doDifferential)
669-
{
670-
decompressParams.asynchronous = true;
671-
decompressParams.simulate_synchronous = true;
672-
}
673-
674-
bool fromBuffer = fileOpt->count() == 0;
675-
if(dWindowOpt->count() > 0)
676-
{
677-
decompressParams.dw_x0 = dwindow[0];
678-
decompressParams.dw_y0 = dwindow[1];
679-
decompressParams.dw_x1 = dwindow[2];
680-
decompressParams.dw_y1 = dwindow[3];
681-
printf("Window set to %f,%f,%f,%f\n", dwindow[0], dwindow[1], dwindow[2], dwindow[3]);
682-
}
683-
684-
grk_image* image = nullptr;
685-
const char* inputFileStr = nullptr;
686-
bool useCallbacks = false;
687-
if(useCallbacks && !fromBuffer && isNetwork(inputFilePath))
688-
{
689-
printf("[WARNING] Disabling callbacks for network file %s\n", inputFilePath.c_str());
690-
useCallbacks = false;
691-
}
692-
693-
bool differentialByLayer = true;
694-
if(layersOpt->count() > 0 && maxLayers == 0)
695-
differentialByLayer = false;
696-
bool differentialByResolution = true;
697-
if(resOpt->count() > 0 && maxResolutions == 0)
698-
differentialByResolution = false;
699-
700-
// if we store, then no need to cache images, otherwise we choose minimum caching - image
701-
uint32_t fullCacheStrategy = doStore ? GRK_TILE_CACHE_NONE : GRK_TILE_CACHE_IMAGE;
702-
703-
// if true, decompress a particular tile, otherwise decompress
704-
// all tiles
705-
bool decompressTile = tileOpt->count() > 0;
706-
707-
grk_object* codec_diff = nullptr;
708-
grk_object* codec_full = nullptr;
709-
grk_header_info headerInfo = {};
710-
std::pair<grk_object*, bool> drc;
711-
712-
// create j2k file stream
713-
inputFileStr = inputFilePath.c_str();
714-
if(fromBuffer)
715-
printf("Decompressing buffer\n");
716-
else
717-
printf("Decompressing file %s\n", inputFilePath.c_str());
718-
719-
grk_stream_params streamParams = {};
720-
ReadStreamInfoExample sinfo(&streamParams);
721728
if(useCallbacks)
722729
{
723730
streamParams.seek_fn = stream_seek_fn;

0 commit comments

Comments
 (0)