[graphics/digikam] /: update internal libraw to last 0.22.2 release

Gilles Caulier <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 29b8b19e5a6f96a14ef34ef327e81456f7ba95e8 by Gilles Caulier.
Committed on 15/07/2026 at 19:12.
Pushed by cgilles into branch 'master'.

update internal libraw to last 0.22.2 release
https://github.com/LibRaw/LibRaw/releases/tag/0.22.2

M  +6    -6    NEWS
M  +2    -2    core/libs/rawengine/libraw/libraw_manifest.txt
M  +8    -5    core/libs/rawengine/libraw/src/decoders/decoders_libraw.cpp
M  +4    -4    core/libs/rawengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp
M  +2    -2    core/libs/rawengine/libraw/src/decoders/unpack_thumb.cpp
M  +2    -2    core/libs/rawengine/libraw/src/demosaic/xtrans_demosaic.cpp
M  +23   -4    core/libs/rawengine/libraw/src/integration/dngsdk_glue.cpp
M  +3    -3    core/libs/rawengine/libraw/src/libraw_c_api.cpp
M  +6    -3    core/libs/rawengine/libraw/src/libraw_datastream.cpp
M  +2    -2    core/libs/rawengine/libraw/src/metadata/cr3_parser.cpp
M  +1    -0    core/libs/rawengine/libraw/src/metadata/exif_gps.cpp
M  +11   -4    core/libs/rawengine/libraw/src/metadata/identify_tools.cpp
M  +3    -0    core/libs/rawengine/libraw/src/metadata/mediumformat.cpp
M  +105  -92   core/libs/rawengine/libraw/src/metadata/olympus.cpp
M  +3    -0    core/libs/rawengine/libraw/src/metadata/sony.cpp
M  +3    -3    core/libs/rawengine/libraw/src/postprocessing/mem_image.cpp
M  +3    -2    core/libs/rawengine/libraw/src/postprocessing/postprocessing_aux.cpp
M  +2    -2    core/libs/rawengine/libraw/src/utils/read_utils.cpp
M  +0    -1    core/libs/rawengine/libraw/src/utils/thumb_utils.cpp
M  +1    -1    core/libs/rawengine/libraw/src/write/file_write.cpp

https://invent.kde.org/graphics/digikam/-/commit/29b8b19e5a6f96a14ef34ef327e81456f7ba95e8

diff --git a/NEWS b/NEWS
index bef9425c91..5b32cc9694 100644
--- a/NEWS
+++ b/NEWS
@@ -9,12 +9,12 @@ Bundles component versions:
 
 | Bundles       | Qt         | KDE        | OpenCV   | FFmpeg    | Heif       | ExifTool  | Exiv2      | LibRaw       | QtAvPlayer   | Build Environment   |
 |---------------|------------|------------|----------|-----------|------------|-----------|------------|--------------|--------------|---------------------|
-| Windows Qt5   | 5.15.17    | 5.116      | 4.11     | 7.1.1     | 1.20.2     | 13.59 (*) | 0.28.8     | 20260710 (*) | 20260405     | Windows 10 + VCPKG  |
-| Windows Qt6   | 6.11.0     | 6.26.0     | 4.12     | 8.1.1     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260710 (*) |    -         | Windows 11 + VCPKG  |
-| AppImage Qt5  | 5.15.18    | 5.116      | 4.13     | 8.0.1     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260710 (*) | 20260405     | XUbuntu 20.06       |
-| AppImage Qt6  | 6.11.0     | 6.26.0     | 4.13     | 8.1.1     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260710 (*) |    -         | XUbuntu 22.04       |
-| macOS Qt5     | 5.15.18    | 5.116      | 4.13     | 8.0.1     | 1.20.2     | 13.59 (*) | 0.28.8     | 20260710 (*) | 20260405     | Monterey + Macports |
-| macOS Qt6     | 6.11.0     | 6.26.0     | 4.13     | 8.1.0     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260710 (*) |    -         | Tathoe + Macports   |
+| Windows Qt5   | 5.15.17    | 5.116      | 4.11     | 7.1.1     | 1.20.2     | 13.59 (*) | 0.28.8     | 20260716 (*) | 20260405     | Windows 10 + VCPKG  |
+| Windows Qt6   | 6.11.0     | 6.26.0     | 4.12     | 8.1.1     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260716 (*) |    -         | Windows 11 + VCPKG  |
+| AppImage Qt5  | 5.15.18    | 5.116      | 4.13     | 8.0.1     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260716 (*) | 20260405     | XUbuntu 20.06       |
+| AppImage Qt6  | 6.11.0     | 6.26.0     | 4.13     | 8.1.1     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260716 (*) |    -         | XUbuntu 22.04       |
+| macOS Qt5     | 5.15.18    | 5.116      | 4.13     | 8.0.1     | 1.20.2     | 13.59 (*) | 0.28.8     | 20260716 (*) | 20260405     | Monterey + Macports |
+| macOS Qt6     | 6.11.0     | 6.26.0     | 4.13     | 8.1.0     | 1.21.2     | 13.59 (*) | 0.28.8     | 20260716 (*) |    -         | Tathoe + Macports   |
 
 Icon-View: Improve filename matching for timelapse/burst grouping items.
 
diff --git a/core/libs/rawengine/libraw/libraw_manifest.txt b/core/libs/rawengine/libraw/libraw_manifest.txt
index ffaca62c5d..86783bba78 100644
--- a/core/libs/rawengine/libraw/libraw_manifest.txt
+++ b/core/libs/rawengine/libraw/libraw_manifest.txt
@@ -1,2 +1,2 @@
-+LIBRAW Snapshot 2026-07-10
-libraw:2751f9692d9401875551693e0c7c88e8b71db115
++LIBRAW Snapshot 2026-07-16
+libraw:87241b45d8c8178247faca4aa8e6a1896b0b1eeb
diff --git a/core/libs/rawengine/libraw/src/decoders/decoders_libraw.cpp b/core/libs/rawengine/libraw/src/decoders/decoders_libraw.cpp
index 85fbe95a40..96f36c87fa 100644
--- a/core/libs/rawengine/libraw/src/decoders/decoders_libraw.cpp
+++ b/core/libs/rawengine/libraw/src/decoders/decoders_libraw.cpp
@@ -749,13 +749,16 @@ struct iiq_bitstream_t
 	uint64_t curr;
 	uint32_t *input;
 	uint8_t used;
-	iiq_bitstream_t(uint32_t *img_input): curr(0),input(img_input),used(0){}
+	size_t pos, maxpos;
+	iiq_bitstream_t(uint32_t *img_input, size_t inpsz): curr(0),input(img_input),used(0),pos(0),maxpos(inpsz){}
 
 	void fill()
     {
       if (used <= 32)
       {
         uint64_t bitpump_next = *input++;
+		pos++;
+		if (pos > maxpos) throw LIBRAW_EXCEPTION_IO_EOF;
         curr = (curr << 32) | bitpump_next;
         used += 32;
       }
@@ -784,13 +787,13 @@ struct iiq_bitstream_t
 
 };
 
-void decode_S_type(int32_t out_width, uint32_t *img_input, ushort *outbuf /*, int bit_depth*/)
+void decode_S_type(int32_t out_width, uint32_t *img_input, ushort *outbuf, size_t datalen /*, int bit_depth*/)
 {
 #if 0
 	if (((bit_depth - 12) & 0xFFFFFFFD) != 0)
 		return 0;
 #endif
-	iiq_bitstream_t stream(img_input);
+	iiq_bitstream_t stream(img_input,datalen);
 
 	const int pix_corr_shift = 2; // 16 - bit_depth;
 	unsigned int bit_check[2] = { 0, 0 };
@@ -907,7 +910,7 @@ void LibRaw::phase_one_load_raw_s()
 	stripes[imgdata.sizes.raw_height].offset = libraw_internal_data.unpacker_data.data_offset + INT64(libraw_internal_data.unpacker_data.data_size);
 	std::sort(stripes.begin(), stripes.end());
 	INT64 maxsz = imgdata.sizes.raw_width * 3 + 2; // theor max: 17 bytes per 8 pix + row header
-	std::vector<uint8_t> datavec(maxsz);
+	std::vector<uint8_t> datavec(maxsz+4);
 
 	for (unsigned row = 0; row < imgdata.sizes.raw_height; row++)
 	{
@@ -921,7 +924,7 @@ void LibRaw::phase_one_load_raw_s()
 		if(libraw_internal_data.internal_data.input->read(datavec.data(), 1, readsz) != readsz)
 			derror(); // TODO: check read state
 
-		decode_S_type(imgdata.sizes.raw_width, (uint32_t *)datavec.data(), datap /*, 14 */);
+		decode_S_type(imgdata.sizes.raw_width, (uint32_t *)datavec.data(), datap, readsz /*, 14 */);
 	}
 }
 
diff --git a/core/libs/rawengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp b/core/libs/rawengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp
index cafa68edef..17dfed695e 100644
--- a/core/libs/rawengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp
+++ b/core/libs/rawengine/libraw/src/decoders/decoders_libraw_dcrdefs.cpp
@@ -299,8 +299,8 @@ void LibRaw::rpi_load_raw8()
 	for (row = 0; row < raw_height; row++) {
 		if (fread(data + dwide, 1, dwide, ifp) < dwide) derror();
 		FORC(dwide) data[c] = data[dwide + (c ^ rev)];
-		for (dp = data, col = 0; col < raw_width; dp++, col++)
-			RAW(row, col + c) = dp[c];
+		for (dp = data, col = 0; col < raw_width && col < dwide; dp++, col++)
+			RAW(row, col) = *dp;
 	}
 	free(data);
 	maximum = 0xff;
@@ -396,8 +396,8 @@ void LibRaw::rpi_load_raw16()
 	for (row = 0; row < raw_height; row++) {
 		if (fread(data + dwide, 1, dwide, ifp) < dwide) derror();
 		FORC(dwide) data[c] = data[dwide + (c ^ rev)];
-		for (dp = data, col = 0; col < raw_width; dp += 2, col++)
-			RAW(row, col + c) = (dp[1] << 8) | dp[0];
+		for (dp = data, col = 0; col < raw_width && col < dwide/2; dp += 2, col++)
+			RAW(row, col) = (dp[1] << 8) | dp[0];
 	}
 	free(data);
 	maximum = 0xffff;
diff --git a/core/libs/rawengine/libraw/src/decoders/unpack_thumb.cpp b/core/libs/rawengine/libraw/src/decoders/unpack_thumb.cpp
index 5add7c5645..11b48ff750 100644
--- a/core/libs/rawengine/libraw/src/decoders/unpack_thumb.cpp
+++ b/core/libs/rawengine/libraw/src/decoders/unpack_thumb.cpp
@@ -312,9 +312,9 @@ int LibRaw::unpack_thumb(void)
               total_size += tiff_ifd[pifd].strip_byte_counts[i];
             if (total_size != (unsigned)t_length) // recalculate colors
             {
-              if (total_size == T.twidth * T.tlength * 3)
+              if (total_size == T.twidth * T.theight * 3)
                 T.tcolors = 3;
-              else if (total_size == T.twidth * T.tlength)
+              else if (total_size == T.twidth * T.theight)
                 T.tcolors = 1;
             }
             T.tlength = unsigned(total_size);
diff --git a/core/libs/rawengine/libraw/src/demosaic/xtrans_demosaic.cpp b/core/libs/rawengine/libraw/src/demosaic/xtrans_demosaic.cpp
index 6d9f999c53..ca98dc398a 100644
--- a/core/libs/rawengine/libraw/src/demosaic/xtrans_demosaic.cpp
+++ b/core/libs/rawengine/libraw/src/demosaic/xtrans_demosaic.cpp
@@ -82,8 +82,8 @@ void LibRaw::xtrans_interpolate(int passes)
                 int h = orth[d + 2] * patt[g][c * 2] + orth[d + 3] * patt[g][c * 2 + 1];
                 minv = MIN(v, minv);
                 maxv = MAX(v, maxv);
-                minh = MIN(v, minh);
-                maxh = MAX(v, maxh);
+                minh = MIN(h, minh);
+                maxh = MAX(h, maxh);
                 allhex[row][col][0][c ^ (g * 2 & d)] = h + v * width;
                 allhex[row][col][1][c ^ (g * 2 & d)] = h + v * LIBRAW_AHD_TILE;
             }
diff --git a/core/libs/rawengine/libraw/src/integration/dngsdk_glue.cpp b/core/libs/rawengine/libraw/src/integration/dngsdk_glue.cpp
index a67f9347c4..e497190416 100644
--- a/core/libs/rawengine/libraw/src/integration/dngsdk_glue.cpp
+++ b/core/libs/rawengine/libraw/src/integration/dngsdk_glue.cpp
@@ -371,11 +371,20 @@ int LibRaw::try_dngsdk()
     dng_pixel_buffer buffer;
     stage2->GetPixelBuffer(buffer);
 
-    int pixels = stage2->Bounds().H() * stage2->Bounds().W() * pplanes;
+    INT64 pixels = INT64(stage2->Bounds().H()) * INT64(stage2->Bounds().W()) * INT64(pplanes);
+
+	INT64 allocsz = pixels * TagTypeSize(ptype);
+    if (allocsz > INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024))
+      throw LIBRAW_EXCEPTION_TOOBIG;
 
     if (ptype == ttShort && !(stageBits & 1) &&  !is_curve_linear())
     {
-      imgdata.rawdata.raw_alloc = malloc(pixels * TagTypeSize(ptype));
+      imgdata.rawdata.raw_alloc 
+#ifdef LIBRAW_CALLOC_RAWSTORE
+          = calloc(pixels, TagTypeSize(ptype));
+#else
+		  = malloc(pixels * TagTypeSize(ptype));
+#endif
       ushort *src = (ushort *)buffer.fData;
       ushort *dst = (ushort *)imgdata.rawdata.raw_alloc;
       for (int i = 0; i < pixels; i++)
@@ -385,7 +394,12 @@ int LibRaw::try_dngsdk()
     }
     else if (ptype == ttByte)
     {
-      imgdata.rawdata.raw_alloc = malloc(pixels * TagTypeSize(ttShort));
+      imgdata.rawdata.raw_alloc 
+#ifdef LIBRAW_CALLOC_RAWSTORE
+          = calloc(pixels, TagTypeSize(ttShort));
+#else
+		  = malloc(pixels * TagTypeSize(ttShort));
+#endif
       unsigned char *src = (unsigned char *)buffer.fData;
       ushort *dst = (ushort *)imgdata.rawdata.raw_alloc;
       if (is_curve_linear())
@@ -408,7 +422,12 @@ int LibRaw::try_dngsdk()
       }
       else
       {
-        imgdata.rawdata.raw_alloc = malloc(pixels * TagTypeSize(ptype));
+        imgdata.rawdata.raw_alloc 
+#ifdef LIBRAW_CALLOC_RAWSTORE
+            = calloc(pixels, TagTypeSize(ptype));
+#else
+            = malloc(pixels * TagTypeSize(ptype));
+#endif
         memmove(imgdata.rawdata.raw_alloc, buffer.fData,
                 pixels * TagTypeSize(ptype));
       }
diff --git a/core/libs/rawengine/libraw/src/libraw_c_api.cpp b/core/libs/rawengine/libraw/src/libraw_c_api.cpp
index c4c12faf3f..b23d13c354 100644
--- a/core/libs/rawengine/libraw/src/libraw_c_api.cpp
+++ b/core/libs/rawengine/libraw/src/libraw_c_api.cpp
@@ -444,21 +444,21 @@ extern "C"
   DllDef float libraw_get_cam_mul(libraw_data_t *lr, int index)
   {
     if (!lr)
-      return EINVAL;
+      return -999.f;
     return lr->color.cam_mul[LIM(index, 0, 3)];
   }
 
   DllDef float libraw_get_pre_mul(libraw_data_t *lr, int index)
   {
     if (!lr)
-      return EINVAL;
+      return -999.f;
     return lr->color.pre_mul[LIM(index, 0, 3)];
   }
 
   DllDef float libraw_get_rgb_cam(libraw_data_t *lr, int index1, int index2)
   {
     if (!lr)
-      return EINVAL;
+      return -999.f;
     return lr->color.rgb_cam[LIM(index1, 0, 2)][LIM(index2, 0, 3)];
   }
 
diff --git a/core/libs/rawengine/libraw/src/libraw_datastream.cpp b/core/libs/rawengine/libraw/src/libraw_datastream.cpp
index f8f3da895f..6faae8aa20 100644
--- a/core/libs/rawengine/libraw/src/libraw_datastream.cpp
+++ b/core/libs/rawengine/libraw/src/libraw_datastream.cpp
@@ -417,12 +417,15 @@ char *LibRaw_buffer_datastream::gets(char *s, int sz)
 int LibRaw_buffer_datastream::scanf_one(const char *fmt, void *val)
 {
   int scanf_res;
-  if (streampos > streamsize)
+  if (streampos > streamsize-24) // we assume at least 24 bytes in buffer, same assumption as in bigfile buffered datastream
     return 0;
+  char scanf_buffer[25];
+  memcpy(scanf_buffer, buf + streampos, 24);
+  scanf_buffer[24] = 0;
 #ifndef WIN32SECURECALLS
-  scanf_res = sscanf((char *)(buf + streampos), fmt, val);
+  scanf_res = sscanf(scanf_buffer, fmt, val);
 #else
-  scanf_res = sscanf_s((char *)(buf + streampos), fmt, val);
+  scanf_res = sscanf_s(scanf_buffer, fmt, val);
 #endif
   if (scanf_res > 0)
   {
diff --git a/core/libs/rawengine/libraw/src/metadata/cr3_parser.cpp b/core/libs/rawengine/libraw/src/metadata/cr3_parser.cpp
index b959ca13f7..e48962f9c5 100644
--- a/core/libs/rawengine/libraw/src/metadata/cr3_parser.cpp
+++ b/core/libs/rawengine/libraw/src/metadata/cr3_parser.cpp
@@ -222,9 +222,9 @@ void LibRaw::selectCRXTrack()
     int tiff_idx = -1;
     INT64 tpixels = 0;
     for (unsigned i = 0; i < tiff_nifds && i < LIBRAW_IFD_MAXCOUNT; i++)
-      if (INT64(tiff_ifd[i].t_height) * INT64(tiff_ifd[i].t_height) > tpixels)
+      if (INT64(tiff_ifd[i].t_width) * INT64(tiff_ifd[i].t_height) > tpixels)
       {
-        tpixels = INT64(tiff_ifd[i].t_height) * INT64(tiff_ifd[i].t_height);
+        tpixels = INT64(tiff_ifd[i].t_width) * INT64(tiff_ifd[i].t_height);
         tiff_idx = i;
       }
     if (tiff_idx >= 0)
diff --git a/core/libs/rawengine/libraw/src/metadata/exif_gps.cpp b/core/libs/rawengine/libraw/src/metadata/exif_gps.cpp
index e4e56f9cbf..2e4941a985 100644
--- a/core/libs/rawengine/libraw/src/metadata/exif_gps.cpp
+++ b/core/libs/rawengine/libraw/src/metadata/exif_gps.cpp
@@ -236,6 +236,7 @@ void LibRaw::parse_exif(INT64 base)
         ushort l;
         float num;
 
+		memset(mn_text, 0, sizeof(mn_text));
         fgets(mn_text, MIN(len, 511), ifp);
         mn_text[511] = 0;
 
diff --git a/core/libs/rawengine/libraw/src/metadata/identify_tools.cpp b/core/libs/rawengine/libraw/src/metadata/identify_tools.cpp
index b66a7cd950..73da77114b 100644
--- a/core/libs/rawengine/libraw/src/metadata/identify_tools.cpp
+++ b/core/libs/rawengine/libraw/src/metadata/identify_tools.cpp
@@ -45,7 +45,7 @@ float LibRaw::find_green(int bps, int bite, int off0, int off1)
 {
   UINT64 bitbuf = 0;
   int vbits, col, i, c;
-  ushort img[2][2064];
+  ushort img[2][2065];
   float sum[] = {0, 0};
   if (width > 2064)
     return 0.f; // too wide
@@ -79,12 +79,19 @@ void LibRaw::trimSpaces(char *s)
 {
   char *p = s;
   int l = int(strlen(p));
-  if (!l)
+  if (l<1)
     return;
-  while (isspace(p[l - 1]))
+  while (l > 0 && isspace(p[l - 1]))
     p[--l] = 0; /* trim trailing spaces */
-  while (*p && isspace(*p))
+  if (l < 1)
+	  return; // only spaces in the input string, all wiped out;
+  while (*p && isspace(*p) && l > 0)
     ++p, --l;   /* trim leading spaces */
+  if (l < 1)  // should not happen, but safety belt
+  {
+	  *s = 0;
+	  return;
+  }
   memmove(s, p, l + 1);
 }
 
diff --git a/core/libs/rawengine/libraw/src/metadata/mediumformat.cpp b/core/libs/rawengine/libraw/src/metadata/mediumformat.cpp
index 109250f8bc..ac7e686d24 100644
--- a/core/libs/rawengine/libraw/src/metadata/mediumformat.cpp
+++ b/core/libs/rawengine/libraw/src/metadata/mediumformat.cpp
@@ -123,8 +123,10 @@ void LibRaw::parse_phase_one(INT64 base)
       break;
     case 0x0203:
       stmread(imPhaseOne.Software, len, ifp);
+	  break;
     case 0x0204:
       stmread(imPhaseOne.SystemType, len, ifp);
+	  break;
     case 0x0210:
       ph1.tag_210 = int_to_float(data);
       imCommon.SensorTemperature = ph1.tag_210;
@@ -199,6 +201,7 @@ void LibRaw::parse_phase_one(INT64 base)
         }
         *cp = 0;
       }
+	  break;
     case 0x0401:
       if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG))
         ilm.CurAp = libraw_powf64l(2.0f, (int_to_float(data) / 2.0f));
diff --git a/core/libs/rawengine/libraw/src/metadata/olympus.cpp b/core/libs/rawengine/libraw/src/metadata/olympus.cpp
index c23be1b4eb..6ca0b50f80 100644
--- a/core/libs/rawengine/libraw/src/metadata/olympus.cpp
+++ b/core/libs/rawengine/libraw/src/metadata/olympus.cpp
@@ -644,80 +644,90 @@ void LibRaw::parseOlympusMakernotes (INT64 base, unsigned tag, unsigned type, un
 
   } else {
 		switch (tag) {
-			case 0x0200:
-			  FORC3 if ((imOly.SpecialMode[c] = get4()) >= 0xff) imOly.SpecialMode[c] = 0xffffffff;
-			  break;
-			case 0x0207:
-				getOlympus_CameraType2();
-				break;
-			case 0x0404:
-			case 0x101a:
-				if (!imgdata.shootinginfo.BodySerial[0] && (dng_writer == nonDNG))
-					stmread(imgdata.shootinginfo.BodySerial, len, ifp);
-				break;
-			case 0x1002:
-				ilm.CurAp = float(libraw_powf64l(2.0f, getrealf(type) / 2.f));
-				break;
-			case 0x1007:
-				imCommon.SensorTemperature = (float)get2();
-				break;
-			case 0x1008:
-				imCommon.LensTemperature = (float)get2();
-				break;
-			case 0x100b:
-				if (imOly.FocusMode[0] == 0xffff) {
-					imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = get2();
-					if (imgdata.shootinginfo.FocusMode == 1)
-						imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = 10;
-				}
-				break;
+        case 0x0200:
+          FORC3 if ((imOly.SpecialMode[c] = get4()) >= 0xff) imOly.SpecialMode[c] = 0xffffffff;
+          break;
+        case 0x0207:
+          getOlympus_CameraType2();
+          break;
+        case 0x0404:
+        case 0x101a:
+          if (!imgdata.shootinginfo.BodySerial[0] && (dng_writer == nonDNG))
+            stmread(imgdata.shootinginfo.BodySerial, len, ifp);
+          break;
+        case 0x1002:
+          ilm.CurAp = float(libraw_powf64l(2.0f, getrealf(type) / 2.f));
+          break;
+        case 0x1007:
+          imCommon.SensorTemperature = (float)get2();
+          break;
+        case 0x1008:
+          imCommon.LensTemperature = (float)get2();
+          break;
+        case 0x100b:
+          if (imOly.FocusMode[0] == 0xffff)
+          {
+            imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = get2();
+            if (imgdata.shootinginfo.FocusMode == 1)
+              imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = 10;
+          }
+          break;
       case 0x100d:
         if (imOly.ZoomStepCount == 0xffff) imOly.ZoomStepCount = get2();
         break;
       case 0x100e:
-        if (imOly.FocusStepCount == 0xffff) imOly.FocusStepCount = get2();
+        if (imOly.FocusStepCount == 0xffff)
+          imOly.FocusStepCount = get2();
+        break;
+      case 0x1011:
+        if (strcmp(software, "v757-71") && (dng_writer == nonDNG))
+        {
+          for (int i = 0; i < 3; i++)
+          {
+            if (!imOly.ColorSpace)
+            {
+              FORC3 cmatrix[i][c] = float((short)get2()) / 256.f;
+            }
+            else
+            {
+              FORC3 imgdata.color.ccm[i][c] = float((short)get2()) / 256.f;
+            }
+          }
+        }
+        break;
+      case 0x1012:
+        if (dng_writer == nonDNG)
+          FORC4 cblack[RGGB_2_RGBG(c)] = get2();
+        break;
+      case 0x1017:
+        if (dng_writer == nonDNG)
+          cam_mul[0] = float(get2()) / 256.f;
+        break;
+      case 0x1018:
+        if (dng_writer == nonDNG)
+          cam_mul[2] = float(get2()) / 256.f;
+        break;
+      case 0x102c:
+        if (dng_writer == nonDNG)
+          imOly.ValidBits = get2();
+        break;
+      case 0x1038:
+        imOly.AFResult = get2();
         break;
-			case 0x1011:
-				if (strcmp(software, "v757-71") && (dng_writer == nonDNG)) {
-					for (int i = 0; i < 3; i++) {
-						if (!imOly.ColorSpace) {
-							FORC3 cmatrix[i][c] = float((short)get2()) / 256.f;
-						} else {
-							FORC3 imgdata.color.ccm[i][c] = float((short)get2()) / 256.f;
-						}
-					}
-				}
-				break;
-			case 0x1012:
-			  if (dng_writer == nonDNG)
-				  FORC4 cblack[RGGB_2_RGBG(c)] = get2();
-				break;
-			case 0x1017:
-				if (dng_writer == nonDNG)
-				  cam_mul[0] = float(get2()) / 256.f;
-				break;
-			case 0x1018:
-				if (dng_writer == nonDNG)
-				  cam_mul[2] = float(get2()) / 256.f;
-				break;
-			case 0x102c:
-				if (dng_writer == nonDNG)
-				  imOly.ValidBits = get2();
-				break;
-			case 0x1038:
-				imOly.AFResult = get2();
-				break;
       case 0x103b:
         if (imOly.FocusStepInfinity == 0xffff) imOly.FocusStepInfinity = get2();
         break;
       case 0x103c:
-        if (imOly.FocusStepNear == 0xffff) imOly.FocusStepNear = get2();
+        if (imOly.FocusStepNear == 0xffff)
+          imOly.FocusStepNear = get2();
         break;
-			case 0x20300108:
-			case 0x20310109:
-				if (dng_writer == nonDNG) {
+      case 0x20300108:
+      case 0x20310109:
+        if (dng_writer == nonDNG)
+        {
           imOly.ColorSpace = get2();
-          switch (imOly.ColorSpace) {
+          switch (imOly.ColorSpace)
+          {
           case 0:
             imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB;
             break;
@@ -731,34 +741,37 @@ void LibRaw::parseOlympusMakernotes (INT64 base, unsigned tag, unsigned type, un
             imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown;
             break;
           }
-				}
-			case 0x20500209:
-				imOly.AutoFocus = get2();
-				break;
-			case 0x20500300:
-			  imOly.ZoomStepCount = get2();
-			  break;
-			case 0x20500301:
-			  imOly.FocusStepCount = get2();
-			  break;
-			case 0x20500303:
-			  imOly.FocusStepInfinity = get2();
-			  break;
-			case 0x20500304:
-			  imOly.FocusStepNear = get2();
-			  break;
-			case 0x20500305:
-			  a = get4();
-			  /*b = */ get4(); // b is not used, so removed
-			  if (a >= 0x7f000000) imOly.FocusDistance = -1.0; // infinity
-			  else imOly.FocusDistance = (double) a / 1000.0;  // convert to meters
-			  break;
-			case 0x20500308:
-				imOly.AFPoint = get2();
-				break;
-			case 0x20501500:
-				getOlympus_SensorTemperature(len);
-				break;
-		}
+        }
+        break;
+      case 0x20500209:
+        imOly.AutoFocus = get2();
+        break;
+      case 0x20500300:
+        imOly.ZoomStepCount = get2();
+        break;
+      case 0x20500301:
+        imOly.FocusStepCount = get2();
+        break;
+      case 0x20500303:
+        imOly.FocusStepInfinity = get2();
+        break;
+      case 0x20500304:
+        imOly.FocusStepNear = get2();
+        break;
+      case 0x20500305:
+        a = get4();
+        /*b = */ get4(); // b is not used, so removed
+        if (a >= 0x7f000000)
+          imOly.FocusDistance = -1.0; // infinity
+        else
+          imOly.FocusDistance = (double)a / 1000.0; // convert to meters
+        break;
+      case 0x20500308:
+        imOly.AFPoint = get2();
+        break;
+      case 0x20501500:
+        getOlympus_SensorTemperature(len);
+        break;
+      }
   }
 }
diff --git a/core/libs/rawengine/libraw/src/metadata/sony.cpp b/core/libs/rawengine/libraw/src/metadata/sony.cpp
index 1c8acb8502..bdc36080f9 100644
--- a/core/libs/rawengine/libraw/src/metadata/sony.cpp
+++ b/core/libs/rawengine/libraw/src/metadata/sony.cpp
@@ -2338,6 +2338,9 @@ void LibRaw::parseSonySRF(unsigned len)
       offset += srf_buf[int(offset)] << 2;
 
 	  int ioffset = int(offset);
+	  
+	  if (ioffset + 3 >= len)
+        goto restore_after_parseSonySRF;
       /* master key is stored in big endian */
       MasterKey = ((unsigned)srf_buf[ioffset] << 24) |
           ((unsigned)srf_buf[ioffset + 1] << 16) |
diff --git a/core/libs/rawengine/libraw/src/postprocessing/mem_image.cpp b/core/libs/rawengine/libraw/src/postprocessing/mem_image.cpp
index 8bfc055a7a..95d582ac68 100644
--- a/core/libs/rawengine/libraw/src/postprocessing/mem_image.cpp
+++ b/core/libs/rawengine/libraw/src/postprocessing/mem_image.cpp
@@ -78,7 +78,7 @@ libraw_processed_image_t *LibRaw::dcraw_make_mem_thumb(int *errcode)
   {
     ushort exif[5];
     int mk_exif = 0;
-    if (strcmp(T.thumb + 6, "Exif"))
+    if (memcmp(T.thumb + 6, "Exif\0",5))
       mk_exif = 1;
 
     int dsize = T.tlength + mk_exif * (sizeof(exif) + sizeof(tiff_hdr));
@@ -231,7 +231,7 @@ int LibRaw::copy_mem_image(void *scan0, int stride, int bgr)
 
   for (row = 0; row < S.height; row++, soff += rstep)
   {
-    uchar *bufp = ((uchar *)scan0) + row * stride;
+    uchar *bufp = ((uchar *)scan0) + size_t(row) * size_t(stride);
     ppm2 = (ushort *)(ppm = bufp);
     // keep trivial decisions in the outer loop for speed
     if (bgr)
@@ -280,7 +280,7 @@ libraw_processed_image_t *LibRaw::dcraw_make_mem_image(int *errcode)
   int width, height, colors, bps;
   get_mem_image_format(&width, &height, &colors, &bps);
   int stride = width * (bps / 8) * colors;
-  unsigned ds = height * stride;
+  INT64 ds = INT64(height) * INT64(stride);
   libraw_processed_image_t *ret = (libraw_processed_image_t *)::malloc(
       sizeof(libraw_processed_image_t) + ds);
   if (!ret)
diff --git a/core/libs/rawengine/libraw/src/postprocessing/postprocessing_aux.cpp b/core/libs/rawengine/libraw/src/postprocessing/postprocessing_aux.cpp
index d741cc4cf0..426ce58880 100644
--- a/core/libs/rawengine/libraw/src/postprocessing/postprocessing_aux.cpp
+++ b/core/libs/rawengine/libraw/src/postprocessing/postprocessing_aux.cpp
@@ -139,14 +139,15 @@ void LibRaw::wavelet_denoise()
 
   if (iwidth < 65 || iheight < 65)
     return;
+  if (int64_t(iwidth) * int64_t(iheight) >= 0x15540000LL)
+    return; // ensure pixel count less then 358M so total allocation size is less then 4GB
 
   while (maximum << scale < 0x10000)
     scale++;
   maximum <<= --scale;
   black <<= scale;
   FORC4 cblack[c] <<= scale;
-  if ((size = iheight * iwidth) < 0x15550000)
-    fimg = (float *)malloc((size * 3 + iheight + iwidth) * sizeof *fimg);
+  fimg = (float *)malloc((size * 3 + iheight + iwidth) * sizeof *fimg);
   temp = fimg + size * 3;
   if ((nc = colors) == 3 && filters)
     nc++;
diff --git a/core/libs/rawengine/libraw/src/utils/read_utils.cpp b/core/libs/rawengine/libraw/src/utils/read_utils.cpp
index 31ac910934..0be9964a19 100644
--- a/core/libs/rawengine/libraw/src/utils/read_utils.cpp
+++ b/core/libs/rawengine/libraw/src/utils/read_utils.cpp
@@ -159,10 +159,10 @@ double libraw_sgetreal_static(short _order, int type, uchar *s)
   case LIBRAW_EXIFTAG_TYPE_DOUBLE:
     rev = 7 * ((_order == 0x4949) == (ntohs(0x1234) == 0x1234));
     for (i = 0; i < 8; i++)
-      u.c[i ^ rev] = *(s+1);
+      u.c[i ^ rev] = *(s+i);
     return u.d;
   default:
-    return *(s+1);
+    return *s;
   }
 }
 
diff --git a/core/libs/rawengine/libraw/src/utils/thumb_utils.cpp b/core/libs/rawengine/libraw/src/utils/thumb_utils.cpp
index 5b974c2dd4..f4015e18ef 100644
--- a/core/libs/rawengine/libraw/src/utils/thumb_utils.cpp
+++ b/core/libs/rawengine/libraw/src/utils/thumb_utils.cpp
@@ -254,7 +254,6 @@ void LibRaw::kodak_thumb_loader()
   libraw_internal_data.unpacker_data.load_flags = s_flags;
 }
 
-// ������� thumbnail �� �����, ������ thumb_format � ������������ � ��������
 
 int LibRaw::thumbOK(INT64 maxsz)
 {
diff --git a/core/libs/rawengine/libraw/src/write/file_write.cpp b/core/libs/rawengine/libraw/src/write/file_write.cpp
index f7023492d5..ce8672c5a7 100644
--- a/core/libs/rawengine/libraw/src/write/file_write.cpp
+++ b/core/libs/rawengine/libraw/src/write/file_write.cpp
@@ -144,7 +144,7 @@ void LibRaw::jpeg_thumb_writer(FILE *tfp, char *t_humb, int t_humb_length)
   struct tiff_hdr th;
   fputc(0xff, tfp);
   fputc(0xd8, tfp);
-  if (strcmp(t_humb + 6, "Exif"))
+  if (memcmp(t_humb + 6, "Exif\0",5))
   {
     memcpy(exif, "\xff\xe1  Exif\0\0", 10);
     exif[1] = htons(8 + sizeof th);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.