From: <kin...@us...> - 2012-10-03 17:09:17
|
Revision: 5699 http://teem.svn.sourceforge.net/teem/?rev=5699&view=rev Author: kindlmann Date: 2012-10-03 17:09:11 +0000 (Wed, 03 Oct 2012) Log Message: ----------- based on -Wconversion warnings, fixing some long-standing confusion about which types to use associated with zlib output, mainly that sizeChunk should be unsigned int and not size_t, given that zlib is apparently limited to working with 32-bit-worth of data at a time (and, airSanity ensures that ints are 32-bits) Modified Paths: -------------- teem/trunk/src/nrrd/encodingGzip.c Modified: teem/trunk/src/nrrd/encodingGzip.c =================================================================== --- teem/trunk/src/nrrd/encodingGzip.c 2012-10-03 17:07:16 UTC (rev 5698) +++ teem/trunk/src/nrrd/encodingGzip.c 2012-10-03 17:09:11 UTC (rev 5699) @@ -42,10 +42,10 @@ Nrrd *nrrd, NrrdIoState *nio) { static const char me[]="_nrrdEncodingGzip_read"; #if TEEM_ZLIB - size_t sizeData, sizeRed, sizeChunk; + size_t sizeData, sizeRed; int error; long int bi; - unsigned int didread; + unsigned int didread, sizeChunk, maxChunk; char *data; gzFile gzfin; airPtrPtrUnion appu; @@ -61,9 +61,12 @@ /* keeps track of how many bytes have been successfully read in */ sizeRed = 0; - /* zlib can only handle data sizes up to UINT_MAX ==> if there's more - than UINT_MAX bytes to read in, we read in in chunks */ - sizeChunk = AIR_MIN(sizeData, UINT_MAX); + /* zlib can only handle data sizes up to UINT_MAX ==> if there's + more than UINT_MAX bytes to read in, we read in in chunks. Given + how sizeChunk is used below, we also cap chunk size at UINT_MAX/2 + to prevent overflow. */ + maxChunk = UINT_MAX/2; + sizeChunk = AIR_CAST(unsigned int, AIR_MIN(sizeData, maxChunk)); if (nio->byteSkip < 0) { /* We don't know the size of the size to skip before the data, so @@ -90,16 +93,20 @@ and we haven't hit EOF (EOF signified by read == 0). Unlike the code below (for positive byteskip), we are obligated to read until the bitter end, and can't update sizeChunk to encompass only the - required data. Cast on third arg ok because of AIR_MIN use above */ + required data. */ while (!(error = _nrrdGzRead(gzfin, buff + sizeRed, - AIR_CAST(unsigned int, sizeChunk), - &didread)) + sizeChunk, &didread)) && didread > 0) { sizeRed += didread; if (didread >= sizeChunk) { /* we were able to read as much data as we requested, maybe there is more, so we need to make our temp buffer bigger */ - airArrayLenIncr(buffArr, sizeChunk); + unsigned int newlen = buffArr->len + sizeChunk; + if (newlen < buffArr->len) { + biffAddf(NRRD, "%s: array size will exceed uint capacity", me); + return 1; + } + airArrayLenSet(buffArr, newlen); if (!buffArr->data) { biffAddf(NRRD, "%s: couldn't re-allocate data buffer", me); return 1; @@ -144,10 +151,10 @@ /* We only want to read as much data as we need, so we need to check to make sure that we don't request data that might be there but that we don't want. This will reduce sizeChunk when we get to the last - block (which may be smaller than sizeChunk). */ + block (which may be smaller than the original sizeChunk). */ if (sizeData >= sizeRed && sizeData - sizeRed < sizeChunk) { - sizeChunk = sizeData - sizeRed; + sizeChunk = AIR_CAST(unsigned int, sizeData - sizeRed); } } if (error) { @@ -188,12 +195,12 @@ const Nrrd *nrrd, NrrdIoState *nio) { static const char me[]="_nrrdEncodingGzip_write"; #if TEEM_ZLIB - size_t sizeData, sizeWrit, sizeChunk; + size_t sizeData, sizeWrit; int fmt_i=0, error; const char *data; char fmt[4]; gzFile gzfout; - unsigned int wrote; + unsigned int wrote, sizeChunk; sizeData = nrrdElementSize(nrrd)*elNum; @@ -223,18 +230,16 @@ /* zlib can only handle data sizes up to UINT_MAX ==> if there's more than UINT_MAX bytes to write out, we write out in chunks */ - sizeChunk = AIR_MIN(sizeData, UINT_MAX); + sizeChunk = AIR_CAST(unsigned int, AIR_MIN(sizeData, UINT_MAX)); /* keeps track of what how much has been successfully written */ sizeWrit = 0; /* Pointer to the chunks as we write them. */ data = AIR_CAST(const char *, _data); - /* Ok, now we can begin writing. Cast on third arg ok because of - AIR_MIN use above */ + /* Ok, now we can begin writing. */ while ((error = _nrrdGzWrite(gzfout, AIR_CVOIDP(data), - AIR_CAST(unsigned int, sizeChunk), - &wrote)) == 0 + sizeChunk, &wrote)) == 0 && wrote > 0) { /* Increment the data pointer to the next available spot. */ data += wrote; @@ -242,11 +247,11 @@ /* We only want to write as much data as we need, so we need to check to make sure that we don't write more data than is there. This will reduce sizeChunk when we get to the last block (which may - be smaller than sizeChunk). + be smaller than the original sizeChunk). */ if (sizeData >= sizeWrit - && (unsigned int)(sizeData - sizeWrit) < sizeChunk) - sizeChunk = sizeData - sizeWrit; + && sizeData - sizeWrit < sizeChunk) + sizeChunk = AIR_CAST(unsigned int, sizeData - sizeWrit); } if (error) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |