69 lines
2.2 KiB
Diff
69 lines
2.2 KiB
Diff
diff -Naru ffmpeg-4.2.4/libavformat/vividas.c ffmpeg-4.2.4-new/libavformat/vividas.c
|
|
--- ffmpeg-4.2.4/libavformat/vividas.c 2022-05-24 10:57:25.967425000 +0800
|
|
+++ ffmpeg-4.2.4-new/libavformat/vividas.c 2022-05-24 11:07:17.698072000 +0800
|
|
@@ -27,7 +27,7 @@
|
|
* @author Andrzej Szombierski [qq at kuku eu org] (2010-07)
|
|
* @sa http://wiki.multimedia.cx/index.php?title=Vividas_VIV
|
|
*/
|
|
-
|
|
+#include "libavutil/avassert.h"
|
|
#include "libavutil/intreadwrite.h"
|
|
#include "avio_internal.h"
|
|
#include "avformat.h"
|
|
@@ -278,7 +278,7 @@
|
|
|
|
static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *buf, int size)
|
|
{
|
|
- int i,j;
|
|
+ int i, j, ret;
|
|
int64_t off;
|
|
int val_1;
|
|
int num_video;
|
|
@@ -372,7 +372,7 @@
|
|
|
|
if (avio_tell(pb) < off) {
|
|
int num_data;
|
|
- int xd_size = 0;
|
|
+ int xd_size = 1;
|
|
int data_len[256];
|
|
int offset = 1;
|
|
uint8_t *p;
|
|
@@ -387,24 +387,19 @@
|
|
return AVERROR_INVALIDDATA;
|
|
}
|
|
data_len[j] = len;
|
|
- xd_size += len;
|
|
+ xd_size += len + 1 + len/255;
|
|
}
|
|
|
|
- st->codecpar->extradata_size = 64 + xd_size + xd_size / 255;
|
|
- if (ff_alloc_extradata(st->codecpar, st->codecpar->extradata_size)) {
|
|
- av_free(pb);
|
|
- return AVERROR(ENOMEM);
|
|
- }
|
|
+ ret = ff_alloc_extradata(st->codecpar, xd_size);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
|
|
p = st->codecpar->extradata;
|
|
p[0] = 2;
|
|
|
|
for (j = 0; j < num_data - 1; j++) {
|
|
unsigned delta = av_xiphlacing(&p[offset], data_len[j]);
|
|
- if (delta > data_len[j]) {
|
|
- av_free(pb);
|
|
- return AVERROR_INVALIDDATA;
|
|
- }
|
|
+ av_assert0(delta <= xd_size - offset);
|
|
offset += delta;
|
|
}
|
|
|
|
@@ -415,6 +410,7 @@
|
|
av_freep(&st->codecpar->extradata);
|
|
break;
|
|
}
|
|
+ av_assert0(data_len[j] <= xd_size - offset);
|
|
offset += data_len[j];
|
|
}
|
|
|