diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index da027800e1..012d7933a8 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -262,7 +262,7 @@ static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding, static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const char *key) { uint8_t *dst; - int encoding, dict_flags = AV_DICT_DONT_OVERWRITE; + int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL; unsigned genre; if (taglen < 1) @@ -280,7 +280,7 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const cha && (sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) && genre <= ID3v1_GENRE_MAX) { av_freep(&dst); - dst = ff_id3v1_genre_str[genre]; + dst = av_strdup(ff_id3v1_genre_str[genre]); } else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX"))) { /* dst now contains the key, need to get value */ key = dst; @@ -289,11 +289,8 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const cha av_freep(&key); return; } - dict_flags |= AV_DICT_DONT_STRDUP_VAL | AV_DICT_DONT_STRDUP_KEY; - } - else if (*dst) - dict_flags |= AV_DICT_DONT_STRDUP_VAL; - else + dict_flags |= AV_DICT_DONT_STRDUP_KEY; + } else if (!*dst) av_freep(&dst); if (dst)