#include "libavutil/intreadwrite.h"
#include "avformat.h"
+#include "apetag.h"
#define ENABLE_DEBUG 0
static int ape_tag_read_field(AVFormatContext *s)
{
ByteIOContext *pb = s->pb;
- uint8_t key[1024], value[1024];
+ uint8_t key[1024], *value;
uint32_t size, flags;
- int i, l, c;
+ int i, c;
size = get_le32(pb); /* field size */
flags = get_le32(pb); /* field flags */
av_log(s, AV_LOG_WARNING, "Invalid APE tag key '%s'.\n", key);
return -1;
}
- l = FFMIN(size, sizeof(value)-1);
- get_buffer(pb, value, l);
- value[l] = 0;
- url_fskip(pb, size-l);
- if (l < size)
- av_log(s, AV_LOG_WARNING, "Too long '%s' tag was truncated.\n", key);
- av_metadata_set(&s->metadata, key, value);
+ if (size >= UINT_MAX)
+ return -1;
+ value = av_malloc(size+1);
+ if (!value)
+ return AVERROR(ENOMEM);
+ get_buffer(pb, value, size);
+ value[size] = 0;
+ av_metadata_set2(&s->metadata, key, value, AV_METADATA_DONT_STRDUP_VAL);
return 0;
}