static inline void get_strl(AVIOContext *pb, char *buf, int buf_size, int len)
{
- int i;
- char *q, r;
+ int read = avio_get_str(pb, len, buf, buf_size);
- q = buf;
- for(i=0;i<len;i++) {
- r = avio_r8(pb);
- if (i < buf_size - 1)
- *q++ = r;
- }
- if (buf_size > 0) *q = '\0';
+ if (read > 0)
+ avio_skip(pb, len - read);
}
static void get_str8(AVIOContext *pb, char *buf, int buf_size)
for (i=0; i<FF_ARRAY_ELEMS(ff_rm_metadata); i++) {
int len = wide ? avio_rb16(pb) : avio_r8(pb);
- get_strl(pb, buf, sizeof(buf), len);
- av_dict_set(&s->metadata, ff_rm_metadata[i], buf, 0);
+ if (len > 0) {
+ get_strl(pb, buf, sizeof(buf), len);
+ av_dict_set(&s->metadata, ff_rm_metadata[i], buf, 0);
+ }
}
}
size2 = avio_rb32(pb);
ret = ff_rm_read_mdpr_codecdata(s, s->pb, st2, st2->priv_data,
- size2, mime);
+ size2, NULL);
if (ret < 0)
return ret;
}
if (avio_rb32(pb) == MKBETAG('M', 'L', 'T', 'I')) {
ret = rm_read_multi(s, pb, st, NULL);
} else {
+ if (avio_feof(pb))
+ return AVERROR_INVALIDDATA;
avio_seek(pb, -4, SEEK_CUR);
ret = ff_rm_read_mdpr_codecdata(s, pb, st, st->priv_data, len, NULL);
}