aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrcombs <rcombs@rcombs.me>2021-12-23 19:28:35 -0600
committerrcombs <rcombs@rcombs.me>2022-01-04 19:39:22 -0600
commitf00079b25c44d6b9f01bb3688bfd1cd49abefac8 (patch)
tree187817dc685d3ba8e4001216158dc8a94b9d3200
parente24b71add534b44909519dcd0b5eaa0c9e9c9bbc (diff)
downloadffmpeg-f00079b25c44d6b9f01bb3688bfd1cd49abefac8.tar.gz
lavfi/drawutils: ensure we don't allow mixed-byte-depth formats
These could be hazardous because of FFDrawColor's union
-rw-r--r--libavfilter/drawutils.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c
index e4d6ddcf4c..99c124822d 100644
--- a/libavfilter/drawutils.c
+++ b/libavfilter/drawutils.c
@@ -83,6 +83,7 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags)
unsigned i, nb_planes = 0;
int pixelstep[MAX_PLANES] = { 0 };
int full_range = 0;
+ int depthb = 0;
if (!desc || !desc->name)
return AVERROR(EINVAL);
@@ -96,6 +97,7 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags)
format == AV_PIX_FMT_YUVJ411P || format == AV_PIX_FMT_YUVJ440P)
full_range = 1;
for (i = 0; i < desc->nb_components; i++) {
+ int db;
c = &desc->comp[i];
/* for now, only 8-16 bits formats */
if (c->depth < 8 || c->depth > 16)
@@ -105,6 +107,11 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags)
/* data must either be in the high or low bits, never middle */
if (c->shift && ((c->shift + c->depth) & 0x7))
return AVERROR(ENOSYS);
+ /* mixed >8 and <=8 depth */
+ db = (c->depth + 7) / 8;
+ if (depthb && (depthb != db))
+ return AVERROR(ENOSYS);
+ depthb = db;
/* strange interleaving */
if (pixelstep[c->plane] != 0 &&
pixelstep[c->plane] != c->step)