Skip to content

Commit ad9f644

Browse files
committed
avformat/avformat: Avoid av_strdup(NULL)
It is not documented to be safe. Also copy these lists in a more generic manner. Signed-off-by: Andreas Rheinhardt <[email protected]>
1 parent 569ad28 commit ad9f644

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

libavformat/avformat.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -875,20 +875,28 @@ const AVCodec *ff_find_decoder(AVFormatContext *s, const AVStream *st,
875875

876876
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
877877
{
878+
#define OFF(field) offsetof(AVFormatContext, field)
879+
static const unsigned offsets[] = {
880+
OFF(codec_whitelist), OFF(format_whitelist),
881+
OFF(protocol_whitelist), OFF(protocol_blacklist),
882+
};
883+
#undef OFF
878884
av_assert0(!dst->codec_whitelist &&
879885
!dst->format_whitelist &&
880886
!dst->protocol_whitelist &&
881887
!dst->protocol_blacklist);
882-
dst-> codec_whitelist = av_strdup(src->codec_whitelist);
883-
dst->format_whitelist = av_strdup(src->format_whitelist);
884-
dst->protocol_whitelist = av_strdup(src->protocol_whitelist);
885-
dst->protocol_blacklist = av_strdup(src->protocol_blacklist);
886-
if ( (src-> codec_whitelist && !dst-> codec_whitelist)
887-
|| (src-> format_whitelist && !dst-> format_whitelist)
888-
|| (src->protocol_whitelist && !dst->protocol_whitelist)
889-
|| (src->protocol_blacklist && !dst->protocol_blacklist)) {
890-
av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
891-
return AVERROR(ENOMEM);
888+
for (unsigned i = 0; i < FF_ARRAY_ELEMS(offsets); i++) {
889+
const char *src_str = *(char *const*)((const char*)src + offsets[i]);
890+
891+
if (src_str) {
892+
char *dst_str = av_strdup(src_str);
893+
if (!dst_str) {
894+
av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
895+
return AVERROR(ENOMEM);
896+
}
897+
898+
*(char **)((char*)dst + offsets[i]) = dst_str;
899+
}
892900
}
893901
return 0;
894902
}

0 commit comments

Comments
 (0)