diff mbox series

[FFmpeg-devel,v2] avformat/utils: added av_get_frame_filename3() (changed parameter int -> int64_t)

Message ID 20240919162517.48-1-shoutplenty@gmail.com
State New
Headers show
Series [FFmpeg-devel,v2] avformat/utils: added av_get_frame_filename3() (changed parameter int -> int64_t) | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Filip Mašić Sept. 19, 2024, 4:23 p.m. UTC
Resolves an integer overflow with the frame_pts option (issue 11194).

Signed-off-by: Filip Mašić <shoutplenty@gmail.com>
---
 doc/APIchanges         |  3 +++
 libavformat/avformat.h |  5 ++++-
 libavformat/img2enc.c  |  6 ++----
 libavformat/utils.c    | 12 +++++++++---
 4 files changed, 18 insertions(+), 8 deletions(-)

Comments

Filip Mašić Sept. 21, 2024, 11:18 p.m. UTC | #1
Any mergers in the chat? If I'm understanding correctly, all you need to do
for this one is compile it and run the sample command in issue #11194 (or
better yet, the one in https://superuser.com/a/1854641 that
cross-references it against vf=drawtext), and maybe also omit the frame_pts
option to check that's fine as well.

Please lmk what's next. If you need me to test it, I think all I'm stuck on
is the configure flags for including image2 in the build but who knows,
there could be more impediments.

Previous review:
https://ffmpeg.org//pipermail/ffmpeg-devel/2024-September/333651.html

I seem to have been lucky to avoid needing to rebase my changelogs 3 times
so that's also ready to go :D. Thanks for your service.

On Thu, 19 Sept 2024 at 17:25, Filip Mašić <shoutplenty@gmail.com> wrote:

