# HG changeset patch # User Markus Mützel # Date 1709990466 -3600 # Sat Mar 09 14:21:06 2024 +0100 # Branch stable # Node ID 387f5c0a9a1767e5aee36b663b77309d6a99ee78 # Parent 2bee38885727faa7711615788e245aa0c3f253b9 Check that size of "cdata" property matches in patch object (bug #65431). * libinterp/corefcn/graphics.cc (patch::properties::update_fvc): Do not continue if the number of color values in the "cdata" property doesn't match the number of faces (or vertices per face) in the patch object. diff -r 2bee38885727 -r 387f5c0a9a17 libinterp/corefcn/graphics.cc --- a/libinterp/corefcn/graphics.cc Fri Mar 08 19:16:53 2024 +0100 +++ b/libinterp/corefcn/graphics.cc Sat Mar 09 14:21:06 2024 +0100 @@ -9449,21 +9449,30 @@ return; } + octave_idx_type nv = xd.rows (); + octave_idx_type nf = xd.columns (); + octave_idx_type ncv = cd.rows (); + octave_idx_type ncf = cd.columns (); + if ((ncf > 1 || ncv > 1) && ((ncf != nf) || (ncv != 1 && ncv != nv))) + { + m_bad_data_msg = "cdata does not match number of faces " + "or number of vertices per face"; + return; + } + // Faces and Vertices dim_vector dv; bool is3D = false; - octave_idx_type nr = xd.rows (); - octave_idx_type nc = xd.columns (); - if (nr == 1 && nc > 1) - { - nr = nc; - nc = 1; + if (nv == 1 && nf > 1) + { + nv = nf; + nf = 1; xd = xd.as_column (); yd = yd.as_column (); zd = zd.as_column (); } - dv(0) = nr * nc; + dv(0) = nv * nf; if (zd.isempty ()) dv(1) = 2; else @@ -9473,12 +9482,13 @@ } Matrix vert (dv); - Matrix idx (nc, nr); - + Matrix idx (nf, nv); + + // FIXME: This might duplicate shared vertices. octave_idx_type kk = 0; - for (octave_idx_type jj = 0; jj < nc; jj++) - { - for (octave_idx_type ii = 0; ii < nr; ii++) + for (octave_idx_type jj = 0; jj < nf; jj++) + { + for (octave_idx_type ii = 0; ii < nv; ii++) { vert(kk, 0) = xd(ii, jj); vert(kk, 1) = yd(ii, jj);