changeset 32027:783b69da1b45 stable

undo_string_escapes: Return '\0' for NUL byte input (bug #64051) * utils.cc (undo_string_escape): Delete test of input character 'c' which short-circuited function and returned immediately for "c == 0". * utils.cc (Fundo_string_escapes): Add BIST tests for NUL byte. Add expected pattern for %!error input validation tests.
author Rik <rik@octave.org>
date Sun, 16 Apr 2023 09:05:11 -0700
parents e3793a404ea1
children 9918d52ee76a bc681594872a
files libinterp/corefcn/utils.cc
diffstat 1 files changed, 9 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/utils.cc	Sun Apr 16 14:27:45 2023 +0200
+++ b/libinterp/corefcn/utils.cc	Sun Apr 16 09:05:11 2023 -0700
@@ -985,15 +985,12 @@
 
 const char * undo_string_escape (char c)
 {
-  if (! c)
-    return "";
-
   switch (c)
     {
-    case '\0':
+    case '\0': // NUL byte
       return R"(\0)";
 
-    case '\a':
+    case '\a': // alarm
       return R"(\a)";
 
     case '\b': // backspace
@@ -1084,10 +1081,10 @@
 %!assert (undo_string_escapes ("foo\nbar"), "foo\\nbar")
 %!assert (undo_string_escapes (["foo", char(10), "bar"]), "foo\\nbar")
 
-%!assert (undo_string_escapes ("\a\b\f\n\r\t\v"), '\a\b\f\n\r\t\v')
-%!assert (undo_string_escapes ("\a\b\f\n\r\t\v"), "\\a\\b\\f\\n\\r\\t\\v")
-%!assert (undo_string_escapes (char ([7, 8, 12, 10, 13, 9, 11])),
-%!        "\\a\\b\\f\\n\\r\\t\\v")
+%!assert (undo_string_escapes ("\0\a\b\f\n\r\t\v"), '\0\a\b\f\n\r\t\v')
+%!assert (undo_string_escapes ("\0\a\b\f\n\r\t\v"), "\\0\\a\\b\\f\\n\\r\\t\\v")
+%!assert (undo_string_escapes (char ([0, 7, 8, 12, 10, 13, 9, 11])),
+%!        "\\0\\a\\b\\f\\n\\r\\t\\v")
 
 %!assert (undo_string_escapes ("\\"), '\\')
 %!assert (undo_string_escapes ("\\"), "\\\\")
@@ -1096,9 +1093,9 @@
 %!assert (undo_string_escapes ("\"double-quoted\""), '\"double-quoted\"')
 %!assert (undo_string_escapes ("\"double-quoted\""), "\\\"double-quoted\\\"")
 
-%!error undo_string_escapes ()
-%!error undo_string_escapes ("foo", "bar")
-%!error undo_string_escapes (3)
+%!error <Invalid call> undo_string_escapes ()
+%!error <Invalid call> undo_string_escapes ("foo", "bar")
+%!error <STRING argument> undo_string_escapes (3)
 */
 
 DEFUN (is_absolute_filename, args, ,