> Resolves an integer overflow with the frame_pts option (issue 11194).
>
> Signed-off-by: Filip Mašić <shoutplenty@gmail.com>
> ---
>  doc/APIchanges         |  3 +++
>  libavformat/avformat.h |  5 ++++-
>  libavformat/img2enc.c  |  6 ++----
>  libavformat/utils.c    | 12 +++++++++---
>  4 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 81537fea09..d821f5d496 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -2,6 +2,9 @@ The last version increases of all libraries were on
> 2024-03-07
>
>  API changes, most recent first:
>
> +2024-09-xx - xxxxxxxxxx - lavf 61.6.100 - avformat.h
> +  Add av_get_frame_filename3()
> +
>  2024-09-18 - xxxxxxxxxx - lavc 61.17.100 - packet.h
>    Add AV_PKT_DATA_LCEVC.
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 56c1c80289..a2ef209e35 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -2933,10 +2933,13 @@ void av_dump_format(AVFormatContext *ic,
>   * @param buf destination buffer
>   * @param buf_size destination buffer size
>   * @param path numbered sequence string
> - * @param number frame number
> + * @param number frame number (or pts if frame_pts option passed)
>   * @param flags AV_FRAME_FILENAME_FLAGS_*
>   * @return 0 if OK, -1 on format error
>   */
> +int av_get_frame_filename3(char *buf, int buf_size,
> +                          const char *path, int64_t number, int flags);
> +
>  int av_get_frame_filename2(char *buf, int buf_size,
>                            const char *path, int number, int flags);
>
> diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
> index 526a11e5ee..460e6a38bd 100644
> --- a/libavformat/img2enc.c
> +++ b/libavformat/img2enc.c
> @@ -160,13 +160,11 @@ static int write_packet(AVFormatContext *s, AVPacket
> *pkt)
>              return AVERROR(EINVAL);
>          }
>      } else if (img->frame_pts) {
> -        if (av_get_frame_filename2(filename, sizeof(filename), s->url,
> pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
> +        if (av_get_frame_filename3(filename, sizeof(filename), s->url,
> pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
>              av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the
> frames.");
>              return AVERROR(EINVAL);
>          }
> -    } else if (av_get_frame_filename2(filename, sizeof(filename), s->url,
> -                                      img->img_number,
> -                                      AV_FRAME_FILENAME_FLAGS_MULTIPLE) <
> 0) {
> +    } else if (av_get_frame_filename3(filename, sizeof(filename), s->url,
> img->img_number, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
>          if (img->img_number == img->start_img_number) {
>              av_log(s, AV_LOG_WARNING, "The specified filename '%s' does
> not contain an image sequence pattern or a pattern is invalid.\n", s->url);
>              av_log(s, AV_LOG_WARNING,
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index e9ded627ad..0a7ed1a013 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -19,6 +19,7 @@
>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
>   */
>
> +#include <inttypes.h>
>  #include <stdint.h>
>
>  #include "config.h"
> @@ -280,7 +281,7 @@ uint64_t ff_parse_ntp_time(uint64_t ntp_ts)
>      return (sec * 1000000) + usec;
>  }
>
> -int av_get_frame_filename2(char *buf, int buf_size, const char *path, int
> number, int flags)
> +int av_get_frame_filename3(char *buf, int buf_size, const char *path,
> int64_t number, int flags)
>  {
>      const char *p;
>      char *q, buf1[20], c;
> @@ -313,7 +314,7 @@ int av_get_frame_filename2(char *buf, int buf_size,
> const char *path, int number
>                  percentd_found = 1;
>                  if (number < 0)
>                      nd += 1;
> -                snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
> +                snprintf(buf1, sizeof(buf1), "%0*"PRId64, nd, number);
>                  len = strlen(buf1);
>                  if ((q - buf + len) > buf_size - 1)
>                      goto fail;
> @@ -338,9 +339,14 @@ fail:
>      return -1;
>  }
>
> +int av_get_frame_filename2(char *buf, int buf_size, const char *path, int
> number, int flags)
> +{
> +    return av_get_frame_filename3(buf, buf_size, path, number, flags);
> +}
> +
>  int av_get_frame_filename(char *buf, int buf_size, const char *path, int
> number)
>  {
> -    return av_get_frame_filename2(buf, buf_size, path, number, 0);
> +    return av_get_frame_filename3(buf, buf_size, path, number, 0);
>  }
>
>  void av_url_split(char *proto, int proto_size,
> --
> 2.46.0.windows.1
>
>
Anton Khirnov Sept. 23, 2024, 4:44 a.m. UTC | #2
Quoting Filip Mašić (2024-09-19 18:23:27)
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 56c1c80289..a2ef209e35 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -2933,10 +2933,13 @@ void av_dump_format(AVFormatContext *ic,
>   * @param buf destination buffer
>   * @param buf_size destination buffer size
>   * @param path numbered sequence string
> - * @param number frame number
> + * @param number frame number (or pts if frame_pts option passed)

The frame_pts option is specific to img2enc, which is not the only
caller of this function.

>   * @param flags AV_FRAME_FILENAME_FLAGS_*
>   * @return 0 if OK, -1 on format error
>   */
> +int av_get_frame_filename3(char *buf, int buf_size,
> +                          const char *path, int64_t number, int flags);
> +
>  int av_get_frame_filename2(char *buf, int buf_size,
>                            const char *path, int number, int flags);

av_get_frame_filename2() is now undocumented. It should probably be
deprecated.
diff mbox series

Patch

diff --git a/doc/APIchanges b/doc/APIchanges
index 81537fea09..d821f5d496 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@  The last version increases of all libraries were on 2024-03-07
 
 API changes, most recent first:
 
+2024-09-xx - xxxxxxxxxx - lavf 61.6.100 - avformat.h
+  Add av_get_frame_filename3()
+
 2024-09-18 - xxxxxxxxxx - lavc 61.17.100 - packet.h
   Add AV_PKT_DATA_LCEVC.
 
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 56c1c80289..a2ef209e35 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -2933,10 +2933,13 @@  void av_dump_format(AVFormatContext *ic,
  * @param buf destination buffer
  * @param buf_size destination buffer size
  * @param path numbered sequence string
- * @param number frame number
+ * @param number frame number (or pts if frame_pts option passed)
  * @param flags AV_FRAME_FILENAME_FLAGS_*
  * @return 0 if OK, -1 on format error
  */
+int av_get_frame_filename3(char *buf, int buf_size,
+                          const char *path, int64_t number, int flags);
+
 int av_get_frame_filename2(char *buf, int buf_size,
                           const char *path, int number, int flags);
 
diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
index 526a11e5ee..460e6a38bd 100644
--- a/libavformat/img2enc.c
+++ b/libavformat/img2enc.c
@@ -160,13 +160,11 @@  static int write_packet(AVFormatContext *s, AVPacket *pkt)
             return AVERROR(EINVAL);
         }
     } else if (img->frame_pts) {
-        if (av_get_frame_filename2(filename, sizeof(filename), s->url, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
+        if (av_get_frame_filename3(filename, sizeof(filename), s->url, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
             av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the frames.");
             return AVERROR(EINVAL);
         }
-    } else if (av_get_frame_filename2(filename, sizeof(filename), s->url,
-                                      img->img_number,
-                                      AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
+    } else if (av_get_frame_filename3(filename, sizeof(filename), s->url, img->img_number, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
         if (img->img_number == img->start_img_number) {
             av_log(s, AV_LOG_WARNING, "The specified filename '%s' does not contain an image sequence pattern or a pattern is invalid.\n", s->url);
             av_log(s, AV_LOG_WARNING,
diff --git a/libavformat/utils.c b/libavformat/utils.c
index e9ded627ad..0a7ed1a013 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <inttypes.h>
 #include <stdint.h>
 
 #include "config.h"
@@ -280,7 +281,7 @@  uint64_t ff_parse_ntp_time(uint64_t ntp_ts)
     return (sec * 1000000) + usec;
 }
 
-int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
+int av_get_frame_filename3(char *buf, int buf_size, const char *path, int64_t number, int flags)
 {
     const char *p;
     char *q, buf1[20], c;
@@ -313,7 +314,7 @@  int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number
                 percentd_found = 1;
                 if (number < 0)
                     nd += 1;
-                snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
+                snprintf(buf1, sizeof(buf1), "%0*"PRId64, nd, number);
                 len = strlen(buf1);
                 if ((q - buf + len) > buf_size - 1)
                     goto fail;
@@ -338,9 +339,14 @@  fail:
     return -1;
 }
 
+int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags)
+{
+    return av_get_frame_filename3(buf, buf_size, path, number, flags);
+}
+
 int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
 {
-    return av_get_frame_filename2(buf, buf_size, path, number, 0);
+    return av_get_frame_filename3(buf, buf_size, path, number, 0);
 }
 
 void av_url_split(char *proto, int proto_size,