Update OpenJPEG to 2.5.4
Upgrade OpenJPEG and remove the need to separately maintain
0049-check_after_parsing.patch. This supersedes
https://pdfium-review.googlesource.com/135731.
Bug: 445128546
Change-Id: I4d9af7baec551653b9b057e646ea8c48182ee722
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/135990
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/third_party/libopenjpeg/0049-check_after_parsing.patch b/third_party/libopenjpeg/0049-check_after_parsing.patch
deleted file mode 100644
index 8448324..0000000
--- a/third_party/libopenjpeg/0049-check_after_parsing.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-commit f809b80c67717c152a5ad30bf06774f00da4fd2d
-Author: Sebastian Rasmussen <sebras@gmail.com>
-Date: Thu Jan 16 02:13:43 2025 +0100
-
- opj_jp2_read_header: Check for error after parsing header.
-
- Consider the case where the caller has not set the p_image
- pointer to NULL before calling opj_read_header().
-
- If opj_j2k_read_header_procedure() fails while obtaining the rest
- of the marker segment when calling opj_stream_read_data() because
- the data stream is too short, then opj_j2k_read_header() will
- never have the chance to initialize p_image, leaving it
- uninitialized.
-
- opj_jp2_read_header() will check the p_image value whether
- opj_j2k_read_header() suceeded or failed. This may be detected as
- an error in valgrind or ASAN.
-
- The fix is to check whether opj_j2k_read_header() suceeded before
- using the output argument p_image.
-
-diff --git a/src/lib/openjp2/jp2.c b/src/lib/openjp2/jp2.c
-index 4df055a5..da506318 100644
---- a/src/lib/openjp2/jp2.c
-+++ b/src/lib/openjp2/jp2.c
-@@ -2873,7 +2873,7 @@ OPJ_BOOL opj_jp2_read_header(opj_stream_private_t *p_stream,
- p_image,
- p_manager);
-
-- if (p_image && *p_image) {
-+ if (ret && p_image && *p_image) {
- /* Set Image Color Space */
- if (jp2->enumcs == 16) {
- (*p_image)->color_space = OPJ_CLRSPC_SRGB;
diff --git a/third_party/libopenjpeg/README.pdfium b/third_party/libopenjpeg/README.pdfium
index 921be5a..eacdae0 100644
--- a/third_party/libopenjpeg/README.pdfium
+++ b/third_party/libopenjpeg/README.pdfium
@@ -1,7 +1,7 @@
Name: OpenJPEG
URL: https://github.com/uclouvain/openjpeg
-Version: 2.5.3 (also update in opj_config*)
-Revision: 210a8a5690d0da66f02d49420d7176a21ef409dc
+Version: 2.5.4
+Revision: 6c4a29b00211eb0430fa0e5e890f1ce5c80f409f
Security Critical: yes
Shipped: yes
License: BSD-2-Clause
@@ -32,4 +32,7 @@
0039-opj_mqc_renorme.patch: Remove unused opj_mqc_renorme().
0041-remove_opj_clock.patch: Remove unused opj_clock.h include.
0046-func-ptr-mixup.patch: Prevent mixing up function pointer types.
-0049-check_after_parsing.patch: Check for error after parsing header.
+
+Note:
+
+Also update the version numbers in opj_config*.
diff --git a/third_party/libopenjpeg/jp2.c b/third_party/libopenjpeg/jp2.c
index af3b38f..b85c5cd 100644
--- a/third_party/libopenjpeg/jp2.c
+++ b/third_party/libopenjpeg/jp2.c
@@ -2008,6 +2008,12 @@
if (image->icc_profile_len) {
jp2->meth = 2;
jp2->enumcs = 0;
+ jp2->color.icc_profile_buf = (OPJ_BYTE *)opj_malloc(image->icc_profile_len);
+ if (jp2->color.icc_profile_buf) {
+ jp2->color.icc_profile_len = image->icc_profile_len;
+ memcpy(jp2->color.icc_profile_buf, image->icc_profile_buf,
+ image->icc_profile_len);
+ }
} else {
jp2->meth = 1;
if (image->color_space == OPJ_CLRSPC_SRGB) {
diff --git a/third_party/libopenjpeg/openjpeg.h b/third_party/libopenjpeg/openjpeg.h
index 59abd32..fe2f1ee 100644
--- a/third_party/libopenjpeg/openjpeg.h
+++ b/third_party/libopenjpeg/openjpeg.h
@@ -635,6 +635,8 @@
/*
* Callback function prototype for read function
+ * @return returns The number of bytes delivered into
+ * \a p_buffer. -1 signals end of stream.
*/
typedef OPJ_SIZE_T(* opj_stream_read_fn)(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
void * p_user_data) ;
@@ -1239,7 +1241,6 @@
/**
* Sets the length of the user data for the stream.
- *
* @param p_stream the stream to modify
* @param data_length length of the user_data.
*/
@@ -1437,6 +1438,8 @@
* that is to say at the highest resolution level, even if requesting the image at lower
* resolution levels.
*
+ * Note: If p_start_x, p_start_y, p_end_x, p_end_y are all 0, then the whole image is decoded.
+ *
* Generally opj_set_decode_area() should be followed by opj_decode(), and the
* codec cannot be re-used.
* In the particular case of an image made of a single tile, several sequences of
diff --git a/third_party/libopenjpeg/opj_config.h b/third_party/libopenjpeg/opj_config.h
index 5aefbfe..2f0301b 100644
--- a/third_party/libopenjpeg/opj_config.h
+++ b/third_party/libopenjpeg/opj_config.h
@@ -13,4 +13,4 @@
/* Version number. */
#define OPJ_VERSION_MAJOR 2
#define OPJ_VERSION_MINOR 5
-#define OPJ_VERSION_BUILD 3
+#define OPJ_VERSION_BUILD 4
diff --git a/third_party/libopenjpeg/opj_config_private.h b/third_party/libopenjpeg/opj_config_private.h
index 74a8845..4f9236c 100644
--- a/third_party/libopenjpeg/opj_config_private.h
+++ b/third_party/libopenjpeg/opj_config_private.h
@@ -7,7 +7,7 @@
/* create opj_config_private.h for CMake */
#define OPJ_HAVE_INTTYPES_H 1
-#define OPJ_PACKAGE_VERSION "2.5.3"
+#define OPJ_PACKAGE_VERSION "2.5.4"
/* Not used by openjp2*/
/*#define HAVE_MEMORY_H 1*/