[FFmpeg-devel] [PATCH 1/4] avutil/opt: check min/max/default at ASSERT_LEVEL >= 2

Michael Niedermayer michaelni at gmx.at
Sat Apr 13 20:37:12 CEST 2013


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavutil/opt.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/libavutil/opt.c b/libavutil/opt.c
index 0e7a3a8..b4d1d67 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -25,6 +25,7 @@
  * @author Michael Niedermayer <michaelni at gmx.at>
  */
 
+#include "avassert.h"
 #include "avutil.h"
 #include "avstring.h"
 #include "common.h"
@@ -63,6 +64,24 @@ const AVOption *av_next_option(void *obj, const AVOption *last)
 const AVOption *av_opt_next(void *obj, const AVOption *last)
 {
     AVClass *class = *(AVClass**)obj;
+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
+    AVOption *o = last && last[1].name ? last + 1 : class->option;
+    if(o) {
+        int faulty = 0;
+        if (o->type == AV_OPT_TYPE_DOUBLE || o->type == AV_OPT_TYPE_FLOAT) {
+            faulty |= (o->min > o->default_val.dbl || o->default_val.dbl > o->max);
+        } else if (o->type == AV_OPT_TYPE_INT || o->type == AV_OPT_TYPE_INT64) {
+            faulty |= (o->min > o->default_val.i64 || o->default_val.i64 > o->max);
+        } else if (o->type == AV_OPT_TYPE_RATIONAL) {
+            faulty |= (o->min > av_q2d(o->default_val.q) || av_q2d(o->default_val.q) > o->max);
+        }
+        faulty |= o->min > o->max;
+        if (faulty) {
+            av_log(obj, AV_LOG_FATAL, "Invalid min/default/max combination in %s\n", o->name);
+            av_assert2(0);
+        }
+    }
+#endif
     if (!last && class->option && class->option[0].name)
         return class->option;
     if (last && last[1].name)
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list