--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: buster
User: release.debian....@packages.debian.org
Usertags: pu
* CVE-2020-25693: Fix multiple heap buffer overflows.
(Closes: #973770)
This is a headers-only library, the only user in buster needs
to be rebuilt:
nmu beads_1.1.18+dfsg-3 . ANY . buster . 'Rebuild with cimg-dev
2.4.5+dfsg-1+deb10u1'
dw beads_1.1.18+dfsg-3 . ANY . buster . -m 'cimg-dev (>=
2.4.5+dfsg-1+deb10u1)'
diff -Nru cimg-2.4.5+dfsg/debian/changelog cimg-2.4.5+dfsg/debian/changelog
--- cimg-2.4.5+dfsg/debian/changelog 2019-01-30 12:43:23.000000000 +0200
+++ cimg-2.4.5+dfsg/debian/changelog 2022-01-16 16:24:14.000000000 +0200
@@ -1,3 +1,11 @@
+cimg (2.4.5+dfsg-1+deb10u1) buster; urgency=medium
+
+ * Non-maintainer upload.
+ * CVE-2020-25693: Fix multiple heap buffer overflows.
+ (Closes: #973770)
+
+ -- Adrian Bunk <b...@debian.org> Sun, 16 Jan 2022 16:24:14 +0200
+
cimg (2.4.5+dfsg-1) unstable; urgency=medium
[ Jelmer Vernooij ]
diff -Nru
cimg-2.4.5+dfsg/debian/patches/0001-Fix-multiple-heap-buffer-overflows.patch
cimg-2.4.5+dfsg/debian/patches/0001-Fix-multiple-heap-buffer-overflows.patch
---
cimg-2.4.5+dfsg/debian/patches/0001-Fix-multiple-heap-buffer-overflows.patch
1970-01-01 02:00:00.000000000 +0200
+++
cimg-2.4.5+dfsg/debian/patches/0001-Fix-multiple-heap-buffer-overflows.patch
2022-01-16 16:24:14.000000000 +0200
@@ -0,0 +1,184 @@
+From d21c5afc86536154bacab02decc38ead2c77189f Mon Sep 17 00:00:00 2001
+From: Kai Dietrich <kai.dietr...@meelogic.com>
+Date: Thu, 22 Oct 2020 08:16:07 +0200
+Subject: Fix multiple heap buffer overflows
+
+The size calculation pattern (size_t)size_x*size_y*size_z*size_c can
+overflow the resulting size_t. Especially on 32bit size_t platforms this
+is trivial and can be achieved using a simple PNM image, e.g. the
+following ASCII PNM would allocate only 6 byte and result in a trivial
+arbitrary heap write:
+P3
+2147483649 2
+255
+255
+255
+255
+255
+255
+255
+255
+255
+255
+255
+255
+255
+255
+255
+...
+---
+ CImg.h | 47 ++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 34 insertions(+), 13 deletions(-)
+
+diff --git a/CImg.h b/CImg.h
+index 20f1fc6..62be2ce 100644
+--- a/CImg.h
++++ b/CImg.h
+@@ -11459,6 +11459,27 @@ namespace cimg_library_suffixed {
+ **/
+
CImg():_width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) {}
+
++ size_t _safe_size(const unsigned int size_x, const unsigned int size_y,
++ const unsigned int size_z, const unsigned int size_c)
const
++ {
++ const unsigned int dim[4] = {size_x, size_y, size_z, size_c};
++ size_t size = 1;
++ int overflows = 0;
++ for (int d = 0; d < sizeof(dim)/sizeof(dim[0]); d++) {
++ if (dim[d]>1 && size*dim[d] <= size) { overflows++; }
++ size *= dim[d];
++ }
++ if (sizeof(T)>1 && size*sizeof(T) <= size) { overflows++; }
++ if (overflows != 0) {
++ throw CImgArgumentException(_cimg_instance
++ "_safe_size(): Invalid size - size_t overflow"
++ "(%u,%u,%u,%u).",
++ cimg_instance,
++ size_x, size_y, size_z, size_c);
++ }
++ return size;
++ }
++
+ //! Construct image with specified size.
+ /**
+ \param size_x Image width().
+@@ -11485,7 +11506,7 @@ namespace cimg_library_suffixed {
+ explicit CImg(const unsigned int size_x, const unsigned int size_y=1,
+ const unsigned int size_z=1, const unsigned int size_c=1):
+ _is_shared(false) {
+- size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (siz) {
+ _width = size_x; _height = size_y; _depth = size_z; _spectrum =
size_c;
+ try { _data = new T[siz]; } catch (...) {
+@@ -11517,7 +11538,7 @@ namespace cimg_library_suffixed {
+ CImg(const unsigned int size_x, const unsigned int size_y,
+ const unsigned int size_z, const unsigned int size_c, const T&
value):
+ _is_shared(false) {
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (siz) {
+ _width = size_x; _height = size_y; _depth = size_z; _spectrum =
size_c;
+ try { _data = new T[siz]; } catch (...) {
+@@ -11578,7 +11599,7 @@ namespace cimg_library_suffixed {
+ } \
+ }
+ assign(size_x,size_y,size_z,size_c);
+-
_CImg_stdarg(*this,value0,value1,(size_t)size_x*size_y*size_z*size_c,int);
++
_CImg_stdarg(*this,value0,value1,_safe_size(size_x,size_y,size_z,size_c),int);
+ }
+
+ #if cimg_use_cpp11==1
+@@ -11707,7 +11728,7 @@ namespace cimg_library_suffixed {
+ const double value0, const double value1, ...):
+ _width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) {
+ assign(size_x,size_y,size_z,size_c);
+-
_CImg_stdarg(*this,value0,value1,(size_t)size_x*size_y*size_z*size_c,double);
++
_CImg_stdarg(*this,value0,value1,_safe_size(size_x,size_y,size_z,size_c),double);
+ }
+
+ //! Construct image with specified size and initialize pixel values from
a value string.
+@@ -11742,7 +11763,7 @@ namespace cimg_library_suffixed {
+ **/
+ CImg(const unsigned int size_x, const unsigned int size_y, const unsigned
int size_z, const unsigned int size_c,
+ const char *const values, const bool repeat_values):_is_shared(false) {
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (siz) {
+ _width = size_x; _height = size_y; _depth = size_z; _spectrum =
size_c;
+ try { _data = new T[siz]; } catch (...) {
+@@ -11798,7 +11819,7 @@ namespace cimg_library_suffixed {
+ cimg_instance,
+
size_x,size_y,size_z,size_c,CImg<t>::pixel_type());
+ }
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (values && siz) {
+ _width = size_x; _height = size_y; _depth = size_z; _spectrum =
size_c;
+ try { _data = new T[siz]; } catch (...) {
+@@ -11817,7 +11838,7 @@ namespace cimg_library_suffixed {
+ //! Construct image with specified size and initialize pixel values from
a memory buffer \specialization.
+ CImg(const T *const values, const unsigned int size_x, const unsigned int
size_y=1,
+ const unsigned int size_z=1, const unsigned int size_c=1, const bool
is_shared=false) {
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (values && siz) {
+ _width = size_x; _height = size_y; _depth = size_z; _spectrum =
size_c; _is_shared = is_shared;
+ if (_is_shared) _data = const_cast<T*>(values);
+@@ -12063,7 +12084,7 @@ namespace cimg_library_suffixed {
+ **/
+ CImg<T>& assign(const unsigned int size_x, const unsigned int size_y=1,
+ const unsigned int size_z=1, const unsigned int size_c=1)
{
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (!siz) return assign();
+ const size_t curr_siz = (size_t)size();
+ if (siz!=curr_siz) {
+@@ -12106,7 +12127,7 @@ namespace cimg_library_suffixed {
+ const unsigned int size_z, const unsigned int size_c,
+ const int value0, const int value1, ...) {
+ assign(size_x,size_y,size_z,size_c);
+-
_CImg_stdarg(*this,value0,value1,(size_t)size_x*size_y*size_z*size_c,int);
++
_CImg_stdarg(*this,value0,value1,_safe_size(size_x,size_y,size_z,size_c),int);
+ return *this;
+ }
+
+@@ -12118,7 +12139,7 @@ namespace cimg_library_suffixed {
+ const unsigned int size_z, const unsigned int size_c,
+ const double value0, const double value1, ...) {
+ assign(size_x,size_y,size_z,size_c);
+-
_CImg_stdarg(*this,value0,value1,(size_t)size_x*size_y*size_z*size_c,double);
++
_CImg_stdarg(*this,value0,value1,_safe_size(size_x,size_y,size_z,size_c),double);
+ return *this;
+ }
+
+@@ -12139,7 +12160,7 @@ namespace cimg_library_suffixed {
+ template<typename t>
+ CImg<T>& assign(const t *const values, const unsigned int size_x, const
unsigned int size_y=1,
+ const unsigned int size_z=1, const unsigned int size_c=1)
{
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (!values || !siz) return assign();
+ assign(size_x,size_y,size_z,size_c);
+ const t *ptrs = values; cimg_for(*this,ptrd,T) *ptrd = (T)*(ptrs++);
+@@ -12149,7 +12170,7 @@ namespace cimg_library_suffixed {
+ //! Construct image with specified size and initialize pixel values from
a memory buffer \specialization.
+ CImg<T>& assign(const T *const values, const unsigned int size_x, const
unsigned int size_y=1,
+ const unsigned int size_z=1, const unsigned int size_c=1)
{
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (!values || !siz) return assign();
+ const size_t curr_siz = (size_t)size();
+ if (values==_data && siz==curr_siz) return
assign(size_x,size_y,size_z,size_c);
+@@ -12189,7 +12210,7 @@ namespace cimg_library_suffixed {
+ //! Construct image with specified size and initialize pixel values from
a memory buffer \overloading.
+ CImg<T>& assign(const T *const values, const unsigned int size_x, const
unsigned int size_y,
+ const unsigned int size_z, const unsigned int size_c,
const bool is_shared) {
+- const size_t siz = (size_t)size_x*size_y*size_z*size_c;
++ const size_t siz = _safe_size(size_x,size_y,size_z,size_c);
+ if (!values || !siz) return assign();
+ if (!is_shared) { if (_is_shared) assign();
assign(values,size_x,size_y,size_z,size_c); }
+ else {
+--
+2.20.1
+
diff -Nru cimg-2.4.5+dfsg/debian/patches/series
cimg-2.4.5+dfsg/debian/patches/series
--- cimg-2.4.5+dfsg/debian/patches/series 2019-01-30 12:43:23.000000000
+0200
+++ cimg-2.4.5+dfsg/debian/patches/series 2022-01-16 16:24:14.000000000
+0200
@@ -1,2 +1,3 @@
30_do_not_build_minc2_examples.patch
# fix_privacy_breach.patch
+0001-Fix-multiple-heap-buffer-overflows.patch
--- End Message ---