Skip to content

Commit 5fe3a6d

Browse files
committed
copy dynamically allocated error messages in plugins to decoder context to avoid dangling pointer
1 parent 3095e53 commit 5fe3a6d

8 files changed

+90
-6
lines changed

libheif/plugins/decoder_aom.cc

+5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct aom_decoder
3737
aom_codec_iface_t* iface;
3838

3939
bool strict_decoding = false;
40+
std::string error_message;
4041
};
4142

4243
static const char kSuccess[] = "Success";
@@ -255,6 +256,10 @@ struct heif_error aom_decode_image(void* decoder_raw, struct heif_image** out_im
255256

256257
err = heif_image_add_plane(heif_img, channel2plane[c], w, h, bpp);
257258
if (err.code != heif_error_Ok) {
259+
// copy error message to decoder object because heif_image will be released
260+
decoder->error_message = err.message;
261+
err.message = decoder->error_message.c_str();
262+
258263
heif_image_release(heif_img);
259264
return err;
260265
}

libheif/plugins/decoder_dav1d.cc

+5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct dav1d_decoder
3939
Dav1dContext* context;
4040
Dav1dData data;
4141
bool strict_decoding = false;
42+
std::string error_message;
4243
};
4344

4445
static const char kEmptyString[] = "";
@@ -275,6 +276,10 @@ struct heif_error dav1d_decode_image(void* decoder_raw, struct heif_image** out_
275276

276277
err = heif_image_add_plane(heif_img, channel2plane[c], w, h, bpp);
277278
if (err.code != heif_error_Ok) {
279+
// copy error message to decoder object because heif_image will be released
280+
decoder->error_message = err.message;
281+
err.message = decoder->error_message.c_str();
282+
278283
heif_image_release(heif_img);
279284
return err;
280285
}

libheif/plugins/decoder_ffmpeg.cc

+7-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct ffmpeg_decoder
4141
{
4242
NalMap nalMap;
4343
bool strict_decoding = false;
44+
std::string error_message;
4445
};
4546

4647
static const int FFMPEG_DECODER_PLUGIN_PRIORITY = 90;
@@ -217,7 +218,7 @@ static int get_ffmpeg_format_bpp(enum AVPixelFormat pix_fmt)
217218
}
218219
}
219220

