summaryrefslogtreecommitdiffstats
path: root/tests/checkFrame.c
diff options
context:
space:
mode:
authorBlaise Sanouillet <43636048+blezsan@users.noreply.github.com>2018-10-02 12:38:30 (GMT)
committerBlaise Sanouillet <43636048+blezsan@users.noreply.github.com>2018-10-02 12:38:30 (GMT)
commit294293d8990b8f25ebc8660ef95dd9b1485c5d37 (patch)
tree020611d385b7f3531062d610daa307141d715558 /tests/checkFrame.c
parentd4703852b1f1e1b3defcfc677cabec77672e171d (diff)
downloadlz4-294293d8990b8f25ebc8660ef95dd9b1485c5d37.zip
lz4-294293d8990b8f25ebc8660ef95dd9b1485c5d37.tar.gz
lz4-294293d8990b8f25ebc8660ef95dd9b1485c5d37.tar.bz2
support custom block sizes: fix memory leak to make CI builds happy
Diffstat (limited to 'tests/checkFrame.c')
-rw-r--r--tests/checkFrame.c76
1 files changed, 55 insertions, 21 deletions
diff --git a/tests/checkFrame.c b/tests/checkFrame.c
index 385bc8d..f7e7a50 100644
--- a/tests/checkFrame.c
+++ b/tests/checkFrame.c
@@ -97,32 +97,59 @@ static U32 use_pause = 0;
#define MIN(a,b) ( (a) < (b) ? (a) : (b) )
#define MAX(a,b) ( (a) > (b) ? (a) : (b) )
-int frameCheck(FILE* const srcFile, unsigned bsid, size_t blockSize)
+typedef struct {
+ void* srcBuffer;
+ size_t srcBufferSize;
+ void* dstBuffer;
+ size_t dstBufferSize;
+ LZ4F_decompressionContext_t ctx;
+} cRess_t;
+
+static int createCResources(cRess_t *ress)
+{
+ ress->srcBufferSize = 4 MB;
+ ress->srcBuffer = malloc(ress->srcBufferSize);
+ ress->dstBufferSize = 4 MB;
+ ress->dstBuffer = malloc(ress->dstBufferSize);
+
+ if (!ress->srcBuffer || !ress->dstBuffer) {
+ free(ress->srcBuffer);
+ free(ress->dstBuffer);
+ EXM_THROW(20, "Allocation error : not enough memory");
+ }
+
+ if (LZ4F_isError( LZ4F_createDecompressionContext(&(ress->ctx), LZ4F_VERSION) )) {
+ free(ress->srcBuffer);
+ free(ress->dstBuffer);
+ EXM_THROW(21, "Unable to create decompression context");
+ }
+ return 0;
+}
+
+static void freeCResources(cRess_t ress)
+{
+ free(ress.srcBuffer);
+ free(ress.dstBuffer);
+
+ (void) LZ4F_freeDecompressionContext(ress.ctx);
+}
+
+int frameCheck(cRess_t ress, FILE* const srcFile, unsigned bsid, size_t blockSize)
{
- LZ4F_decompressionContext_t dctx = NULL;
- const size_t srcBufferSize = 4 MB;
- void* const srcBuffer = malloc(srcBufferSize);
- const size_t dstBufferSize = 4 MB;
- void* const dstBuffer = malloc(dstBufferSize);
LZ4F_errorCode_t nextToLoad = 0;
size_t curblocksize = 0;
int partialBlock = 0;
- if (!srcBuffer || !dstBuffer) EXM_THROW(20, "Allocation error : not enough memory");
-
- if (LZ4F_isError( LZ4F_createDecompressionContext(&dctx, LZ4F_VERSION) )) {
- EXM_THROW(21, "Unable to create decompression context");
- }
/* Main Loop */
for (;;) {
size_t readSize;
size_t pos = 0;
- size_t decodedBytes = dstBufferSize;
+ size_t decodedBytes = ress.dstBufferSize;
size_t remaining;
LZ4F_frameInfo_t frameInfo;
/* Read input */
- readSize = fread(srcBuffer, 1, srcBufferSize, srcFile);
+ readSize = fread(ress.srcBuffer, 1, ress.srcBufferSize, srcFile);
if (!readSize) break; /* reached end of file or stream */
while (pos < readSize) { /* still to read */
@@ -131,18 +158,18 @@ int frameCheck(FILE* const srcFile, unsigned bsid, size_t blockSize)
/* LZ4F_decompress returned 0 : starting new frame */
curblocksize = 0;
remaining = readSize - pos;
- nextToLoad = LZ4F_getFrameInfo(dctx, &frameInfo, (char*)(srcBuffer)+pos, &remaining);
+ nextToLoad = LZ4F_getFrameInfo(ress.ctx, &frameInfo, (char*)(ress.srcBuffer)+pos, &remaining);
if (LZ4F_isError(nextToLoad)) EXM_THROW(22, "Error getting frame info: %s", LZ4F_getErrorName(nextToLoad)); /* XXX */
if (frameInfo.blockSizeID != bsid) EXM_THROW(23, "Block size ID %u != expected %u", frameInfo.blockSizeID, bsid);
pos += remaining;
/* nextToLoad should be block header size */
remaining = nextToLoad;
- decodedBytes = dstBufferSize;
- nextToLoad = LZ4F_decompress(dctx, dstBuffer, &decodedBytes, (char*)(srcBuffer)+pos, &remaining, NULL);
+ decodedBytes = ress.dstBufferSize;
+ nextToLoad = LZ4F_decompress(ress.ctx, ress.dstBuffer, &decodedBytes, (char*)(ress.srcBuffer)+pos, &remaining, NULL);
if (LZ4F_isError(nextToLoad)) EXM_THROW(24, "Decompression error : %s", LZ4F_getErrorName(nextToLoad));
pos += remaining;
}
- decodedBytes = dstBufferSize;
+ decodedBytes = ress.dstBufferSize;
/* nextToLoad should be just enough to cover the next block */
if (nextToLoad > (readSize - pos)) {
/* block is not fully contained in current buffer */
@@ -154,7 +181,7 @@ int frameCheck(FILE* const srcFile, unsigned bsid, size_t blockSize)
}
remaining = nextToLoad;
}
- nextToLoad = LZ4F_decompress(dctx, dstBuffer, &decodedBytes, (char*)(srcBuffer)+pos, &remaining, NULL);
+ nextToLoad = LZ4F_decompress(ress.ctx, ress.dstBuffer, &decodedBytes, (char*)(ress.srcBuffer)+pos, &remaining, NULL);
if (LZ4F_isError(nextToLoad)) EXM_THROW(24, "Decompression error : %s", LZ4F_getErrorName(nextToLoad));
curblocksize += decodedBytes;
pos += remaining;
@@ -193,7 +220,6 @@ int FUZ_usage(const char* programName)
int main(int argc, const char** argv)
{
int argNb;
- int err;
int bsid=0;
size_t blockSize=0;
const char* const programName = argv[0];
@@ -257,13 +283,21 @@ int main(int argc, const char** argv)
}
}
} else {
+ int err;
FILE *srcFile;
+ cRess_t ress;
if (bsid == 0 || blockSize == 0)
return FUZ_usage(programName);
DISPLAY("Starting frame checker (%i-bits, %s)\n", (int)(sizeof(size_t)*8), LZ4_VERSION_STRING);
+ err = createCResources(&ress);
+ if (err) return (err);
srcFile = fopen(argument, "rb");
- if ( srcFile==NULL ) EXM_THROW(1, "%s: %s \n", argument, strerror(errno));
- err = frameCheck(srcFile, bsid, blockSize);
+ if ( srcFile==NULL ) {
+ freeCResources(ress);
+ EXM_THROW(1, "%s: %s \n", argument, strerror(errno));
+ }
+ err = frameCheck(ress, srcFile, bsid, blockSize);
+ freeCResources(ress);
fclose(srcFile);
return (err);
}