Skip to content

Commit 51f48a6

Browse files
committed
Fixed icc_data allocation
1 parent 1f4ce88 commit 51f48a6

1 file changed

Lines changed: 13 additions & 15 deletions

File tree

Source/Plugins/PluginJPEG.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -516,14 +516,14 @@ jpeg_read_icc_profile(j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned *i
516516

517517
*icc_data_ptr = nullptr; // avoid confusion if FALSE return
518518
*icc_data_len = 0;
519-
519+
520520
/**
521521
this first pass over the saved markers discovers whether there are
522522
any ICC markers and verifies the consistency of the marker numbering.
523523
*/
524-
524+
525525
memset(marker_present, 0, (MAX_SEQ_NO + 1));
526-
526+
527527
for (marker = cinfo->marker_list; marker; marker = marker->next) {
528528
if (marker_is_icc(marker)) {
529529
if (num_markers == 0) {
@@ -545,15 +545,15 @@ jpeg_read_icc_profile(j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned *i
545545
data_length[seq_no] = marker->data_length - ICC_HEADER_SIZE;
546546
}
547547
}
548-
548+
549549
if (num_markers == 0)
550550
return FALSE;
551551

552552
/**
553553
check for missing markers, count total space needed,
554554
compute offset of each marker's part of the data.
555555
*/
556-
556+
557557
total_length = 0;
558558
for (seq_no = 1; seq_no <= num_markers; seq_no++) {
559559
if (marker_present[seq_no] == 0) {
@@ -562,38 +562,36 @@ jpeg_read_icc_profile(j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned *i
562562
data_offset[seq_no] = total_length;
563563
total_length += data_length[seq_no];
564564
}
565-
565+
566566
if (total_length <= 0) {
567567
return FALSE; // found only empty markers ?
568568
}
569-
569+
570570
// allocate space for assembled data
571-
std::unique_ptr<void, decltype(&free)> safeIcc(malloc(total_length * sizeof(JOCTET), &free);
572-
auto *icc_data = static_cast<JOCTET*>(safeIcc.get());
571+
std::unique_ptr<JOCTET, decltype(&free)> icc_data(static_cast<JOCTET*>(malloc(total_length * sizeof(JOCTET))), &free);
573572
if (!icc_data) {
574573
return FALSE; // out of memory
575574
}
576-
575+
577576
// and fill it in
578577
for (marker = cinfo->marker_list; marker; marker = marker->next) {
579578
if (marker_is_icc(marker)) {
580579
JOCTET FAR *src_ptr;
581580
JOCTET *dst_ptr;
582581
unsigned length;
583582
seq_no = GETJOCTET(marker->data[12]);
584-
dst_ptr = icc_data + data_offset[seq_no];
583+
dst_ptr = icc_data.get() + data_offset[seq_no];
585584
src_ptr = marker->data + ICC_HEADER_SIZE;
586585
length = data_length[seq_no];
587586
while (length--) {
588587
*dst_ptr++ = *src_ptr++;
589588
}
590589
}
591590
}
592-
593-
*icc_data_ptr = icc_data;
591+
592+
*icc_data_ptr = icc_data.release();
594593
*icc_data_len = total_length;
595-
safeIcc.release();
596-
594+
597595
return TRUE;
598596
}
599597
#endif

0 commit comments

Comments
 (0)