Mercurial > hg > orthanc
changeset 6654:68675600a967 machine-spirits
added safeguards in ImageAccessor.cpp
| author | Sebastien Jodogne <s.jodogne@gmail.com> |
|---|---|
| date | Fri, 20 Mar 2026 14:37:15 +0100 |
| parents | 2640cf0fba20 |
| children | 6ea250bc6f68 |
| files | OrthancFramework/Sources/Images/ImageAccessor.cpp OrthancFramework/Sources/Images/ImageBuffer.cpp |
| diffstat | 2 files changed, 43 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/OrthancFramework/Sources/Images/ImageAccessor.cpp Fri Mar 20 14:17:28 2026 +0100 +++ b/OrthancFramework/Sources/Images/ImageAccessor.cpp Fri Mar 20 14:37:15 2026 +0100 @@ -165,7 +165,14 @@ { if (buffer_ != NULL) { - return buffer_ + static_cast<size_t>(y) * static_cast<size_t>(pitch_); + if (y < height_) + { + return buffer_ + static_cast<size_t>(y) * static_cast<size_t>(pitch_); + } + else + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } } else { @@ -184,7 +191,14 @@ if (buffer_ != NULL) { - return buffer_ + static_cast<size_t>(y) * static_cast<size_t>(pitch_); + if (y < height_) + { + return buffer_ + static_cast<size_t>(y) * static_cast<size_t>(pitch_); + } + else + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } } else { @@ -210,17 +224,20 @@ unsigned int pitch, const void *buffer) { + const uint64_t size = static_cast<uint64_t>(height) * static_cast<uint64_t>(pitch); + + if (static_cast<uint64_t>(GetBytesPerPixel() * width) > static_cast<uint64_t>(pitch) || + static_cast<uint64_t>(static_cast<size_t>(size)) != size) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + readOnly_ = true; format_ = format; width_ = width; height_ = height; pitch_ = pitch; buffer_ = reinterpret_cast<uint8_t*>(const_cast<void*>(buffer)); - - if (GetBytesPerPixel() * width_ > pitch_) - { - throw OrthancException(ErrorCode_ParameterOutOfRange); - } } void ImageAccessor::GetReadOnlyAccessor(ImageAccessor &target) const @@ -235,17 +252,20 @@ unsigned int pitch, void *buffer) { + const uint64_t size = static_cast<uint64_t>(height) * static_cast<uint64_t>(pitch); + + if (static_cast<uint64_t>(GetBytesPerPixel() * width) > static_cast<uint64_t>(pitch) || + static_cast<uint64_t>(static_cast<size_t>(size)) != size) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + readOnly_ = false; format_ = format; width_ = width; height_ = height; pitch_ = pitch; buffer_ = reinterpret_cast<uint8_t*>(buffer); - - if (GetBytesPerPixel() * width_ > pitch_) - { - throw OrthancException(ErrorCode_ParameterOutOfRange); - } }
--- a/OrthancFramework/Sources/Images/ImageBuffer.cpp Fri Mar 20 14:17:28 2026 +0100 +++ b/OrthancFramework/Sources/Images/ImageBuffer.cpp Fri Mar 20 14:37:15 2026 +0100 @@ -46,8 +46,16 @@ } */ - pitch_ = GetBytesPerPixel() * width_; - size_t size = static_cast<size_t>(pitch_) * static_cast<size_t>(height_); + const uint64_t tmpPitch = static_cast<uint64_t>(GetBytesPerPixel()) * static_cast<uint64_t>(width_); + const uint64_t size = tmpPitch * static_cast<uint64_t>(height_); + + if (static_cast<uint64_t>(static_cast<unsigned int>(tmpPitch)) != tmpPitch || + static_cast<uint64_t>(static_cast<size_t>(size)) != size) + { + throw OrthancException(ErrorCode_NotEnoughMemory); + } + + pitch_ = static_cast<unsigned int>(tmpPitch); if (size == 0) { @@ -55,7 +63,7 @@ } else { - buffer_ = malloc(size); + buffer_ = malloc(static_cast<size_t>(size)); if (buffer_ == NULL) { throw OrthancException(ErrorCode_NotEnoughMemory,
