This allows globally limiting the allowed entities for security purposes by the application
Signed-off-by: Michael Niedermayer <michae...@gmx.at> --- libavcodec/allcodecs.c | 49 ++++++++++++++++++++++++++++++++++-------------- libavcodec/avcodec.h | 20 ++++++++++++++++++++ 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 7650543..9fea0b9 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -27,51 +27,65 @@ #include "config.h" #include "avcodec.h" #include "version.h" +#include "libavutil/avstring.h" #define REGISTER_HWACCEL(X, x) \ - { \ + if (!list || av_match_list(AV_STRINGIFY(x##_hwaccel), list, ',')) { \ extern AVHWAccel ff_##x##_hwaccel; \ - if (CONFIG_##X##_HWACCEL) \ + if (CONFIG_##X##_HWACCEL) { \ av_register_hwaccel(&ff_##x##_hwaccel); \ + found++; \ + } \ } #define REGISTER_ENCODER(X, x) \ - { \ + if (!list || av_match_list(AV_STRINGIFY(x##_encoder), list, ',')) { \ extern AVCodec ff_##x##_encoder; \ - if (CONFIG_##X##_ENCODER) \ + if (CONFIG_##X##_ENCODER) { \ avcodec_register(&ff_##x##_encoder); \ + found++; \ + } \ } #define REGISTER_DECODER(X, x) \ - { \ + if (!list || av_match_list(AV_STRINGIFY(x##_decoder), list, ',')) { \ extern AVCodec ff_##x##_decoder; \ - if (CONFIG_##X##_DECODER) \ + if (CONFIG_##X##_DECODER) { \ avcodec_register(&ff_##x##_decoder); \ + found++; \ + } \ } #define REGISTER_ENCDEC(X, x) REGISTER_ENCODER(X, x); REGISTER_DECODER(X, x) #define REGISTER_PARSER(X, x) \ - { \ + if (!list || av_match_list(AV_STRINGIFY(x##_parser), list, ',')) { \ extern AVCodecParser ff_##x##_parser; \ - if (CONFIG_##X##_PARSER) \ + if (CONFIG_##X##_PARSER) { \ av_register_codec_parser(&ff_##x##_parser); \ + found++; \ + } \ } #define REGISTER_BSF(X, x) \ - { \ + if (!list || av_match_list(AV_STRINGIFY(x##_bsf), list, ',')) { \ extern AVBitStreamFilter ff_##x##_bsf; \ - if (CONFIG_##X##_BSF) \ + if (CONFIG_##X##_BSF) { \ av_register_bitstream_filter(&ff_##x##_bsf); \ + found++; \ + } \ } -void avcodec_register_all(void) +int avcodec_register_list(const char *list) { - static int initialized; + static const char *initialized; + const char *nonnull_list = list ? list : "all"; + int found = 0; if (initialized) - return; - initialized = 1; + return strcmp(nonnull_list, initialized) ? -1 : 0; + + initialized = nonnull_list; /* hardware accelerators */ REGISTER_HWACCEL(H263_VAAPI, h263_vaapi); @@ -588,4 +602,11 @@ void avcodec_register_all(void) REGISTER_BSF(NOISE, noise); REGISTER_BSF(REMOVE_EXTRADATA, remove_extradata); REGISTER_BSF(TEXT2MOVSUB, text2movsub); + + return found; +} + +void avcodec_register_all(void) +{ + avcodec_register_list(NULL); } diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 94e82f7..b804460 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -3472,6 +3472,26 @@ void avcodec_register(AVCodec *codec); void avcodec_register_all(void); /** + * Registers only the specified list of ',' seperated entities + * + * @param list ',' seperated list of entities to register, the list used must + * have a sufficient lifetime so future calls to avcodec_register_list() + * can access it for comparission. + * + * @note What is registered with the first call to avcodec_register_list() is + * permanent, future calls to avcodec_register_list() and + * avcodec_register_all() cannot override it until application exit. + * @note This function is intended to be used for restricting the allowed + * decoders and other entities for security purposes in end user + * applications, it is not intended to be called by libraries. + * + * @returns the number of newly registered entities, or 0 if the exact same list + * has been registered previously or negative value if a differnet list + * is already registered. + */ +int avcodec_register_list(const char *list); + +/** * Allocate an AVCodecContext and set its fields to default values. The * resulting struct should be freed with avcodec_free_context(). * -- 1.7.9.5 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel