]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Fix sexp-conv assertion failure, reported by Hanno Böck.
authorNiels Möller <nisse@lysator.liu.se>
Tue, 16 Feb 2016 07:20:58 +0000 (08:20 +0100)
committerNiels Möller <nisse@lysator.liu.se>
Tue, 16 Feb 2016 07:20:58 +0000 (08:20 +0100)
ChangeLog
tools/input.c

index 8b430037b82f8cab4dfc05d14d8277cd71f35a33..c9c522bf39b7d147f2b0e41c22a306a60fcb9eb0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2016-02-16  Niels Möller  <nisse@lysator.liu.se>
 
+       * tools/input.c (sexp_get_string_length): Process advanced string
+       syntax only when in advanced mode. Fixes an assertion failure
+       reported by Hanno Böck, for input where advanced syntax is
+       improperly wrapped inside transport syntax.
+
        * tools/parse.c (sexp_parse): Fail with an error message for
        unexpected ']' characters. Fixes crash reported by Hanno Böck.
        Also handle SEXP_DISPLAY (internal error) explicitly, without a
index b8085a4e31a41799344ed835d1f6fb525cbac56a..18a9dff5c5659382bac92e2080ffdb72df49772c 100644 (file)
@@ -286,57 +286,56 @@ sexp_get_string_length(struct sexp_input *input, enum sexp_mode mode,
        }
     }
 
-  switch(input->c)
-    {
-    case ':':
-      /* Verbatim */
-      for (; length; length--)
-       {
-         sexp_next_char(input);
-         sexp_push_char(input, string);
-       }
-      
-      break;
+  if (input->c == ':')
+    /* Verbatim */
+    for (; length; length--)
+      {
+       sexp_next_char(input);
+       sexp_push_char(input, string);
+      }
 
-    case '"':
-      if (mode != SEXP_ADVANCED)
-       die("Encountered quoted string in canonical mode.\n");
+  else if (mode != SEXP_ADVANCED)
+    die("Encountered advanced string in canonical mode.\n");
 
-      for (; length; length--)
-       if (sexp_get_quoted_char(input))
-         sexp_push_char(input, string);
-       else
-         die("Unexpected end of string.\n");
+  else
+    switch(input->c)
+      {
+      case '"':
+       for (; length; length--)
+         if (sexp_get_quoted_char(input))
+           sexp_push_char(input, string);
+         else
+           die("Unexpected end of string.\n");
       
-      if (sexp_get_quoted_char(input))
-       die("Quoted string longer than expected.\n");
+       if (sexp_get_quoted_char(input))
+         die("Quoted string longer than expected.\n");
 
-      break;
+       break;
       
-    case '#':
-      sexp_input_start_coding(input, &nettle_base16, '#');
-      goto decode;
+      case '#':
+       sexp_input_start_coding(input, &nettle_base16, '#');
+       goto decode;
 
-    case '|':
-      sexp_input_start_coding(input, &nettle_base64, '|');
+      case '|':
+       sexp_input_start_coding(input, &nettle_base64, '|');
 
-    decode:
-      for (; length; length--)
-       {
-         sexp_next_char(input);
-         sexp_push_char(input, string);
-       }
-      sexp_get_char(input);
-      if (input->ctype != SEXP_END_CHAR)
-       die("Coded string too long.\n");
+      decode:
+       for (; length; length--)
+         {
+           sexp_next_char(input);
+           sexp_push_char(input, string);
+         }
+       sexp_get_char(input);
+       if (input->ctype != SEXP_END_CHAR)
+         die("Coded string too long.\n");
 
-      sexp_input_end_coding(input);
+       sexp_input_end_coding(input);
       
-      break;
+       break;
       
-    default:
-      die("Invalid string.\n");
-    }
+      default:
+       die("Invalid string.\n");
+      }
 
   /* Skip the ending character. */
   sexp_get_char(input);