Your message dated Sat, 12 Sep 2026 08:05:41 +0000
with message-id <[email protected]>
and subject line Released in 13.7
has caused the Debian Bug report #1142984,
regarding trixie-pu: package libraw/0.21.4-2+deb13u1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
1142984: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142984
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: [email protected]
Control: affects -1 + src:libraw
User: [email protected]
Usertags: pu

[ Reason ]

Fix <no-dsa> issues CVE-2026-5342, CVE-2026-20884, CVE-2026-20889,
CVE-2026-21413, CVE-2026-24450 and CVE-2026-24660.

[ Impact ]

Users will remain vulnerable to the afformentioned issues, and will
regress when upgrading upgrading (a fix was uploaded to Bookworm LTS and
Bullseye LTS as part of DLA-4704-1).

[ Tests ]

Manual tests only using the reporter's PoC information.  AFAICT neither
the package nor the upstream code have an automated test suite.

[ Risks ]

Low risk, all changes have been backported from upstream's 0.22.1
version and trivially apply to trixie's 0.21.4 codebase.

[ Checklist ]

  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in stable
  [x] the issue is verified as fixed in unstable

[ Changes ]

  * Fix CVE-2026-5342: nikon_load_padded_packed_raw() out-of-bounds read
    due to missing buffer and dimension validation (closes: #1132655).
  * Fix CVE-2026-20884: deflate_dng_load_raw() integer overflow vulnerability
    (closes: #1133845).
  * Fix CVE-2026-20889: x3f_thumb_loader() heap-based buffer overflow
    vulnerability (closes: #1133845).
  * Fix CVE-2026-21413: lossless_jpeg_load_raw() heap-based buffer overflow
    vulnerability (closes: #1133845).
  * Fix CVE-2026-24450: uncompressed_fp_dng_load_raw() integer overflow
    vulnerability (closes: #1133845).
  * Fix CVE-2026-24660: x3f_load_huffman() heap-based buffer overflow
    vulnerability (closes: #1133845).
  * Add d/salsa-ci.yml for Salsa CI.

[ Other info ]

Debusine workflow output:
https://debusine.debian.net/debian/developers/work-request/940417/

Individual commits and tag can be found on the LTS team fork at
https://salsa.debian.org/lts-team/packages/libraw/-/tree/debian/trixie?ref_type=heads

-- 
Guilhem.
diffstat for libraw-0.21.4 libraw-0.21.4

 changelog                                 |   19 +
 patches/CVE-2026-20884/01-afba34ec3.patch |   69 ++++++
 patches/CVE-2026-20884/02-dae685a19.patch |   36 +++
 patches/CVE-2026-20884/03-aa4458eb5.patch |   61 +++++
 patches/CVE-2026-20889.patch              |   96 ++++++++
 patches/CVE-2026-21413.patch              |   33 ++
 patches/CVE-2026-24450.patch              |   55 ++++
 patches/CVE-2026-24660.patch              |  335 ++++++++++++++++++++++++++++++
 patches/CVE-2026-5342.patch               |   61 +++++
 patches/series                            |    8 
 salsa-ci.yml                              |    9 
 11 files changed, 782 insertions(+)

diff -Nru libraw-0.21.4/debian/changelog libraw-0.21.4/debian/changelog
--- libraw-0.21.4/debian/changelog	2025-04-24 15:52:02.000000000 +0200
+++ libraw-0.21.4/debian/changelog	2026-07-29 03:53:35.000000000 +0200
@@ -1,3 +1,22 @@
+libraw (0.21.4-2+deb13u1) trixie; urgency=high
+
+  * Non-maintainer upload.
+  * Fix CVE-2026-5342: nikon_load_padded_packed_raw() out-of-bounds read
+    due to missing buffer and dimension validation (closes: #1132655).
+  * Fix CVE-2026-20884: deflate_dng_load_raw() integer overflow vulnerability
+    (closes: #1133845).
+  * Fix CVE-2026-20889: x3f_thumb_loader() heap-based buffer overflow
+    vulnerability (closes: #1133845).
+  * Fix CVE-2026-21413: lossless_jpeg_load_raw() heap-based buffer overflow
+    vulnerability (closes: #1133845).
+  * Fix CVE-2026-24450: uncompressed_fp_dng_load_raw() integer overflow
+    vulnerability (closes: #1133845).
+  * Fix CVE-2026-24660: x3f_load_huffman() heap-based buffer overflow
+    vulnerability (closes: #1133845).
+  * Add d/salsa-ci.yml for Salsa CI.
+
+ -- Guilhem Moulin <[email protected]>  Wed, 29 Jul 2026 03:53:35 +0200
+
 libraw (0.21.4-2) unstable; urgency=medium
 
   * Team upload.
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-20884/01-afba34ec3.patch libraw-0.21.4/debian/patches/CVE-2026-20884/01-afba34ec3.patch
--- libraw-0.21.4/debian/patches/CVE-2026-20884/01-afba34ec3.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-20884/01-afba34ec3.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,69 @@
+From: Alex Tutubalin <[email protected]>
+Date: Sun, 28 Dec 2025 19:18:36 +0300
+Subject: implemented RAW size limit check and allocation result check for
+ 4-shot pentax loaded and FP-dng loader
+
+Origin: https://github.com/LibRaw/LibRaw/commit/afba34ec30bf6409891dc096f6be69155ecf6bdb
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2364
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-20884
+---
+ src/decoders/decoders_libraw.cpp | 12 ++++++++++--
+ src/decoders/fp_dng.cpp          |  9 ++++++++-
+ 2 files changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/src/decoders/decoders_libraw.cpp b/src/decoders/decoders_libraw.cpp
+index 952e41a..eb277c3 100644
+--- a/src/decoders/decoders_libraw.cpp
++++ b/src/decoders/decoders_libraw.cpp
+@@ -54,6 +54,10 @@ void LibRaw::sony_arq_load_raw()
+ 
+ void LibRaw::pentax_4shot_load_raw()
+ {
++  size_t alloc_sz = size_t(imgdata.sizes.raw_width) * (size_t(imgdata.sizes.raw_height) + 16) * 4 * sizeof(ushort);
++  if (INT64(alloc_sz) > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024))
++    throw LIBRAW_EXCEPTION_TOOBIG;
++
+ #ifdef LIBRAW_CALLOC_RAWSTORE
+   ushort *plane = (ushort *)calloc(size_t(imgdata.sizes.raw_width) *
+                                    size_t(imgdata.sizes.raw_height), sizeof(ushort));
+@@ -61,13 +65,17 @@ void LibRaw::pentax_4shot_load_raw()
+   ushort *plane = (ushort *)malloc(size_t(imgdata.sizes.raw_width) *
+                                    size_t(imgdata.sizes.raw_height) * sizeof(ushort));
+ #endif
+-  int alloc_sz = imgdata.sizes.raw_width * (imgdata.sizes.raw_height + 16) * 4 *
+-                 sizeof(ushort);
++  if (!plane)
++    throw LIBRAW_EXCEPTION_ALLOC;
++
+ #ifdef LIBRAW_CALLOC_RAWSTORE
+   ushort(*result)[4] = (ushort(*)[4])calloc(alloc_sz,1);
+ #else
+   ushort(*result)[4] = (ushort(*)[4])malloc(alloc_sz);
+ #endif
++  if(!result)
++    throw LIBRAW_EXCEPTION_ALLOC;
++
+   struct movement_t
+   {
+     int row, col;
+diff --git a/src/decoders/fp_dng.cpp b/src/decoders/fp_dng.cpp
+index 4bb8f42..6f82e89 100644
+--- a/src/decoders/fp_dng.cpp
++++ b/src/decoders/fp_dng.cpp
+@@ -350,7 +350,14 @@ void LibRaw::deflate_dng_load_raw()
+       libraw_internal_data.internal_data.input);
+ 
+   if (ifd->sample_format == 3)
+-      float_raw_image = (float *)calloc(tiles.tileCnt * tiles.tileWidth * tiles.tileHeight *ifd->samples, sizeof(float));
++  {
++    INT64 raw_bytes = tiles.tileCnt * tiles.tileWidth * tiles.tileHeight * ifd->samples * sizeof(float);
++    if (raw_bytes > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024))
++      throw LIBRAW_EXCEPTION_TOOBIG;
++    float_raw_image = (float *)calloc(tiles.tileCnt * tiles.tileWidth * tiles.tileHeight * ifd->samples, sizeof(float));
++    if (!float_raw_image)
++      throw LIBRAW_EXCEPTION_ALLOC;
++  }
+   else
+     throw LIBRAW_EXCEPTION_DECODE_RAW; // Only float deflated supported
+ 
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-20884/02-dae685a19.patch libraw-0.21.4/debian/patches/CVE-2026-20884/02-dae685a19.patch
--- libraw-0.21.4/debian/patches/CVE-2026-20884/02-dae685a19.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-20884/02-dae685a19.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,36 @@
+From: Alex Tutubalin <[email protected]>
+Date: Sat, 7 Mar 2026 18:40:05 +0300
+Subject: FP DNG data limit: perform calculations in 64 bit
+
+Origin: https://github.com/LibRaw/LibRaw/commit/dae685a198309b978805f098bafe5d951dbc8747
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2364
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-20884
+---
+ src/decoders/fp_dng.cpp | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/src/decoders/fp_dng.cpp b/src/decoders/fp_dng.cpp
+index 6f82e89..b18ca33 100644
+--- a/src/decoders/fp_dng.cpp
++++ b/src/decoders/fp_dng.cpp
+@@ -376,12 +376,15 @@ void LibRaw::deflate_dng_load_raw()
+     break;
+   }
+ 
+-  unsigned tilePixels = tiles.tileWidth * tiles.tileHeight;
++  INT64 tilePixels =  INT64(tiles.tileWidth) * INT64(tiles.tileHeight);
+   unsigned pixelSize = sizeof(float) * ifd->samples;
+-  unsigned tileBytes = tilePixels * pixelSize;
+-  unsigned tileRowBytes = tiles.tileWidth * pixelSize;
++  INT64 tileBytes = tilePixels * INT64(pixelSize);
++  INT64 tileRowBytes = INT64(tiles.tileWidth) * INT64(pixelSize);
+ 
+-  if(INT64(tiles.maxBytesInTile) > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024) )
++  if(INT64(tiles.maxBytesInTile) > INT64(imgdata.rawparams.max_raw_memory_mb) * 1024LL * 1024LL )
++    throw LIBRAW_EXCEPTION_TOOBIG;
++
++  if (tileBytes + tileRowBytes > INT64(imgdata.rawparams.max_raw_memory_mb) * 1024LL * 1024LL)
+     throw LIBRAW_EXCEPTION_TOOBIG;
+ 
+   std::vector<uchar> cBuffer(tiles.maxBytesInTile,0);
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-20884/03-aa4458eb5.patch libraw-0.21.4/debian/patches/CVE-2026-20884/03-aa4458eb5.patch
--- libraw-0.21.4/debian/patches/CVE-2026-20884/03-aa4458eb5.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-20884/03-aa4458eb5.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,61 @@
+From: Alex Tutubalin <[email protected]>
+Date: Fri, 13 Mar 2026 17:43:47 +0300
+Subject: Fix for data size calculation integer overflow in float/deflated DNG
+ loader (TALOS-2026-2364); Check for read results
+
+Origin: https://github.com/LibRaw/LibRaw/commit/aa4458eb511daeae90676c1ce5c587106e4aaec1
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2364
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-20884
+---
+ src/decoders/fp_dng.cpp | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/src/decoders/fp_dng.cpp b/src/decoders/fp_dng.cpp
+index b18ca33..c460373 100644
+--- a/src/decoders/fp_dng.cpp
++++ b/src/decoders/fp_dng.cpp
+@@ -349,14 +349,28 @@ void LibRaw::deflate_dng_load_raw()
+   tiles.init(ifd, imgdata.sizes, libraw_internal_data.unpacker_data, libraw_internal_data.unpacker_data.order,
+       libraw_internal_data.internal_data.input);
+ 
++  if (tiles.tBytes.size() < 1)
++	  throw LIBRAW_EXCEPTION_IO_CORRUPT;
++
++  // Ensure less then 2GB per compressed tile
++  INT64 maxcomprlen = tiles.tBytes[0];
++  for (int i = 1; i < tiles.tBytes.size(); i++)
++	  maxcomprlen = MAX(maxcomprlen, tiles.tBytes[i]);
++
++  if(maxcomprlen >= (1LL << 31) || maxcomprlen < 0)
++	  throw LIBRAW_EXCEPTION_TOOBIG;
++  
++  // Max bytes: 2^16 raw width * 2^2 bytes/pixel * 2^2 channels = 2^20, so check against 2^22
++  INT64 rowbytes = INT64(MAX(tiles.tileWidth, imgdata.sizes.raw_width)) * 4ULL * INT64(ifd->samples);
++  if (rowbytes > (1LL << 22))
++    throw LIBRAW_EXCEPTION_TOOBIG;
++
+   if (ifd->sample_format == 3)
+   {
+-    INT64 raw_bytes = tiles.tileCnt * tiles.tileWidth * tiles.tileHeight * ifd->samples * sizeof(float);
++    INT64 raw_bytes = INT64(tiles.tileCnt) * INT64(tiles.tileWidth) * INT64(tiles.tileHeight) * INT64(ifd->samples) * sizeof(float);
+     if (raw_bytes > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024))
+       throw LIBRAW_EXCEPTION_TOOBIG;
+-    float_raw_image = (float *)calloc(tiles.tileCnt * tiles.tileWidth * tiles.tileHeight * ifd->samples, sizeof(float));
+-    if (!float_raw_image)
+-      throw LIBRAW_EXCEPTION_ALLOC;
++    float_raw_image = (float *)calloc(raw_bytes, 1);
+   }
+   else
+     throw LIBRAW_EXCEPTION_DECODE_RAW; // Only float deflated supported
+@@ -395,7 +409,9 @@ void LibRaw::deflate_dng_load_raw()
+       for (size_t x = 0; x < imgdata.sizes.raw_width; x += tiles.tileWidth, ++t)
+       {
+         libraw_internal_data.internal_data.input->seek(tiles.tOffsets[t], SEEK_SET);
+-        libraw_internal_data.internal_data.input->read(cBuffer.data(), 1, tiles.tBytes[t]);
++        int bytesread = libraw_internal_data.internal_data.input->read(cBuffer.data(), 1, tiles.tBytes[t]);
++		if (bytesread < tiles.tBytes[t])
++			derror();
+         unsigned long dstLen = tileBytes;
+         int err =
+             uncompress(uBuffer.data() + tileRowBytes, &dstLen, cBuffer.data(), (unsigned long)tiles.tBytes[t]);
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-20889.patch libraw-0.21.4/debian/patches/CVE-2026-20889.patch
--- libraw-0.21.4/debian/patches/CVE-2026-20889.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-20889.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,96 @@
+From: Alex Tutubalin <[email protected]>
+Date: Sun, 1 Mar 2026 19:54:16 +0300
+Subject: Fix for TALOS-2026-2358
+
+Origin: https://github.com/LibRaw/LibRaw/commit/b9809e410d07ca7bf408e6d036615fb34f8c47cc
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2358
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-20889
+---
+ src/decoders/unpack_thumb.cpp |  2 ++
+ src/x3f/x3f_parse_process.cpp | 20 ++++++++++++++++++--
+ src/x3f/x3f_utils_patched.cpp |  7 +++++++
+ 3 files changed, 27 insertions(+), 2 deletions(-)
+
+diff --git a/src/decoders/unpack_thumb.cpp b/src/decoders/unpack_thumb.cpp
+index df30da1..f79b0bb 100644
+--- a/src/decoders/unpack_thumb.cpp
++++ b/src/decoders/unpack_thumb.cpp
+@@ -387,6 +387,8 @@ int LibRaw::unpack_thumb(void)
+       {
+         x3f_thumb_loader();
+         SET_PROC_FLAG(LIBRAW_PROGRESS_THUMB_LOAD);
++		if (!T.twidth && !T.theight)
++			return LIBRAW_NO_THUMBNAIL;
+         return 0;
+       }
+ #endif
+diff --git a/src/x3f/x3f_parse_process.cpp b/src/x3f/x3f_parse_process.cpp
+index 354e467..9742c8e 100644
+--- a/src/x3f/x3f_parse_process.cpp
++++ b/src/x3f/x3f_parse_process.cpp
+@@ -322,6 +322,7 @@ void LibRaw::x3f_thumb_loader()
+ {
+   try
+   {
++    INT64 checked_size = x3f_thumb_size(); // This value was checked at upper level?
+     x3f_t *x3f = (x3f_t *)_x3f_data;
+     if (!x3f)
+       return; // No data pointer set
+@@ -339,12 +340,24 @@ void LibRaw::x3f_thumb_loader()
+     imgdata.thumbnail.tcolors = 3;
+     if (imgdata.thumbnail.tformat == LIBRAW_THUMBNAIL_JPEG)
+     {
+-      imgdata.thumbnail.thumb = (char *)malloc(ID->data_size);
++	  INT64 alloc_size = ID->data_size;
++	  if ((alloc_size > 2 * checked_size) || (alloc_size > 1024LL * 1024LL * LIBRAW_MAX_THUMBNAIL_MB))
++		  throw LIBRAW_EXCEPTION_TOOBIG;
++	  if(alloc_size < 64LL)
++        throw LIBRAW_EXCEPTION_IO_CORRUPT;
++
++	  imgdata.thumbnail.thumb = (char *)malloc(ID->data_size);
+       memmove(imgdata.thumbnail.thumb, ID->data, ID->data_size);
+       imgdata.thumbnail.tlength = ID->data_size;
+     }
+     else if (imgdata.thumbnail.tformat == LIBRAW_THUMBNAIL_BITMAP)
+     {
++      INT64 alloc_size = INT64(ID->columns) * INT64(ID->rows) * 3LL;
++	  if ((alloc_size > 2 * checked_size) ||
++          (alloc_size > 1024LL * 1024LL * LIBRAW_MAX_THUMBNAIL_MB)) throw LIBRAW_EXCEPTION_TOOBIG;
++      if (alloc_size < 64LL)
++        throw LIBRAW_EXCEPTION_IO_CORRUPT;
++
+       imgdata.thumbnail.tlength = ID->columns * ID->rows * 3;
+       imgdata.thumbnail.thumb = (char *)malloc(ID->columns * ID->rows * 3);
+       char *src0 = (char *)ID->data;
+@@ -361,7 +374,10 @@ void LibRaw::x3f_thumb_loader()
+   }
+   catch (...)
+   {
+-    // do nothing
++    // no rethrow: handled at upper level
++    imgdata.thumbnail.twidth = 0;
++    imgdata.thumbnail.theight = 0;
++    imgdata.thumbnail.tcolors = 0;
+   }
+ }
+ 
+diff --git a/src/x3f/x3f_utils_patched.cpp b/src/x3f/x3f_utils_patched.cpp
+index 6b20b90..21c7ab1 100644
+--- a/src/x3f/x3f_utils_patched.cpp
++++ b/src/x3f/x3f_utils_patched.cpp
+@@ -1221,7 +1221,14 @@ static uint32_t read_data_block(void **data, x3f_info_t *I,
+   if (fpos + size > I->input.file->size())
+     throw LIBRAW_EXCEPTION_IO_CORRUPT;
+ 
++  // All known files from real cameras are many times smaller than 1 GB, so the hard limit is OK here.
++
++  if(size > 1024*1024*1024)
++    throw LIBRAW_EXCEPTION_ALLOC;
++
+   *data = (void *)malloc(size);
++  if (!*data)
++	  throw LIBRAW_EXCEPTION_ALLOC;
+ 
+   GETN(*data, size);
+ 
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-21413.patch libraw-0.21.4/debian/patches/CVE-2026-21413.patch
--- libraw-0.21.4/debian/patches/CVE-2026-21413.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-21413.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,33 @@
+From: Alex Tutubalin <[email protected]>
+Date: Sat, 28 Feb 2026 18:26:53 +0300
+Subject: Fix for TALOS-2026-2331
+
+Origin: https://github.com/LibRaw/LibRaw/commit/75ed2c12a35b765b3b6ad695cc1f044f19efe644
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2331
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-21413
+---
+ src/decoders/decoders_dcraw.cpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/decoders/decoders_dcraw.cpp b/src/decoders/decoders_dcraw.cpp
+index 183136b..fc73e6c 100644
+--- a/src/decoders/decoders_dcraw.cpp
++++ b/src/decoders/decoders_dcraw.cpp
+@@ -560,6 +560,7 @@ void LibRaw::lossless_jpeg_load_raw()
+   if (jh.clrs == 4 && jwide >= raw_width * 2)
+     jhigh *= 2;
+ 
++  
+   try
+   {
+     for (jrow = 0; jrow < jh.high; jrow++)
+@@ -588,7 +589,7 @@ void LibRaw::lossless_jpeg_load_raw()
+           col += (row--, raw_width);
+         if (row > raw_height)
+           throw LIBRAW_EXCEPTION_IO_CORRUPT;
+-        if ((unsigned)row < raw_height)
++        if (((unsigned)row < raw_height) && ((unsigned)col < raw_width))
+           RAW(row, col) = val;
+         if (++col >= raw_width)
+           col = (row++, 0);
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-24450.patch libraw-0.21.4/debian/patches/CVE-2026-24450.patch
--- libraw-0.21.4/debian/patches/CVE-2026-24450.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-24450.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,55 @@
+From: Alex Tutubalin <[email protected]>
+Date: Thu, 12 Mar 2026 20:34:53 +0300
+Subject: Fix for TALOS-2026-2363: avoid integer overflow in allocation size
+ calculation. Also: check for EOF in read loop
+
+Origin: https://github.com/LibRaw/LibRaw/commit/c911c9b9edffa5fab99f828d0fee6dd2d0f6105f
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2363
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-24450
+---
+ src/decoders/fp_dng.cpp | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/src/decoders/fp_dng.cpp b/src/decoders/fp_dng.cpp
+index df7fe6c..4bb8f42 100644
+--- a/src/decoders/fp_dng.cpp
++++ b/src/decoders/fp_dng.cpp
+@@ -611,12 +611,17 @@ void LibRaw::uncompressed_fp_dng_load_raw()
+     tiles.init(ifd, imgdata.sizes, libraw_internal_data.unpacker_data, libraw_internal_data.unpacker_data.order,
+         libraw_internal_data.internal_data.input);
+ 
++	// Max bytes: 2^16 raw width * 2^2 bytes/pixel * 2^2 channels = 2^20, so check against 2^22
++	INT64 rowbytes = INT64(MAX(tiles.tileWidth, imgdata.sizes.raw_width)) * INT64(MAX(bytesps,4)) * INT64(ifd->samples);
++	if(rowbytes > (1LL << 22))
++      throw LIBRAW_EXCEPTION_TOOBIG;
++
+ 	INT64 allocsz = INT64(tiles.tileCnt) * INT64(tiles.tileWidth) * INT64(tiles.tileHeight) * INT64(ifd->samples) * INT64(sizeof(float));
+ 	if (allocsz > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024))
+ 		throw LIBRAW_EXCEPTION_TOOBIG;
+ 
+     if (ifd->sample_format == 3)
+-        float_raw_image = (float *)calloc(tiles.tileCnt * tiles.tileWidth * tiles.tileHeight *ifd->samples, sizeof(float));
++        float_raw_image = (float *)calloc(allocsz,1);
+     else
+         throw LIBRAW_EXCEPTION_DECODE_RAW; // Only float supported
+ 
+@@ -633,6 +638,7 @@ void LibRaw::uncompressed_fp_dng_load_raw()
+             size_t rowsInTile = y + tiles.tileHeight > imgdata.sizes.raw_height ? imgdata.sizes.raw_height - y : tiles.tileHeight;
+             size_t colsInTile = x + tiles.tileWidth > imgdata.sizes.raw_width ? imgdata.sizes.raw_width - x : tiles.tileWidth;
+ 
++			// inrowbytes is less then 2^22 (see above) so conversion to int is safe
+             size_t inrowbytes = colsInTile * bytesps * ifd->samples;
+             int fullrowbytes = tiles.tileWidth *bytesps * ifd->samples;
+             size_t outrowbytes = colsInTile * sizeof(float) * ifd->samples;
+@@ -642,7 +648,9 @@ void LibRaw::uncompressed_fp_dng_load_raw()
+                 unsigned char *dst = fullrowbytes > inrowbytes ? rowbuf.data(): // last tile in row, use buffer
+                     (unsigned char *)&float_raw_image
+                     [((y + row) * imgdata.sizes.raw_width + x) * ifd->samples];
+-                libraw_internal_data.internal_data.input->read(dst, 1, fullrowbytes);
++                int bytesread = libraw_internal_data.internal_data.input->read(dst, 1, fullrowbytes);
++				if (bytesread < fullrowbytes)
++					derror();
+                 if (bytesps == 2 && difford)
+                     libraw_swab(dst, fullrowbytes);
+                 else if (bytesps == 3 && (libraw_internal_data.unpacker_data.order == 0x4949)) // II-16bit
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-24660.patch libraw-0.21.4/debian/patches/CVE-2026-24660.patch
--- libraw-0.21.4/debian/patches/CVE-2026-24660.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-24660.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,335 @@
+From: Alex Tutubalin <[email protected]>
+Date: Wed, 11 Mar 2026 11:57:24 +0300
+Subject: X3F decoder: implemented hard single allocation limit via
+ LIBRAW_X3F_ALLOC_LIMIT_MB define;
+ allocation size calculation converted to 64 bit arithm;
+ fix for TALOS-2026-2359
+
+Origin: https://github.com/LibRaw/LibRaw/commit/ac151a829b8d3e4c74fa3aefa8a029c3cc3f857f
+Bug: https://talosintelligence.com/vulnerability_reports/TALOS-2026-2359
+Bug-Debian: https://bugs.debian.org/1133845
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-24660
+---
+ libraw/libraw_const.h         |   4 ++
+ src/x3f/x3f_utils_patched.cpp | 104 +++++++++++++++++++++++++-----------------
+ 2 files changed, 67 insertions(+), 41 deletions(-)
+
+diff --git a/libraw/libraw_const.h b/libraw/libraw_const.h
+index 61f8028..1e32fdf 100644
+--- a/libraw/libraw_const.h
++++ b/libraw/libraw_const.h
+@@ -55,6 +55,10 @@ it under the terms of the one of two licenses as you choose:
+ #endif
+ 
+ 
++/* max data size for known foveon cameras: 30mpix * 3 channels * 2 bytes = 180Mb, so 512Mb is OK for everything until/if new cameras will arrive */
++#ifndef LIBRAW_X3F_ALLOC_LIMIT_MB
++#define LIBRAW_X3F_ALLOC_LIMIT_MB 512ULL
++#endif
+ 
+ /* LibRaw uses own memory pool management, with LIBRAW_MSIZE (512)
+ entries. It is enough for parsing/decoding non-damaged files, but
+diff --git a/src/x3f/x3f_utils_patched.cpp b/src/x3f/x3f_utils_patched.cpp
+index 21c7ab1..fb1ecc1 100644
+--- a/src/x3f/x3f_utils_patched.cpp
++++ b/src/x3f/x3f_utils_patched.cpp
+@@ -50,6 +50,37 @@ BSD-style License
+ /* Reading and writing - assuming little endian in the file              */
+ /* --------------------------------------------------------------------- */
+ 
++static void *x3f_limited_malloc(UINT64 sz)
++{
++  if (sz > LIBRAW_X3F_ALLOC_LIMIT_MB * 1024ULL * 1024ULL)
++    throw LIBRAW_EXCEPTION_TOOBIG;
++  void *ret = malloc(sz);
++  if (!ret)
++    throw LIBRAW_EXCEPTION_ALLOC;
++  return ret;
++}
++
++static void *x3f_limited_calloc(UINT64 n, UINT64 sz)
++{
++  if (sz * n > LIBRAW_X3F_ALLOC_LIMIT_MB * 1024ULL * 1024ULL)
++    throw LIBRAW_EXCEPTION_TOOBIG;
++  void *ret = calloc(n, sz);
++  if (!ret)
++    throw LIBRAW_EXCEPTION_ALLOC;
++  return ret;
++}
++
++static void *x3f_limited_realloc(void *ptr, UINT64 sz)
++{
++  if (sz > LIBRAW_X3F_ALLOC_LIMIT_MB * 1024ULL * 1024ULL)
++    throw LIBRAW_EXCEPTION_TOOBIG;
++  void *ret = realloc(ptr, sz);
++  if (!ret)
++    throw LIBRAW_EXCEPTION_ALLOC;
++  return ret;
++}
++
++
+ static int x3f_get1(LibRaw_abstract_datastream *f)
+ {
+   /* Little endian file */
+@@ -134,7 +165,7 @@ unsigned x3f_get4(LibRaw_abstract_datastream *f)
+     int _i;                                                                    \
+     (_T).size = (_NUM);                                                        \
+     (_T).element =                                                             \
+-        (_TYPE *)realloc((_T).element, (_NUM) * sizeof((_T).element[0]));      \
++        (_TYPE *)x3f_limited_realloc((_T).element, (_NUM) * sizeof((_T).element[0]));      \
+     for (_i = 0; _i < (int)(_T).size; _i++)                                         \
+       _GETX((_T).element[_i]);                                                 \
+   } while (0)
+@@ -144,7 +175,7 @@ unsigned x3f_get4(LibRaw_abstract_datastream *f)
+   {                                                                            \
+     int _i;                                                                    \
+     (_T).size = (_NUM);                                                        \
+-    (_T).element = (x3f_property_t *)realloc(                                  \
++    (_T).element = (x3f_property_t *)x3f_limited_realloc(                                  \
+         (_T).element, (_NUM) * sizeof((_T).element[0]));                       \
+     for (_i = 0; _i < (int)(_T).size; _i++)                                         \
+     {                                                                          \
+@@ -161,7 +192,7 @@ unsigned x3f_get4(LibRaw_abstract_datastream *f)
+     for (_i = 0;; _i++)                                                        \
+     {                                                                          \
+       (_T).size = _i + 1;                                                      \
+-      (_T).element = (x3f_true_huffman_element_t *)realloc(                    \
++      (_T).element = (x3f_true_huffman_element_t *)x3f_limited_realloc(                    \
+           (_T).element, (_i + 1) * sizeof((_T).element[0]));                   \
+       GET1((_T).element[_i].code_size);                                        \
+       GET1((_T).element[_i].code);                                             \
+@@ -182,7 +213,7 @@ static void new_huffman_tree(x3f_hufftree_t *HTP, int bits)
+ 
+   HTP->free_node_index = 0;
+   HTP->total_node_index = HUF_TREE_MAX_NODES(leaves);
+-  HTP->nodes = (x3f_huffnode_t *)calloc(1, HUF_TREE_MAX_NODES(leaves) *
++  HTP->nodes = (x3f_huffnode_t *)x3f_limited_calloc(1, HUF_TREE_MAX_NODES(leaves) *
+                                                sizeof(x3f_huffnode_t));
+ }
+ 
+@@ -209,7 +240,7 @@ static void cleanup_true(x3f_true_t **TRUP)
+ 
+ static x3f_true_t *new_true(x3f_true_t **TRUP)
+ {
+-  x3f_true_t *TRU = (x3f_true_t *)calloc(1, sizeof(x3f_true_t));
++  x3f_true_t *TRU = (x3f_true_t *)x3f_limited_calloc(1, sizeof(x3f_true_t));
+ 
+   cleanup_true(TRUP);
+ 
+@@ -241,7 +272,7 @@ static void cleanup_quattro(x3f_quattro_t **QP)
+ 
+ static x3f_quattro_t *new_quattro(x3f_quattro_t **QP)
+ {
+-  x3f_quattro_t *Q = (x3f_quattro_t *)calloc(1, sizeof(x3f_quattro_t));
++  x3f_quattro_t *Q = (x3f_quattro_t *)x3f_limited_calloc(1, sizeof(x3f_quattro_t));
+   int i;
+ 
+   cleanup_quattro(QP);
+@@ -286,7 +317,7 @@ static void cleanup_huffman(x3f_huffman_t **HUFP)
+ 
+ static x3f_huffman_t *new_huffman(x3f_huffman_t **HUFP)
+ {
+-  x3f_huffman_t *HUF = (x3f_huffman_t *)calloc(1, sizeof(x3f_huffman_t));
++  x3f_huffman_t *HUF = (x3f_huffman_t *)x3f_limited_calloc(1, sizeof(x3f_huffman_t));
+ 
+   cleanup_huffman(HUFP);
+ 
+@@ -317,9 +348,7 @@ static x3f_huffman_t *new_huffman(x3f_huffman_t **HUFP)
+   if (!infile)
+     return NULL;
+   INT64 fsize = infile->size();
+-  x3f_t *x3f = (x3f_t *)calloc(1, sizeof(x3f_t));
+-  if (!x3f)
+-    throw LIBRAW_EXCEPTION_ALLOC;
++  x3f_t *x3f = (x3f_t *)x3f_limited_calloc(1, sizeof(x3f_t));
+   try
+   {
+     x3f_info_t *I = NULL;
+@@ -383,7 +412,7 @@ static x3f_huffman_t *new_huffman(x3f_huffman_t **HUFP)
+     if (DS->num_directory_entries > 0)
+     {
+       size_t size = DS->num_directory_entries * sizeof(x3f_directory_entry_t);
+-      DS->directory_entry = (x3f_directory_entry_t *)calloc(1, size);
++      DS->directory_entry = (x3f_directory_entry_t *)x3f_limited_calloc(1, size);
+     }
+ 
+     /* Traverse the directory */
+@@ -1220,15 +1249,8 @@ static uint32_t read_data_block(void **data, x3f_info_t *I,
+ 
+   if (fpos + size > I->input.file->size())
+     throw LIBRAW_EXCEPTION_IO_CORRUPT;
+-
+-  // All known files from real cameras are many times smaller than 1 GB, so the hard limit is OK here.
+-
+-  if(size > 1024*1024*1024)
+-    throw LIBRAW_EXCEPTION_ALLOC;
+-
+-  *data = (void *)malloc(size);
+-  if (!*data)
+-	  throw LIBRAW_EXCEPTION_ALLOC;
++ 
++  *data = (void *)x3f_limited_malloc(size);
+ 
+   GETN(*data, size);
+ 
+@@ -1363,36 +1385,36 @@ static void x3f_load_true(x3f_info_t *I, x3f_directory_entry_t *DE)
+     uint32_t columns = Q->plane[0].columns;
+     uint32_t rows = Q->plane[0].rows;
+     uint32_t channels = 3;
+-    uint32_t size = columns * rows * channels;
++    UINT64 size = UINT64(columns) * UINT64(rows) * UINT64(channels);
+ 
+     TRU->x3rgb16.columns = columns;
+     TRU->x3rgb16.rows = rows;
+     TRU->x3rgb16.channels = channels;
+     TRU->x3rgb16.row_stride = columns * channels;
+-    TRU->x3rgb16.buf = malloc(sizeof(uint16_t) * size);
++    TRU->x3rgb16.buf = x3f_limited_malloc(sizeof(uint16_t) * size);
+     TRU->x3rgb16.data = (uint16_t *)TRU->x3rgb16.buf;
+ 
+     columns = Q->plane[2].columns;
+     rows = Q->plane[2].rows;
+     channels = 1;
+-    size = columns * rows * channels;
++    size = UINT64(columns) * UINT64(rows) * UINT64(channels);
+ 
+     Q->top16.columns = columns;
+     Q->top16.rows = rows;
+     Q->top16.channels = channels;
+     Q->top16.row_stride = columns * channels;
+-    Q->top16.buf = malloc(sizeof(uint16_t) * size);
++    Q->top16.buf = x3f_limited_malloc(sizeof(uint16_t) * size);
+     Q->top16.data = (uint16_t *)Q->top16.buf;
+   }
+   else
+   {
+-    uint32_t size = ID->columns * ID->rows * 3;
++    UINT64 size = UINT64(ID->columns) * UINT64(ID->rows) * 3ULL;
+ 
+     TRU->x3rgb16.columns = ID->columns;
+     TRU->x3rgb16.rows = ID->rows;
+     TRU->x3rgb16.channels = 3;
+     TRU->x3rgb16.row_stride = ID->columns * 3;
+-    TRU->x3rgb16.buf = malloc(sizeof(uint16_t) * size);
++    TRU->x3rgb16.buf = x3f_limited_malloc(sizeof(uint16_t) * size);
+     TRU->x3rgb16.data = (uint16_t *)TRU->x3rgb16.buf;
+   }
+ 
+@@ -1441,7 +1463,7 @@ static void x3f_load_huffman(x3f_info_t *I, x3f_directory_entry_t *DE, int bits,
+   x3f_directory_entry_header_t *DEH = &DE->header;
+   x3f_image_data_t *ID = &DEH->data_subsection.image_data;
+   x3f_huffman_t *HUF = new_huffman(&ID->huffman);
+-  uint32_t size;
++  UINT64 size;
+ 
+   if (use_map_table)
+   {
+@@ -1454,21 +1476,21 @@ static void x3f_load_huffman(x3f_info_t *I, x3f_directory_entry_t *DE, int bits,
+   {
+   case X3F_IMAGE_RAW_HUFFMAN_X530:
+   case X3F_IMAGE_RAW_HUFFMAN_10BIT:
+-    size = ID->columns * ID->rows * 3;
++    size = UINT64(ID->columns) * UINT64(ID->rows) * 3ULL;
+     HUF->x3rgb16.columns = ID->columns;
+     HUF->x3rgb16.rows = ID->rows;
+     HUF->x3rgb16.channels = 3;
+     HUF->x3rgb16.row_stride = ID->columns * 3;
+-    HUF->x3rgb16.buf = malloc(sizeof(uint16_t) * size);
++    HUF->x3rgb16.buf = x3f_limited_malloc(sizeof(uint16_t) * size);
+     HUF->x3rgb16.data = (uint16_t *)HUF->x3rgb16.buf;
+     break;
+   case X3F_IMAGE_THUMB_HUFFMAN:
+-    size = ID->columns * ID->rows * 3;
++    size = UINT64(ID->columns) * UINT64(ID->rows) * 3ULL;
+     HUF->rgb8.columns = ID->columns;
+     HUF->rgb8.rows = ID->rows;
+     HUF->rgb8.channels = 3;
+     HUF->rgb8.row_stride = ID->columns * 3;
+-    HUF->rgb8.buf = malloc(sizeof(uint8_t) * size);
++    HUF->rgb8.buf = x3f_limited_malloc(sizeof(uint8_t) * size);
+     HUF->rgb8.data = (uint8_t *)HUF->rgb8.buf;
+     break;
+   default:
+@@ -1568,7 +1590,7 @@ static void x3f_load_camf_decode_type2(x3f_camf_t *CAMF)
+   int i;
+ 
+   CAMF->decoded_data_size = CAMF->data_size;
+-  CAMF->decoded_data = malloc(CAMF->decoded_data_size);
++  CAMF->decoded_data = x3f_limited_malloc(CAMF->decoded_data_size);
+ 
+   for (i = 0; i < (int)CAMF->data_size; i++)
+   {
+@@ -1609,7 +1631,7 @@ static void camf_decode_type4(x3f_camf_t *CAMF)
+ 
+   CAMF->decoded_data_size = dst_size;
+ 
+-  CAMF->decoded_data = malloc(CAMF->decoded_data_size);
++  CAMF->decoded_data = x3f_limited_malloc(CAMF->decoded_data_size);
+   memset(CAMF->decoded_data, 0, CAMF->decoded_data_size);
+ 
+   dst = (uint8_t *)CAMF->decoded_data;
+@@ -1688,7 +1710,7 @@ static void x3f_load_camf_decode_type4(x3f_camf_t *CAMF)
+   for (i = 0, p = (uint8_t *)CAMF->data; *p != 0; i++)
+   {
+     /* TODO: Is this too expensive ??*/
+-    element = (x3f_true_huffman_element_t *)realloc(element,
++    element = (x3f_true_huffman_element_t *)x3f_limited_realloc(element,
+                                                     (i + 1) * sizeof(*element));
+ 
+     element[i].code_size = *p++;
+@@ -1729,7 +1751,7 @@ static void camf_decode_type5(x3f_camf_t *CAMF)
+   int32_t i;
+ 
+   CAMF->decoded_data_size = CAMF->t5.decoded_data_size;
+-  CAMF->decoded_data = malloc(CAMF->decoded_data_size);
++  CAMF->decoded_data = x3f_limited_malloc(CAMF->decoded_data_size);
+ 
+   dst = (uint8_t *)CAMF->decoded_data;
+ 
+@@ -1753,7 +1775,7 @@ static void x3f_load_camf_decode_type5(x3f_camf_t *CAMF)
+   for (i = 0, p = (uint8_t *)CAMF->data; *p != 0; i++)
+   {
+     /* TODO: Is this too expensive ??*/
+-    element = (x3f_true_huffman_element_t *)realloc(element,
++    element = (x3f_true_huffman_element_t *)x3f_limited_realloc(element,
+                                                     (i + 1) * sizeof(*element));
+ 
+     element[i].code_size = *p++;
+@@ -1796,8 +1818,8 @@ static void x3f_setup_camf_property_entry(camf_entry_t *entry)
+   uint32_t num = entry->property_num = *(uint32_t *)v;
+   uint32_t off = *(uint32_t *)(v + 4);
+ 
+-  entry->property_name = (char **)malloc(num * sizeof(uint8_t *));
+-  entry->property_value = (uint8_t **)malloc(num * sizeof(uint8_t *));
++  entry->property_name = (char **)x3f_limited_malloc(num * sizeof(uint8_t *));
++  entry->property_value = (uint8_t **)x3f_limited_malloc(num * sizeof(uint8_t *));
+ 
+   for (i = 0; i < (int)num; i++)
+   {
+@@ -1851,7 +1873,7 @@ static void get_matrix_copy(camf_entry_t *entry)
+                                                        : sizeof(uint32_t)) *
+                 elements;
+ 
+-  entry->matrix_decoded = malloc(size);
++  entry->matrix_decoded = x3f_limited_malloc(size);
+ 
+   switch (element_size)
+   {
+@@ -1921,7 +1943,7 @@ static void x3f_setup_camf_matrix_entry(camf_entry_t *entry)
+   uint32_t dim = entry->matrix_dim = *(uint32_t *)(v + 4);
+   uint32_t off = entry->matrix_data_off = *(uint32_t *)(v + 8);
+   camf_dim_entry_t *dentry = entry->matrix_dim_entry =
+-      (camf_dim_entry_t *)malloc(dim * sizeof(camf_dim_entry_t));
++      (camf_dim_entry_t *)x3f_limited_malloc(dim * sizeof(camf_dim_entry_t));
+ 
+   for (i = 0; i < (int)dim; i++)
+   {
+@@ -1972,7 +1994,7 @@ static void x3f_setup_camf_entries(x3f_camf_t *CAMF)
+     }
+ 
+     /* TODO: lots of realloc - may be inefficient */
+-    entry = (camf_entry_t *)realloc(entry, (i + 1) * sizeof(camf_entry_t));
++    entry = (camf_entry_t *)x3f_limited_realloc(entry, (i + 1) * sizeof(camf_entry_t));
+ 
+     /* Pointer */
+     entry[i].entry = p;
diff -Nru libraw-0.21.4/debian/patches/CVE-2026-5342.patch libraw-0.21.4/debian/patches/CVE-2026-5342.patch
--- libraw-0.21.4/debian/patches/CVE-2026-5342.patch	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/CVE-2026-5342.patch	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,61 @@
+From: Alex Tutubalin <[email protected]>
+Date: Tue, 17 Mar 2026 12:44:57 +0300
+Subject: Nikon padded/12bit: no need to calculate padded row size before
+ final raw_width adjustment
+
+Origin: https://github.com/LibRaw/LibRaw/commit/2468614a9cbcab6b75ca279ab60cac62156f7aeb
+Bug: https://github.com/LibRaw/LibRaw/issues/795
+Bug-Debian: https://bugs.debian.org/1132655
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2026-5342
+---
+ src/decoders/decoders_libraw.cpp | 18 ++++++++++++------
+ src/metadata/tiff.cpp            |  2 --
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+diff --git a/src/decoders/decoders_libraw.cpp b/src/decoders/decoders_libraw.cpp
+index eb277c3..5a82352 100644
+--- a/src/decoders/decoders_libraw.cpp
++++ b/src/decoders/decoders_libraw.cpp
+@@ -259,17 +259,23 @@ void LibRaw::fuji_14bit_load_raw()
+ void LibRaw::nikon_load_padded_packed_raw() // 12 bit per pixel, padded to 16
+                                             // bytes
+ {
++	unsigned bytesperrow = (((unsigned(S.raw_width) * 3u / 2u) + 15u) / 16u) * 16u; // bytes per row
++
+   // libraw_internal_data.unpacker_data.load_flags -> row byte count
+-  if (libraw_internal_data.unpacker_data.load_flags < 2000 ||
+-      libraw_internal_data.unpacker_data.load_flags > 64000)
+-    return;
++  if (bytesperrow < 2000 || bytesperrow > 64000)
++    throw LIBRAW_EXCEPTION_IO_CORRUPT;
++
+   unsigned char *buf =
+-      (unsigned char *)calloc(libraw_internal_data.unpacker_data.load_flags,1);
++      (unsigned char *)calloc(bytesperrow,1);
+   for (int row = 0; row < S.raw_height; row++)
+   {
+     checkCancel();
+-    libraw_internal_data.internal_data.input->read(
+-        buf, libraw_internal_data.unpacker_data.load_flags, 1);
++    int readed = libraw_internal_data.internal_data.input->read(
++        buf, 1, bytesperrow);
++
++	if (readed < (int)bytesperrow)
++		derror();
++
+     for (int icol = 0; icol < S.raw_width / 2; icol++)
+     {
+       imgdata.rawdata.raw_image[(row)*S.raw_width + (icol * 2)] =
+diff --git a/src/metadata/tiff.cpp b/src/metadata/tiff.cpp
+index 5ec07a2..5ba41ae 100644
+--- a/src/metadata/tiff.cpp
++++ b/src/metadata/tiff.cpp
+@@ -2031,8 +2031,6 @@ void LibRaw::apply_tiff()
+                INT64(tiff_ifd[raw].bytes))
+       {
+         load_raw = &LibRaw::nikon_load_padded_packed_raw;
+-        load_flags = (((INT64(raw_width) * 3ULL / 2ULL) + 15ULL) / 16ULL) *
+-                     16ULL; // bytes per row
+       }
+       else if (!strncmp(model, "NIKON Z 9", 9) && tiff_ifd[raw].offset)
+       {
diff -Nru libraw-0.21.4/debian/patches/series libraw-0.21.4/debian/patches/series
--- libraw-0.21.4/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/patches/series	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,8 @@
+CVE-2026-21413.patch
+CVE-2026-20889.patch
+CVE-2026-24660.patch
+CVE-2026-24450.patch
+CVE-2026-20884/01-afba34ec3.patch
+CVE-2026-20884/02-dae685a19.patch
+CVE-2026-20884/03-aa4458eb5.patch
+CVE-2026-5342.patch
diff -Nru libraw-0.21.4/debian/salsa-ci.yml libraw-0.21.4/debian/salsa-ci.yml
--- libraw-0.21.4/debian/salsa-ci.yml	1970-01-01 01:00:00.000000000 +0100
+++ libraw-0.21.4/debian/salsa-ci.yml	2026-07-29 03:53:35.000000000 +0200
@@ -0,0 +1,9 @@
+---
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
+
+variables:
+  RELEASE: 'trixie'
+  SALSA_CI_DISABLE_LINTIAN: 1
+  SALSA_CI_DISABLE_REPROTEST: 1
+  SALSA_CI_DISABLE_USCAN: 1

Attachment: signature.asc
Description: PGP signature


--- End Message ---
--- Begin Message ---
Version: 13.7

This update was released as part of 13.7.

--- End Message ---

Reply via email to