| https://github.com/uclouvain/openjpeg/pull/1450 | |
| https://patch-diff.githubusercontent.com/raw/uclouvain/openjpeg/pull/1450.patch | |
| From 093ccb0ecdba7d5c4b5363e7dda33b1769fcc08a Mon Sep 17 00:00:00 2001 | |
| From: Mark Mentovai <mark@chromium.org> | |
| Date: Mon, 7 Nov 2022 09:32:02 -0500 | |
| Subject: [PATCH] openjp2/j2k: replace sprintf calls with snprintf | |
| MIME-Version: 1.0 | |
| Content-Type: text/plain; charset=UTF-8 | |
| Content-Transfer-Encoding: 8bit | |
| This makes it possible to build j2k.c without warnings using the macOS | |
| 13 SDK. Calls to sprintf are replaced with snprintf, passing appropriate | |
| buffer sizes. | |
| It doesn’t appear that any of the changed uses of sprintf were actually | |
| unsafe, so no behavior change is expected aside from SDK compatibility. | |
| The macOS 13 SDK deprecates sprintf as it’s difficult to use safely. The | |
| deprecation warning message is visible when building C++, but it is not | |
| normally visible when building plain C code due to a quirk in how | |
| sprintf is declared in the SDK. However, the deprecation message is | |
| visible when building plain C under Address Sanitizer | |
| (-fsanitize=address). This discrepancy was discovered at | |
| https://crbug.com/1381706 and reported to Apple with a copy at | |
| https://openradar.appspot.com/FB11761475. | |
| The macOS 13 SDK is packaged in Xcode 14.1, released on 2022-11-01. This | |
| also affects the iOS 16 SDK and other 2022-era Apple OS SDKs packaged in | |
| Xcode 14.0, released on 2022-09-12. | |
| j2k.c is visible to the Chromium build via PDFium, and this change is | |
| needed to allow Chromium to move forward to the macOS 13 SDK. | |
| This change is limited to src/lib/openjp2. Other uses of sprintf were | |
| found throughout openjpeg. | |
| --- | |
| src/lib/openjp2/j2k.c | 13 ++++++++----- | |
| 1 file changed, 8 insertions(+), 5 deletions(-) | |
| diff --git a/src/lib/openjp2/j2k.c b/src/lib/openjp2/j2k.c | |
| index 923bd8916..354415df7 100644 | |
| --- a/src/lib/openjp2/j2k.c | |
| +++ b/src/lib/openjp2/j2k.c | |
| @@ -7954,21 +7954,24 @@ OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k, | |
| /* UniPG>> */ | |
| #ifdef USE_JPWL | |
| - cp->comment = (char*)opj_malloc(clen + strlen(version) + 11); | |
| + const size_t cp_comment_buf_size = clen + strlen(version) + 11; | |
| + cp->comment = (char*)opj_malloc(cp_comment_buf_size); | |
| if (!cp->comment) { | |
| opj_event_msg(p_manager, EVT_ERROR, | |
| "Not enough memory to allocate comment string\n"); | |
| return OPJ_FALSE; | |
| } | |
| - sprintf(cp->comment, "%s%s with JPWL", comment, version); | |
| + snprintf(cp->comment, cp_comment_buf_size, "%s%s with JPWL", | |
| + comment, version); | |
| #else | |
| - cp->comment = (char*)opj_malloc(clen + strlen(version) + 1); | |
| + const size_t cp_comment_buf_size = clen + strlen(version) + 1; | |
| + cp->comment = (char*)opj_malloc(cp_comment_buf_size); | |
| if (!cp->comment) { | |
| opj_event_msg(p_manager, EVT_ERROR, | |
| "Not enough memory to allocate comment string\n"); | |
| return OPJ_FALSE; | |
| } | |
| - sprintf(cp->comment, "%s%s", comment, version); | |
| + snprintf(cp->comment, cp_comment_buf_size, "%s%s", comment, version); | |
| #endif | |
| /* <<UniPG */ | |
| } | |
| @@ -11973,7 +11976,7 @@ static OPJ_BOOL opj_j2k_move_data_from_codec_to_output_image(opj_j2k_t * p_j2k, | |
| p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data; | |
| #if 0 | |
| char fn[256]; | |
| - sprintf(fn, "/tmp/%d.raw", compno); | |
| + snprintf(fn, sizeof fn, "/tmp/%d.raw", compno); | |
| FILE *debug = fopen(fn, "wb"); | |
| fwrite(p_image->comps[compno].data, sizeof(OPJ_INT32), | |
| p_image->comps[compno].w * p_image->comps[compno].h, debug); |