220-
static struct heif_error hevc_decode(AVCodecContext* hevc_dec_ctx, AVFrame* hevc_frame, AVPacket* hevc_pkt, struct heif_image** image)
221+
static struct heif_error hevc_decode(ffmpeg_decoder* decoder, AVCodecContext* hevc_dec_ctx, AVFrame* hevc_frame, AVPacket* hevc_pkt, struct heif_image** image)
221222
{
222223
int ret;
223224

@@ -288,6 +289,10 @@ static struct heif_error hevc_decode(AVCodecContext* hevc_dec_ctx, AVFrame* hevc
288289

289290
err = heif_image_add_plane(*image, channel2plane[channel], w, h, bpp);
290291
if (err.code) {
292+
// copy error message to decoder object because heif_image will be released
293+
decoder->error_message = err.message;
294+
err.message = decoder->error_message.c_str();
295+
291296
heif_image_release(*image);
292297
return err;
293298
}
@@ -475,7 +480,7 @@ static struct heif_error ffmpeg_v1_decode_image(void* decoder_raw,
475480

476481
if (hevc_pkt->size)
477482
{
478-
err = hevc_decode(hevc_codecContext, hevc_frame, hevc_pkt, out_img);
483+
err = hevc_decode(decoder, hevc_codecContext, hevc_frame, hevc_pkt, out_img);
479484
if (err.code != heif_error_Ok)
480485
goto errexit;
481486
}

libheif/plugins/decoder_jpeg.cc

+22-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ extern "C" {
3636
struct jpeg_decoder
3737
{
3838
std::vector<uint8_t> data;
39+
std::string error_message;
3940
};
4041

4142
static const char kSuccess[] = "Success";
@@ -222,7 +223,15 @@ struct heif_error jpeg_decode_image(void* decoder_raw, struct heif_image** out_i
222223
return err;
223224
}
224225

225-
heif_image_add_plane(heif_img, heif_channel_Y, cinfo.output_width, cinfo.output_height, 8);
226+
err = heif_image_add_plane(heif_img, heif_channel_Y, cinfo.output_width, cinfo.output_height, 8);
227+
if (err.code) {
228+
// copy error message to decoder object because heif_image will be released
229+
decoder->error_message = err.message;
230+
err.message = decoder->error_message.c_str();
231+
232+
heif_image_release(heif_img);
233+
return err;
234+
}
226235

227236
size_t y_stride;
228237
uint8_t* py = heif_image_get_plane2(heif_img, heif_channel_Y, &y_stride);
@@ -262,14 +271,26 @@ struct heif_error jpeg_decode_image(void* decoder_raw, struct heif_image** out_i
262271

263272
err = heif_image_add_plane(heif_img, heif_channel_Y, cinfo.output_width, cinfo.output_height, 8);
264273
if (err.code) {
274+
// copy error message to decoder object because heif_image will be released
275+
decoder->error_message = err.message;
276+
err.message = decoder->error_message.c_str();
277+
265278
return err;
266279
}
267280
err = heif_image_add_plane(heif_img, heif_channel_Cb, (cinfo.output_width + 1) / 2, (cinfo.output_height + 1) / 2, 8);
268281
if (err.code) {
282+
// copy error message to decoder object because heif_image will be released
283+
decoder->error_message = err.message;
284+
err.message = decoder->error_message.c_str();
285+
269286
return err;
270287
}
271288
err = heif_image_add_plane(heif_img, heif_channel_Cr, (cinfo.output_width + 1) / 2, (cinfo.output_height + 1) / 2, 8);
272289
if (err.code) {
290+
// copy error message to decoder object because heif_image will be released
291+
decoder->error_message = err.message;
292+
err.message = decoder->error_message.c_str();
293+
273294
return err;
274295
}
275296

libheif/plugins/decoder_libde265.cc

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ struct libde265_decoder
3535
{
3636
de265_decoder_context* ctx;
3737
bool strict_decoding = false;
38+
std::string error_message;
3839
};
3940

4041
static const char kEmptyString[] = "";
@@ -138,6 +139,10 @@ static struct heif_error convert_libde265_image_to_heif_image(struct libde265_de
138139

139140
err = heif_image_add_plane(*image, channel2plane[c], w,h, bpp);
140141
if (err.code) {
142+
// copy error message to decoder object because heif_image will be released
143+
decoder->error_message = err.message;
144+
err.message = decoder->error_message.c_str();
145+
141146
heif_image_release(*image);
142147
return err;
143148
}

libheif/plugins/decoder_openh264.cc

+30-3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
struct openh264_decoder
3434
{
3535
std::vector<uint8_t> data;
36+
std::string error_message;
3637
};
3738

3839
static const char kSuccess[] = "Success";
@@ -263,9 +264,35 @@ struct heif_error openh264_decode_image(void* decoder_raw, struct heif_image** o
263264

264265
*out_img = heif_img;
265266

266-
heif_image_add_plane(heif_img, heif_channel_Y, width, height, 8);
267-
heif_image_add_plane(heif_img, heif_channel_Cb, cwidth, cheight, 8);
268-
heif_image_add_plane(heif_img, heif_channel_Cr, cwidth, cheight, 8);
267+
err = heif_image_add_plane(heif_img, heif_channel_Y, width, height, 8);
268+
if (err.code != heif_error_Ok) {
269+
// copy error message to decoder object because heif_image will be released
270+
decoder->error_message = err.message;
271+
err.message = decoder->error_message.c_str();
272+
273+
heif_image_release(heif_img);
274+
return err;
275+
}
276+
277+
err = heif_image_add_plane(heif_img, heif_channel_Cb, cwidth, cheight, 8);
278+
if (err.code != heif_error_Ok) {
279+
// copy error message to decoder object because heif_image will be released
280+
decoder->error_message = err.message;
281+
err.message = decoder->error_message.c_str();
282+
283+
heif_image_release(heif_img);
284+
return err;
285+
}
286+
287+
err = heif_image_add_plane(heif_img, heif_channel_Cr, cwidth, cheight, 8);
288+
if (err.code != heif_error_Ok) {
289+
// copy error message to decoder object because heif_image will be released
290+
decoder->error_message = err.message;
291+
err.message = decoder->error_message.c_str();
292+
293+
heif_image_release(heif_img);
294+
return err;
295+
}
269296

270297
size_t y_stride;
271298
size_t cb_stride;

libheif/plugins/decoder_openjpeg.cc

+11
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <vector>
2929
#include <cassert>
3030
#include <memory>
31+
#include <err.h>
3132

3233
static const int OPENJPEG_PLUGIN_PRIORITY = 100;
3334
static const int OPENJPEG_PLUGIN_PRIORITY_HTJ2K = 90;
@@ -36,6 +37,7 @@ struct openjpeg_decoder
3637
{
3738
std::vector<uint8_t> encoded_data;
3839
size_t read_position = 0;
40+
std::string error_message;
3941
};
4042

4143

@@ -368,6 +370,15 @@ struct heif_error openjpeg_decode_image(void* decoder_raw, struct heif_image** o
368370
int cheight = opj_comp.h;
369371

370372
error = heif_image_add_plane(*out_img, channels[c], cwidth, cheight, bit_depth);
373+
if (error.code) {
374+
// copy error message to decoder object because heif_image will be released
375+
decoder->error_message = error.message;
376+
error.message = decoder->error_message.c_str();
377+
378+
heif_image_release(*out_img);
379+
*out_img = nullptr;
380+
return error;
381+
}
371382

372383
size_t stride = 0;
373384
uint8_t* p = heif_image_get_plane2(*out_img, channels[c], &stride);

libheif/plugins/decoder_vvdec.cc

+5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ struct vvdec_decoder
4242
bool strict_decoding = false;
4343

4444
std::vector<std::vector<uint8_t>> nalus;
45+
std::string error_message;
4546
};
4647

4748
static const char kSuccess[] = "Success";
@@ -298,6 +299,10 @@ struct heif_error vvdec_decode_image(void* decoder_raw, struct heif_image** out_
298299

299300
err = heif_image_add_plane(heif_img, channel2plane[c], w, h, bpp);
300301
if (err.code != heif_error_Ok) {
302+
// copy error message to decoder object because heif_image will be released
303+
decoder->error_message = err.message;
304+
err.message = decoder->error_message.c_str();
305+
301306
heif_image_release(heif_img);
302307
return err;
303308
}

0 commit comments

Comments
 (0)