Add some security checks against future bad float UIprecision values.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 18 Sep 2017 17:50:40 +0000 (19:50 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 18 Sep 2017 18:04:27 +0000 (20:04 +0200)
This commit and previous one should be backported to 2.79a should we
release it.

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/makesrna/intern/rna_define.c

index 9376de8c095b86820876a333431e21b7d7177768..e14a3a3ff0a42ef73d0fb0e5b4d55e6ea4cd09de 100644 (file)
@@ -996,7 +996,7 @@ void uiItemsFullEnumO(
         struct IDProperty *properties, int context, int flag);
 void uiItemsFullEnumO_items(
         uiLayout *layout, struct wmOperatorType *ot, PointerRNA ptr, PropertyRNA *prop,
-        IDProperty *properties, int context, int flag,
+        struct IDProperty *properties, int context, int flag,
         const EnumPropertyItem *item_array, int totitem);
 
 void uiItemL(uiLayout *layout, const char *name, int icon); /* label */
index fd5159bb76c8cdcc96514edb9003ceb20fa0d5c4..5c05fc8c530b53a2364f07dba691a3c21673fbea 100644 (file)
@@ -488,6 +488,9 @@ static int ui_but_calc_float_precision(uiBut *but, double value)
        else if (prec == -1) {
                prec = (but->hardmax < 10.001f) ? 3 : 2;
        }
+       else {
+               CLAMP(prec, 0, UI_PRECISION_FLOAT_MAX);
+       }
 
        return UI_calc_float_precision(prec, value);
 }
index 0e91c1586693c2c7348dd6ec8e3915615c094c24..118dd0b15dee85e558c942094886b2860106eb31 100644 (file)
@@ -44,6 +44,8 @@
 
 #include "BLT_translation.h"
 
+#include "UI_interface.h"  /* For things like UI_PRECISION_FLOAT_MAX... */
+
 #include "RNA_define.h"
 
 #include "rna_internal.h"
@@ -1405,13 +1407,13 @@ void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, bool consecutive)
  * For ints, whole values are used.
  *
  * \param precision The number of zeros to show
- * (as a whole number - common range is 1 - 6), see PRECISION_FLOAT_MAX
+ * (as a whole number - common range is 1 - 6), see UI_PRECISION_FLOAT_MAX
  */
 void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
 {
        StructRNA *srna = DefRNA.laststruct;
 
-#ifdef DEBUG
+#ifndef NDEBUG
        if (min > max) {
                fprintf(stderr, "%s: \"%s.%s\", min > max.\n",
                        __func__, srna->identifier, prop->identifier);
@@ -1424,8 +1426,8 @@ void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double
                DefRNA.error = 1;
        }
 
-       if (precision < -1 || precision > 10) {
-               fprintf(stderr, "%s: \"%s.%s\", step outside range.\n",
+       if (precision < -1 || precision > UI_PRECISION_FLOAT_MAX) {
+               fprintf(stderr, "%s: \"%s.%s\", precision outside range.\n",
                        __func__, srna->identifier, prop->identifier);
                DefRNA.error = 1;
        }
@@ -1447,21 +1449,6 @@ void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double
                        fprop->softmax = (float)max;
                        fprop->step = (float)step;
                        fprop->precision = (int)precision;
-#if 0 /* handy but annoying */
-                       if (DefRNA.preprocess) {
-                               /* check we're not over PRECISION_FLOAT_MAX */
-                               if (fprop->precision > 6) {
-                                       fprintf(stderr, "%s: \"%s.%s\", precision value over maximum.\n",
-                                               __func__, srna->identifier, prop->identifier);
-                                       DefRNA.error = 1;
-                               }
-                               else if (fprop->precision < 1) {
-                                       fprintf(stderr, "%s: \"%s.%s\", precision value under minimum.\n",
-                                               __func__, srna->identifier, prop->identifier);
-                                       DefRNA.error = 1;
-                               }
-                       }
-#endif
                        break;
                }
                default: