diff --git a/ChangeLog b/ChangeLog
index 8b430037b82f8cab4dfc05d14d8277cd71f35a33..c9c522bf39b7d147f2b0e41c22a306a60fcb9eb0 100644
--- 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
diff --git a/tools/input.c b/tools/input.c
index b8085a4e31a41799344ed835d1f6fb525cbac56a..18a9dff5c5659382bac92e2080ffdb72df49772c 100644
--- a/tools/input.c
+++ b/tools/input.c
@@ -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);