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
}
}
- 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);