* [FFmpeg-devel] [PATCH v2 0/3] resend fixes for leaks
@ 2025-07-10 2:20 Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header() Lidong Yan
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Lidong Yan @ 2025-07-10 2:20 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lidong Yan
I am resending patches:
https://ffmpeg.org/pipermail/ffmpeg-devel/2025-June/345974.html
https://ffmpeg.org/pipermail/ffmpeg-devel/2025-June/345897.html
Since these patches haven't been noticed for a long time.
I also revised my patch in avformat/sapenc according to Michael's request.
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaEpkmRYJKwYBBAHaRw8BAQdAGwGqH/Dwod+i6kR0/Rhn5GanJ7wK8mM9tWP/
W2qu8Ti0HTUwMjAyNDMzMDA1NkBzbWFpbC5uanUuZWR1LmNuiJkEExYKAEEWIQQC
zskBcOehk1y8GoKZR31bPD+6owUCaEpkmQIbAwUJBaOagAULCQgHAgIiAgYVCgkI
CwIEFgIDAQIeBwIXgAAKCRCZR31bPD+6o8wHAQCLomsA4XfTd8IdG983gGULUJe/
0432buy4nX7AsAc87QEA+/QIsWTR6XLJaLa1sLSQCsZkb86U3c17JzG9oivL8gW4
OARoSmSZEgorBgEEAZdVAQUBAQdAfYrEAWd+6bOXkKvHpFmMvKzxAtlhm6ZQKdAq
+MlJ7wQDAQgHiHgEGBYKACAWIQQCzskBcOehk1y8GoKZR31bPD+6owUCaEpkmQIb
DAAKCRCZR31bPD+6ozWxAQC9OFisWrP/hHXUfj8AnC39r5pf5fEBz7lHvFgWNk2b
XwD7Bl6kvIIW7ReqtgXvcl7u78vEo+e9YeTGTlmAogjpeQk=
=rP+W
-----END PGP PUBLIC KEY BLOCK-----
Lidong Yan (3):
avformat/sapenc: fix leak in sap_write_header()
avformat/iamf_writer: fix leaks of avio_open_dyn_buf() allocated
memory
swscale/graph: fix leak in adapt_colors()
libavformat/iamf_writer.c | 47 +++++++++++++++++++++++++--------------
libavformat/sapenc.c | 13 +++++++----
libswscale/graph.c | 4 +++-
3 files changed, 42 insertions(+), 22 deletions(-)
--
2.50.0.107.g33b6ec8c79
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header()
2025-07-10 2:20 [FFmpeg-devel] [PATCH v2 0/3] resend fixes for leaks Lidong Yan
@ 2025-07-10 2:20 ` Lidong Yan
2025-07-12 18:33 ` Michael Niedermayer
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 2/3] avformat/iamf_writer: fix leaks of avio_open_dyn_buf() allocated memory Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 3/3] swscale/graph: fix leak in adapt_colors() Lidong Yan
2 siblings, 1 reply; 6+ messages in thread
From: Lidong Yan @ 2025-07-10 2:20 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lidong Yan
In sap_write_header(), ff_format_set_url() assign new allocated new_url
to contexts[i]->url but forgot to free it later. Add for loop to free
contexts[i]->url before av_free(context).
To prevent from writing free-for-loop in every return point, replace
`return 0` with `ret = 0` so normal execution can fall through fail
code.
Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
---
libavformat/sapenc.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c
index 87a834a8d8..0567a754e2 100644
--- a/libavformat/sapenc.c
+++ b/libavformat/sapenc.c
@@ -233,7 +233,6 @@ static int sap_write_header(AVFormatContext *s)
ret = AVERROR_INVALIDDATA;
goto fail;
}
- av_freep(&contexts);
av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", &sap->ann[pos]);
pos += strlen(&sap->ann[pos]);
sap->ann_size = pos;
@@ -244,11 +243,17 @@ static int sap_write_header(AVFormatContext *s)
goto fail;
}
- return 0;
+ ret = 0;
fail:
- av_free(contexts);
- sap_write_close(s);
+ if (contexts) {
+ for (i = 0; i < s->nb_streams; i++)
+ if (contexts[i])
+ av_free(contexts[i]->url);
+ av_free(contexts);
+ }
+ if (ret < 0)
+ sap_write_close(s);
return ret;
}
--
2.50.0.107.g33b6ec8c79
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH v2 2/3] avformat/iamf_writer: fix leaks of avio_open_dyn_buf() allocated memory
2025-07-10 2:20 [FFmpeg-devel] [PATCH v2 0/3] resend fixes for leaks Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header() Lidong Yan
@ 2025-07-10 2:20 ` Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 3/3] swscale/graph: fix leak in adapt_colors() Lidong Yan
2 siblings, 0 replies; 6+ messages in thread
From: Lidong Yan @ 2025-07-10 2:20 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lidong Yan
In iamf_write_codec_config(), if codec_id equals to AV_CODEC_ID_AAC,
avio_open_dyn_buf() allocated memory would leak. Add ffio_free_dyn_buf()
to free dyn_bc before return.
In iamf_write_audio_element(), multiple places returns without free
dyn_bc, replace return AVERROR* with goto cleanup and add cleanup code
to free dyn_bc. Do the same thing for iamf_write_audio_element() and
write_parameter_block().
Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
---
libavformat/iamf_writer.c | 47 +++++++++++++++++++++++++--------------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c
index f88987790d..2e8df602b1 100644
--- a/libavformat/iamf_writer.c
+++ b/libavformat/iamf_writer.c
@@ -523,6 +523,7 @@ static int iamf_write_codec_config(const IAMFContext *iamf,
avio_write(dyn_bc, codec_config->extradata, codec_config->extradata_size);
break;
case AV_CODEC_ID_AAC:
+ ffio_free_dyn_buf(&dyn_bc);
return AVERROR_PATCHWELCOME;
case AV_CODEC_ID_FLAC:
avio_w8(dyn_bc, 0x80);
@@ -774,7 +775,8 @@ static int iamf_write_audio_element(const IAMFContext *iamf,
if (layout == 3 || layout == 4 || layout == 6 || layout == 7) {
av_log(log_ctx, AV_LOG_ERROR, "demixing_info needed but not set in Stream Group #%u\n",
audio_element->audio_element_id);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto cleanup;
}
}
param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_DEMIXING;
@@ -794,7 +796,7 @@ static int iamf_write_audio_element(const IAMFContext *iamf,
param_def = ff_iamf_get_param_definition(iamf, param->parameter_id);
ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
if (ret < 0)
- return ret;
+ goto cleanup;
avio_w8(dyn_bc, demix->dmixp_mode << 5); // dmixp_mode
avio_w8(dyn_bc, element->default_w << 4); // default_w
@@ -806,24 +808,25 @@ static int iamf_write_audio_element(const IAMFContext *iamf,
if (!param) {
av_log(log_ctx, AV_LOG_ERROR, "recon_gain_info needed but not set in Stream Group #%u\n",
audio_element->audio_element_id);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto cleanup;
}
ffio_write_leb(dyn_bc, AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN); // type
param_def = ff_iamf_get_param_definition(iamf, param->parameter_id);
ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
if (ret < 0)
- return ret;
+ goto cleanup;
}
if (element->audio_element_type == AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL) {
ret = scalable_channel_layout_config(audio_element, dyn_bc);
if (ret < 0)
- return ret;
+ goto cleanup;
} else {
ret = ambisonics_config(audio_element, dyn_bc);
if (ret < 0)
- return ret;
+ goto cleanup;
}
init_put_bits(&pbc, header, sizeof(header));
@@ -835,9 +838,11 @@ static int iamf_write_audio_element(const IAMFContext *iamf,
avio_write(pb, header, put_bytes_count(&pbc, 1));
ffio_write_leb(pb, dyn_size);
avio_write(pb, dyn_buf, dyn_size);
- ffio_free_dyn_buf(&dyn_bc);
+ ret = 0;
- return 0;
+cleanup:
+ ffio_free_dyn_buf(&dyn_bc);
+ return ret;
}
static int iamf_write_mixing_presentation(const IAMFContext *iamf,
@@ -886,7 +891,8 @@ static int iamf_write_mixing_presentation(const IAMFContext *iamf,
if (av_dict_count(submix_element->annotations) != av_dict_count(mix->annotations)) {
av_log(log_ctx, AV_LOG_ERROR, "Inconsistent amount of labels in submix %d from Mix Presentation id #%u\n",
j, audio_element->audio_element_id);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto cleanup;
}
while ((tag = av_dict_iterate(submix_element->annotations, tag)))
avio_put_str(dyn_bc, tag->value);
@@ -901,7 +907,7 @@ static int iamf_write_mixing_presentation(const IAMFContext *iamf,
param_def = ff_iamf_get_param_definition(iamf, submix_element->element_mix_config->parameter_id);
ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
if (ret < 0)
- return ret;
+ goto cleanup;
avio_wb16(dyn_bc, rescale_rational(submix_element->default_mix_gain, 1 << 8));
}
@@ -909,7 +915,7 @@ static int iamf_write_mixing_presentation(const IAMFContext *iamf,
param_def = ff_iamf_get_param_definition(iamf, sub_mix->output_mix_config->parameter_id);
ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
if (ret < 0)
- return ret;
+ goto cleanup;
avio_wb16(dyn_bc, rescale_rational(sub_mix->default_mix_gain, 1 << 8));
ffio_write_leb(dyn_bc, sub_mix->nb_layouts); // nb_layouts
@@ -928,11 +934,13 @@ static int iamf_write_mixing_presentation(const IAMFContext *iamf,
}
if (layout == FF_ARRAY_ELEMS(ff_iamf_sound_system_map)) {
av_log(log_ctx, AV_LOG_ERROR, "Invalid Sound System value in a submix\n");
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto cleanup;
}
} else if (submix_layout->layout_type != AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL) {
av_log(log_ctx, AV_LOG_ERROR, "Unsupported Layout Type value in a submix\n");
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto cleanup;
}
init_put_bits(&pbc, header, sizeof(header));
put_bits(&pbc, 2, submix_layout->layout_type); // layout_type
@@ -974,9 +982,11 @@ static int iamf_write_mixing_presentation(const IAMFContext *iamf,
avio_write(pb, header, put_bytes_count(&pbc, 1));
ffio_write_leb(pb, dyn_size);
avio_write(pb, dyn_buf, dyn_size);
- ffio_free_dyn_buf(&dyn_bc);
+ ret = 0;
- return 0;
+cleanup:
+ ffio_free_dyn_buf(&dyn_bc);
+ return ret;
}
int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
@@ -1098,7 +1108,8 @@ static int write_parameter_block(const IAMFContext *iamf, AVIOContext *pb,
if (!audio_element) {
av_log(log_ctx, AV_LOG_ERROR, "Invalid Parameter Definition with ID %u referenced by a packet\n", param->parameter_id);
- return AVERROR(EINVAL);
+ ret = AVERROR(EINVAL);
+ goto cleanup;
}
for (int j = 0; j < audio_element->nb_layers; j++) {
@@ -1132,8 +1143,10 @@ static int write_parameter_block(const IAMFContext *iamf, AVIOContext *pb,
dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
ffio_write_leb(pb, dyn_size);
avio_write(pb, dyn_buf, dyn_size);
- ffio_free_dyn_buf(&dyn_bc);
+ ret = 0;
+cleanup:
+ ffio_free_dyn_buf(&dyn_bc);
return 0;
}
--
2.50.0.107.g33b6ec8c79
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* [FFmpeg-devel] [PATCH v2 3/3] swscale/graph: fix leak in adapt_colors()
2025-07-10 2:20 [FFmpeg-devel] [PATCH v2 0/3] resend fixes for leaks Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header() Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 2/3] avformat/iamf_writer: fix leaks of avio_open_dyn_buf() allocated memory Lidong Yan
@ 2025-07-10 2:20 ` Lidong Yan
2 siblings, 0 replies; 6+ messages in thread
From: Lidong Yan @ 2025-07-10 2:20 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Lidong Yan
In adapt_colors(), ff_sws_lut3d_generate() allocates memory in lut.
However if add_legacy_sws_pass() failed, lut leaks. free lut before
return ret.
Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
---
libswscale/graph.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/libswscale/graph.c b/libswscale/graph.c
index dc7784aa49..975a2b6065 100644
--- a/libswscale/graph.c
+++ b/libswscale/graph.c
@@ -523,8 +523,10 @@ static int adapt_colors(SwsGraph *graph, SwsFormat src, SwsFormat dst,
SwsFormat tmp = src;
tmp.format = fmt_in;
ret = add_legacy_sws_pass(graph, src, tmp, input, &input);
- if (ret < 0)
+ if (ret < 0) {
+ ff_sws_lut3d_free(&lut);
return ret;
+ }
}
ret = ff_sws_lut3d_generate(lut, fmt_in, fmt_out, &map);
--
2.50.0.107.g33b6ec8c79
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header()
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header() Lidong Yan
@ 2025-07-12 18:33 ` Michael Niedermayer
2025-07-13 1:27 ` Lidong Yan
0 siblings, 1 reply; 6+ messages in thread
From: Michael Niedermayer @ 2025-07-12 18:33 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 1929 bytes --]
On Thu, Jul 10, 2025 at 10:20:45AM +0800, Lidong Yan wrote:
> In sap_write_header(), ff_format_set_url() assign new allocated new_url
> to contexts[i]->url but forgot to free it later. Add for loop to free
> contexts[i]->url before av_free(context).
>
> To prevent from writing free-for-loop in every return point, replace
> `return 0` with `ret = 0` so normal execution can fall through fail
> code.
>
> Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
> ---
> libavformat/sapenc.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c
> index 87a834a8d8..0567a754e2 100644
> --- a/libavformat/sapenc.c
> +++ b/libavformat/sapenc.c
> @@ -233,7 +233,6 @@ static int sap_write_header(AVFormatContext *s)
> ret = AVERROR_INVALIDDATA;
> goto fail;
> }
> - av_freep(&contexts);
> av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", &sap->ann[pos]);
> pos += strlen(&sap->ann[pos]);
> sap->ann_size = pos;
> @@ -244,11 +243,17 @@ static int sap_write_header(AVFormatContext *s)
> goto fail;
> }
>
> - return 0;
> + ret = 0;
>
> fail:
> - av_free(contexts);
> - sap_write_close(s);
> + if (contexts) {
> + for (i = 0; i < s->nb_streams; i++)
> + if (contexts[i])
> + av_free(contexts[i]->url);
> + av_free(contexts);
> + }
contexts is an array of AVFormatContext, this does not look right
also freeing the url of the AVFormatContexts that have been stored
in priv_data a few lines earlier looks wrong
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Many that live deserve death. And some that die deserve life. Can you give
it to them? Then do not be too eager to deal out death in judgement. For
even the very wise cannot see all ends. -- Gandalf
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header()
2025-07-12 18:33 ` Michael Niedermayer
@ 2025-07-13 1:27 ` Lidong Yan
0 siblings, 0 replies; 6+ messages in thread
From: Lidong Yan @ 2025-07-13 1:27 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Michael Niedermayer <michael@niedermayer.cc> write:
> On Thu, Jul 10, 2025 at 10:20:45AM +0800, Lidong Yan wrote:
> > In sap_write_header(), ff_format_set_url() assign new allocated new_url
> > to contexts[i]->url but forgot to free it later. Add for loop to free
> > contexts[i]->url before av_free(context).
> >
> > To prevent from writing free-for-loop in every return point, replace
> > `return 0` with `ret = 0` so normal execution can fall through fail
> > code.
> >
> > Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
> > ---
> > libavformat/sapenc.c | 13 +++++++++----
> > 1 file changed, 9 insertions(+), 4 deletions(-)
> >
> > diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c
> > index 87a834a8d8..0567a754e2 100644
> > --- a/libavformat/sapenc.c
> > +++ b/libavformat/sapenc.c
> > @@ -233,7 +233,6 @@ static int sap_write_header(AVFormatContext *s)
> > ret = AVERROR_INVALIDDATA;
> > goto fail;
> > }
> > - av_freep(&contexts);
> > av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", &sap->ann[pos]);
> > pos += strlen(&sap->ann[pos]);
> > sap->ann_size = pos;
> > @@ -244,11 +243,17 @@ static int sap_write_header(AVFormatContext *s)
> > goto fail;
> > }
> >
> > - return 0;
> > + ret = 0;
> >
> > fail:
> > - av_free(contexts);
> > - sap_write_close(s);
> > + if (contexts) {
> > + for (i = 0; i < s->nb_streams; i++)
> > + if (contexts[i])
> > + av_free(contexts[i]->url);
> > + av_free(contexts);
> > + }
>
> contexts is an array of AVFormatContext, this does not look right
> also freeing the url of the AVFormatContexts that have been stored
> in priv_data a few lines earlier looks wrong
>
I am not sure how to fix then. Maybe I should leave this code alone.
Thanks,
Lidong
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-07-13 1:27 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-07-10 2:20 [FFmpeg-devel] [PATCH v2 0/3] resend fixes for leaks Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 1/3] avformat/sapenc: fix leak in sap_write_header() Lidong Yan
2025-07-12 18:33 ` Michael Niedermayer
2025-07-13 1:27 ` Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 2/3] avformat/iamf_writer: fix leaks of avio_open_dyn_buf() allocated memory Lidong Yan
2025-07-10 2:20 ` [FFmpeg-devel] [PATCH v2 3/3] swscale/graph: fix leak in adapt_colors() Lidong Yan
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git