changeset 33271:59ee9d370307

Better input validation for sort() function (bug #65527) * data.cc: Verify DIM input is a positive scalar. Change error message when incorrectly using MODE input to be more specific. Add BIST tests.
author Rik <rik@octave.org>
date Fri, 29 Mar 2024 14:46:02 -0700
parents 65d2a1f70155
children a29e8d52c4e8
files libinterp/corefcn/data.cc
diffstat 1 files changed, 17 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/data.cc	Fri Mar 29 14:53:49 2024 +0100
+++ b/libinterp/corefcn/data.cc	Fri Mar 29 14:46:02 2024 -0700
@@ -7089,13 +7089,19 @@
             error (R"(sort: MODE must be either "ascend" or "descend")");
         }
       else
-        dim = args(1).nint_value () - 1;
+        {
+          if (! args(1).is_scalar_type ())
+            error ("sort: DIM must be a positive scalar integer");
+          dim = args(1).nint_value () - 1;
+          if (dim < 0)
+            error ("sort: DIM must be a positive scalar integer");
+        }
     }
 
   if (nargin > 2)
     {
       if (have_sortmode)
-        error ("sort: DIM must be a valid dimension");
+        error ("sort: DIM argument must precede MODE argument");
 
       std::string mode = args(2).xstring_value ("sort: MODE must be a string");
 
@@ -7112,11 +7118,6 @@
     {
       dim = dv.first_non_singleton ();
     }
-  else
-    {
-      if (dim < 0)
-        error ("sort: DIM must be a valid dimension");
-    }
 
   octave_value_list retval (return_idx ? 2 : 1);
 
@@ -7354,8 +7355,15 @@
 %! [v, i] = sort (a);
 %! assert (i, [1, 4, 2, 5, 3]);
 
-%!error sort ()
-%!error sort (1, 2, 3, 4)
+%!error <Invalid call> sort ()
+%!error <Invalid call> sort (1, 2, 3, 4)
+%!error <MODE must be either "ascend" or "descend"> sort (1, "foobar")
+%!error <DIM must be a positive scalar integer> sort (1, [1 2 3])
+%!error <DIM argument must precede MODE argument> sort (1, "ascend", 1)
+%!error <MODE must be a string> sort (1, 1, 1)
+%!error <MODE must be either "ascend" or "descend"> sort (1, 1, "foobar")
+%!error <DIM must be a positive scalar integer> sort (1, 0)
+
 */
 
 // Sort the rows of the matrix @var{a} according to the order