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*/