[FFmpeg-devel] [PATCH 2/2] fftools/ffmpeg_opt: Improve alloc/truncation checks when reading lines
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Sun Dec 5 18:08:12 EET 2021
Do this by switching from the dynamic buffer API to the AVBPrint API;
the former has no defined way to check for errors.
This also avoids allocating an AVIOContext.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
fftools/ffmpeg_opt.c | 28 ++++++++++++----------------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 78b5574a3d..66e5afdf80 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -1356,23 +1356,18 @@ static int open_input_file(OptionsContext *o, const char *filename)
return 0;
}
-static uint8_t *get_line(AVIOContext *s)
+static char *get_line(AVIOContext *s, AVBPrint *bprint)
{
- AVIOContext *line;
- uint8_t *buf;
char c;
- if (avio_open_dyn_buf(&line) < 0) {
+ while ((c = avio_r8(s)) && c != '\n')
+ av_bprint_chars(bprint, c, 1);
+
+ if (!av_bprint_is_complete(bprint)) {
av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
exit_program(1);
}
-
- while ((c = avio_r8(s)) && c != '\n')
- avio_w8(line, c);
- avio_w8(line, 0);
- avio_close_dyn_buf(line, &buf);
-
- return buf;
+ return bprint->str;
}
static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
@@ -1503,20 +1498,21 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->autoscale = 1;
MATCH_PER_STREAM_OPT(autoscale, i, ost->autoscale, oc, st);
if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
+ AVBPrint bprint;
+ av_bprint_init(&bprint, 0, AV_BPRINT_SIZE_UNLIMITED);
do {
- buf = get_line(s);
- if (!buf[0] || buf[0] == '#') {
- av_free(buf);
+ av_bprint_clear(&bprint);
+ buf = get_line(s, &bprint);
+ if (!buf[0] || buf[0] == '#')
continue;
- }
if (!(arg = strchr(buf, '='))) {
av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
exit_program(1);
}
*arg++ = 0;
av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
- av_free(buf);
} while (!s->eof_reached);
+ av_bprint_finalize(&bprint, NULL);
avio_closep(&s);
}
if (ret) {
--
2.32.0
More information about the ffmpeg-devel
mailing list