This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 4fad136704 avfilter/vf_stack: add checks for the final canvas 
dimensions
4fad136704 is described below

commit 4fad1367040e093c8a52f4f34054e4feb5203243
Author:     James Almer <[email protected]>
AuthorDate: Sat Jan 3 21:31:30 2026 -0300
Commit:     James Almer <[email protected]>
CommitDate: Sat Jan 3 21:31:30 2026 -0300

    avfilter/vf_stack: add checks for the final canvas dimensions
    
    Prevents potential integer overflows when trying to stitch absurdly huge 
images together.
    
    Fixes #YWH-PGM40646-38.
    
    Signed-off-by: James Almer <[email protected]>
---
 libavfilter/vf_stack.c | 38 ++++++++++++++++++++++++++++++++------
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/libavfilter/vf_stack.c b/libavfilter/vf_stack.c
index a36e1bab64..6e9ac60a56 100644
--- a/libavfilter/vf_stack.c
+++ b/libavfilter/vf_stack.c
@@ -234,6 +234,8 @@ static int config_output(AVFilterLink *outlink)
                 item->y[1] = item->y[2] = AV_CEIL_RSHIFT(height, 
s->desc->log2_chroma_h);
                 item->y[0] = item->y[3] = height;
 
+                if (height > INT_MAX - ctx->inputs[i]->h)
+                    return AVERROR(EINVAL);
                 height += ctx->inputs[i]->h;
             }
         }
@@ -259,6 +261,8 @@ static int config_output(AVFilterLink *outlink)
                     return ret;
                 }
 
+                if (width > INT_MAX - ctx->inputs[i]->w)
+                    return AVERROR(EINVAL);
                 width += ctx->inputs[i]->w;
             }
         }
@@ -294,8 +298,13 @@ static int config_output(AVFilterLink *outlink)
 
                 item->y[1] = item->y[2] = AV_CEIL_RSHIFT(inh, 
s->desc->log2_chroma_h);
                 item->y[0] = item->y[3] = inh;
+
+                if (inw > INT_MAX - ctx->inputs[k]->w)
+                    return AVERROR(EINVAL);
                 inw += ctx->inputs[k]->w;
             }
+            if (height > INT_MAX - row_height)
+                return AVERROR(EINVAL);
             height += row_height;
             if (!i)
                 width = inw;
@@ -351,26 +360,41 @@ static int config_output(AVFilterLink *outlink)
                         if (size == i || size < 0 || size >= s->nb_inputs)
                             return AVERROR(EINVAL);
 
-                        if (!j)
+                        if (!j) {
+                            if (inw > INT_MAX - ctx->inputs[size]->w)
+                                return AVERROR(EINVAL);
                             inw += ctx->inputs[size]->w;
-                        else
+                        } else {
+                            if (inh > INT_MAX - ctx->inputs[size]->w)
+                                return AVERROR(EINVAL);
                             inh += ctx->inputs[size]->w;
+                        }
                     } else if (sscanf(arg3, "h%d", &size) == 1) {
                         if (size == i || size < 0 || size >= s->nb_inputs)
                             return AVERROR(EINVAL);
 
-                        if (!j)
+                        if (!j) {
+                            if (inw > INT_MAX - ctx->inputs[size]->h)
+                                return AVERROR(EINVAL);
                             inw += ctx->inputs[size]->h;
-                        else
+                        } else {
+                            if (inh > INT_MAX - ctx->inputs[size]->h)
+                                return AVERROR(EINVAL);
                             inh += ctx->inputs[size]->h;
+                        }
                     } else if (sscanf(arg3, "%d", &size) == 1) {
                         if (size < 0)
                             return AVERROR(EINVAL);
 
-                        if (!j)
+                        if (!j) {
+                            if (inw > INT_MAX - size)
+                                return AVERROR(EINVAL);
                             inw += size;
-                        else
+                        } else {
+                            if (inh > INT_MAX - size)
+                                return AVERROR(EINVAL);
                             inh += size;
+                        }
                     } else {
                         return AVERROR(EINVAL);
                     }
@@ -384,6 +408,8 @@ static int config_output(AVFilterLink *outlink)
             item->y[1] = item->y[2] = AV_CEIL_RSHIFT(inh, 
s->desc->log2_chroma_h);
             item->y[0] = item->y[3] = inh;
 
+            if (inlink->w > INT_MAX - inw || inlink->h > INT_MAX - inh)
+                return AVERROR(EINVAL);
             width  = FFMAX(width,  inlink->w + inw);
             height = FFMAX(height, inlink->h + inh);
         }

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to