Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP7:GA
openexr
openexr-CVE-2021-3479.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File openexr-CVE-2021-3479.patch of Package openexr
Index: openexr-2.2.1/IlmImf/ImfInputFile.cpp =================================================================== --- openexr-2.2.1.orig/IlmImf/ImfInputFile.cpp 2021-04-08 14:57:22.846573803 +0200 +++ openexr-2.2.1/IlmImf/ImfInputFile.cpp 2021-04-08 15:13:24.275790861 +0200 @@ -272,9 +272,14 @@ bufferedReadPixels (InputFile::Data* ifd // // We don't have any valid buffered info, so we need to read in // from the file. + // if no channels are being read that are present in file, cachedBuffer will be empty // - ifd->tFile->readTiles (0, ifd->tFile->numXTiles (0) - 1, j, j); + if (ifd->cachedBuffer->begin() != ifd->cachedBuffer->end()) + { + ifd->tFile->readTiles (0, ifd->tFile->numXTiles (0) - 1, j, j); + } + ifd->cachedTileY = j; } @@ -283,55 +288,135 @@ bufferedReadPixels (InputFile::Data* ifd // framebuffer. // - for (FrameBuffer::ConstIterator k = ifd->cachedBuffer->begin(); - k != ifd->cachedBuffer->end(); + for (FrameBuffer::ConstIterator k = ifd->tFileBuffer.begin(); + k != ifd->tFileBuffer.end(); ++k) { - Slice fromSlice = k.slice(); // slice to write from - Slice toSlice = ifd->tFileBuffer[k.name()]; // slice to write to - char *fromPtr, *toPtr; - int size = pixelTypeSize (toSlice.type); - int xStart = levelRange.min.x; - int yStart = minYThisRow; + Slice toSlice = k.slice(); // slice to read from + char* toPtr; + + int xStart = levelRange.min.x; + int yStart = minYThisRow; - while (modp (xStart, toSlice.xSampling) != 0) - ++xStart; + while (modp (xStart, toSlice.xSampling) != 0) + ++xStart; - while (modp (yStart, toSlice.ySampling) != 0) - ++yStart; + while (modp (yStart, toSlice.ySampling) != 0) + ++yStart; - for (int y = yStart; - y <= maxYThisRow; - y += toSlice.ySampling) + FrameBuffer::ConstIterator c = ifd->cachedBuffer->find(k.name()); + intptr_t toBase = reinterpret_cast<intptr_t>(toSlice.base); + + + if( c!=ifd->cachedBuffer->end()) { - // - // Set the pointers to the start of the y scanline in - // this row of tiles - // - - fromPtr = fromSlice.base + - (y - tileRange.min.y) * fromSlice.yStride + - xStart * fromSlice.xStride; - - toPtr = toSlice.base + - divp (y, toSlice.ySampling) * toSlice.yStride + - divp (xStart, toSlice.xSampling) * toSlice.xStride; - - // - // Copy all pixels for the scanline in this row of tiles - // - - for (int x = xStart; - x <= levelRange.max.x; - x += toSlice.xSampling) + // + // output channel was read from source image: copy to output slice + // + Slice fromSlice = c.slice(); // slice to write to + intptr_t fromBase = reinterpret_cast<intptr_t>(fromSlice.base); + + int size = pixelTypeSize (toSlice.type); + char* fromPtr; + + for (int y = yStart; + y <= maxYThisRow; + y += toSlice.ySampling) { - for (int i = 0; i < size; ++i) - toPtr[i] = fromPtr[i]; + // + // Set the pointers to the start of the y scanline in + // this row of tiles + // + + fromPtr = reinterpret_cast<char*> (fromBase + + (y - tileRange.min.y) * fromSlice.yStride + + xStart * fromSlice.xStride); + + toPtr = reinterpret_cast<char*> (toBase + + divp (y, toSlice.ySampling) * toSlice.yStride + + divp (xStart, toSlice.xSampling) * toSlice.xStride); + + // + // Copy all pixels for the scanline in this row of tiles + // + + for (int x = xStart; + x <= levelRange.max.x; + x += toSlice.xSampling) + { + for (int i = 0; i < size; ++i) + toPtr[i] = fromPtr[i]; + + fromPtr += fromSlice.xStride * toSlice.xSampling; + toPtr += toSlice.xStride; + } + } + } + else + { + + // + // channel wasn't present in source file: fill output slice + // + for (int y = yStart; + y <= maxYThisRow; + y += toSlice.ySampling) + { + + toPtr = reinterpret_cast<char*> (toBase+ + divp (y, toSlice.ySampling) * toSlice.yStride + + divp (xStart, toSlice.xSampling) * toSlice.xStride); + + // + // Copy all pixels for the scanline in this row of tiles + // + + switch ( toSlice.type) + { + case UINT: + { + unsigned int fill = toSlice.fillValue; + for (int x = xStart; + x <= levelRange.max.x; + x += toSlice.xSampling) + { + * reinterpret_cast<unsigned int*>(toPtr) = fill; + toPtr += toSlice.xStride; + } + break; + } + case HALF : + { + half fill = toSlice.fillValue; + for (int x = xStart; + x <= levelRange.max.x; + x += toSlice.xSampling) + { + * reinterpret_cast<half*>(toPtr) = fill; + toPtr += toSlice.xStride; + } + break; + } + case FLOAT : + { + float fill = toSlice.fillValue; + for (int x = xStart; + x <= levelRange.max.x; + x += toSlice.xSampling) + { + * reinterpret_cast<float*>(toPtr) = fill; + toPtr += toSlice.xStride; + } + break; + } + case NUM_PIXELTYPES : + { + break; + } - fromPtr += fromSlice.xStride * toSlice.xSampling; - toPtr += toSlice.xStride; + } } } } @@ -696,60 +781,67 @@ InputFile::setFrameBuffer (const FrameBu { Slice s = k.slice(); - switch (s.type) - { - case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: - - _data->cachedBuffer->insert - (k.name(), - Slice (UINT, - (char *)(new unsigned int[tileRowSize] - - _data->offset), - sizeof (unsigned int), - sizeof (unsigned int) * - _data->tFile->levelWidth(0), - 1, 1, - s.fillValue, - false, true)); - break; - - case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: - - _data->cachedBuffer->insert - (k.name(), - Slice (HALF, - (char *)(new half[tileRowSize] - - _data->offset), - sizeof (half), - sizeof (half) * - _data->tFile->levelWidth(0), - 1, 1, - s.fillValue, - false, true)); - break; - - case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: - - _data->cachedBuffer->insert - (k.name(), - Slice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, - (char *)(new float[tileRowSize] - - _data->offset), - sizeof(float), - sizeof(float) * - _data->tFile->levelWidth(0), - 1, 1, - s.fillValue, - false, true)); - break; + // + // omit adding channels that are not listed - 'fill' channels are added later + // + if ( _data->header.channels().find(k.name()) != _data->header.channels().end() ) + { + switch (s.type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + _data->cachedBuffer->insert + (k.name(), + Slice (UINT, + (char *)(new unsigned int[tileRowSize] - + _data->offset), + sizeof (unsigned int), + sizeof (unsigned int) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + _data->cachedBuffer->insert + (k.name(), + Slice (HALF, + (char *)(new half[tileRowSize] - + _data->offset), + sizeof (half), + sizeof (half) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + _data->cachedBuffer->insert + (k.name(), + Slice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, + (char *)(new float[tileRowSize] - + _data->offset), + sizeof(float), + sizeof(float) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; - default: + default: - throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); - } + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } } _data->tFile->setFrameBuffer (*_data->cachedBuffer); + } _data->tFileBuffer = frameBuffer;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor