[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);