From dd83950b0614ca4aec73da843bfb175c8278be9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Tue, 16 Feb 2016 08:20:58 +0100 Subject: [PATCH] =?UTF-8?q?Fix=20sexp-conv=20assertion=20failure,=20report?= =?UTF-8?q?ed=20by=20Hanno=20B=C3=B6ck.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChangeLog | 5 ++++ tools/input.c | 81 +++++++++++++++++++++++++-------------------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8b430037..c9c522bf 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 b8085a4e..18a9dff5 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); -- GitLab