# HG changeset patch # User Rik # Date 1381508406 25200 # Node ID 94dd9bba06a09ee6f7d06e8980af56466d53a3cb # Parent 484c9a6f4f2705fa2e46ec224987d13ae58c1e88 Fix validation of array properties to set(), avoid segfaults (bug #bug #35687). * libinterp/corefcn/graphics.cc(array_property::validate): Don't accept an empty matrix by default. Instead, check an empty matrix against any size constraints to verify it is allowed. * libinterp/corefcn/graphics.in.h: Update init() routines for all graphic objects to include size constraints on any array_properties. Also matched type constraints, such as "double" or "uint8", to Matlab. diff -r 484c9a6f4f27 -r 94dd9bba06a0 libinterp/corefcn/graphics.cc --- a/libinterp/corefcn/graphics.cc Fri Oct 11 08:17:07 2013 -0700 +++ b/libinterp/corefcn/graphics.cc Fri Oct 11 09:20:06 2013 -0700 @@ -1199,14 +1199,10 @@ { bool xok = false; - // FIXME -- should we always support []? - if (v.is_empty () && v.is_numeric_type ()) - return true; - // check value type if (type_constraints.size () > 0) { - if(type_constraints.find (v.class_name()) != type_constraints.end()) + if (type_constraints.find (v.class_name ()) != type_constraints.end ()) xok = true; // check if complex is allowed (it's also of class "double", so @@ -1220,29 +1216,36 @@ if (xok) { + if (size_constraints.size () == 0) + return true; + dim_vector vdims = v.dims (); int vlen = vdims.length (); xok = false; - // check value size - if (size_constraints.size () > 0) - for (std::list::const_iterator it = size_constraints.begin (); - ! xok && it != size_constraints.end (); ++it) - { - dim_vector itdims = (*it); - - if (itdims.length () == vlen) - { - xok = true; - - for (int i = 0; xok && i < vlen; i++) - if (itdims(i) >= 0 && itdims(i) != vdims(i)) - xok = false; - } - } - else - return true; + // check dimensional size constraints until a match is found + for (std::list::const_iterator it = size_constraints.begin (); + ! xok && it != size_constraints.end (); ++it) + { + dim_vector itdims = (*it); + + if (itdims.length () == vlen) + { + xok = true; + + for (int i = 0; xok && i < vlen; i++) + { + if (itdims(i) > 0) + { + if (itdims(i) != vdims(i)) + xok = false; + } + else if (v.is_empty ()) + break; + } + } + } } return xok; @@ -3940,32 +3943,33 @@ axes::properties::init (void) { position.add_constraint (dim_vector (1, 4)); - position.add_constraint (dim_vector (0, 0)); outerposition.add_constraint (dim_vector (1, 4)); + tightinset.add_constraint (dim_vector (1, 4)); + looseinset.add_constraint (dim_vector (1, 4)); colororder.add_constraint (dim_vector (-1, 3)); dataaspectratio.add_constraint (dim_vector (1, 3)); plotboxaspectratio.add_constraint (dim_vector (1, 3)); + alim.add_constraint (2); + clim.add_constraint (2); xlim.add_constraint (2); ylim.add_constraint (2); zlim.add_constraint (2); - clim.add_constraint (2); - alim.add_constraint (2); xtick.add_constraint (dim_vector (1, -1)); ytick.add_constraint (dim_vector (1, -1)); ztick.add_constraint (dim_vector (1, -1)); + ticklength.add_constraint (dim_vector (1, 2)); Matrix vw (1, 2, 0); vw(1) = 90; view = vw; view.add_constraint (dim_vector (1, 2)); cameraposition.add_constraint (dim_vector (1, 3)); + cameratarget.add_constraint (dim_vector (1, 3)); Matrix upv (1, 3, 0.0); upv(2) = 1.0; cameraupvector = upv; cameraupvector.add_constraint (dim_vector (1, 3)); currentpoint.add_constraint (dim_vector (2, 3)); - ticklength.add_constraint (dim_vector (1, 2)); - tightinset.add_constraint (dim_vector (1, 4)); - looseinset.add_constraint (dim_vector (1, 4)); + // No constraints for hidden transform properties update_font (); x_zlim.resize (1, 2); diff -r 484c9a6f4f27 -r 94dd9bba06a0 libinterp/corefcn/graphics.in.h --- a/libinterp/corefcn/graphics.in.h Fri Oct 11 08:17:07 2013 -0700 +++ b/libinterp/corefcn/graphics.in.h Fri Oct 11 09:20:06 2013 -0700 @@ -1426,6 +1426,7 @@ { add_constraint (dim_vector (-1, 1)); add_constraint (dim_vector (1, -1)); + add_constraint (dim_vector (0, 0)); } row_vector_property (const row_vector_property& p) @@ -1433,6 +1434,7 @@ { add_constraint (dim_vector (-1, 1)); add_constraint (dim_vector (1, -1)); + add_constraint (dim_vector (0, 0)); } void add_constraint (const std::string& type) @@ -3363,13 +3365,14 @@ protected: void init (void) { + alphamap.add_constraint (dim_vector (-1, 1)); colormap.add_constraint (dim_vector (-1, 3)); - alphamap.add_constraint (dim_vector (-1, 1)); + outerposition.add_constraint (dim_vector (1, 4)); paperposition.add_constraint (dim_vector (1, 4)); + papersize.add_constraint (dim_vector (1, 2)); pointershapecdata.add_constraint (dim_vector (16, 16)); pointershapehotspot.add_constraint (dim_vector (1, 2)); position.add_constraint (dim_vector (1, 4)); - outerposition.add_constraint (dim_vector (1, 4)); } private: @@ -4454,6 +4457,9 @@ cdata.add_constraint ("real"); cdata.add_constraint (dim_vector (-1, -1)); cdata.add_constraint (dim_vector (-1, -1, 3)); + alphadata.add_constraint (dim_vector (-1, -1)); + alphadata.add_constraint ("double"); + alphadata.add_constraint ("uint8"); } private: @@ -4622,6 +4628,7 @@ xdata.add_constraint (dim_vector (-1, -1)); ydata.add_constraint (dim_vector (-1, -1)); zdata.add_constraint (dim_vector (-1, -1)); + faces.add_constraint (dim_vector (-1, -1)); vertices.add_constraint (dim_vector (-1, 2)); vertices.add_constraint (dim_vector (-1, 3)); cdata.add_constraint (dim_vector (-1, -1)); @@ -4629,6 +4636,7 @@ facevertexcdata.add_constraint (dim_vector (-1, 1)); facevertexcdata.add_constraint (dim_vector (-1, 3)); facevertexalphadata.add_constraint (dim_vector (-1, 1)); + vertexnormals.add_constraint (dim_vector (-1, -1)); } private: @@ -4747,16 +4755,14 @@ xdata.add_constraint (dim_vector (-1, -1)); ydata.add_constraint (dim_vector (-1, -1)); zdata.add_constraint (dim_vector (-1, -1)); - alphadata.add_constraint ("single"); + cdata.add_constraint ("double"); + cdata.add_constraint ("single"); + cdata.add_constraint (dim_vector (-1, -1)); + cdata.add_constraint (dim_vector (-1, -1, 3)); alphadata.add_constraint ("double"); alphadata.add_constraint ("uint8"); alphadata.add_constraint (dim_vector (-1, -1)); vertexnormals.add_constraint (dim_vector (-1, -1, 3)); - cdata.add_constraint ("single"); - cdata.add_constraint ("double"); - cdata.add_constraint ("uint8"); - cdata.add_constraint (dim_vector (-1, -1)); - cdata.add_constraint (dim_vector (-1, -1, 3)); } private: @@ -5062,7 +5068,6 @@ { cdata.add_constraint ("double"); cdata.add_constraint ("single"); - cdata.add_constraint ("uint8"); cdata.add_constraint (dim_vector (-1, -1, 3)); position.add_constraint (dim_vector (1, 4)); sliderstep.add_constraint (dim_vector (1, 2)); @@ -5283,7 +5288,6 @@ { cdata.add_constraint ("double"); cdata.add_constraint ("single"); - cdata.add_constraint ("uint8"); cdata.add_constraint (dim_vector (-1, -1, 3)); } }; @@ -5337,7 +5341,6 @@ { cdata.add_constraint ("double"); cdata.add_constraint ("single"); - cdata.add_constraint ("uint8"); cdata.add_constraint (dim_vector (-1, -1, 3)); } };