From b5ed1f28a5c42a3532aa0e3e6ff1f902c01c6041 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Sat, 1 Apr 2017 13:00:00 +0100 Subject: [PATCH] encoding.c: Don't crash if NULL is passed as the string to the decode APIs. --- src/libespeak-ng/encoding.c | 18 ++++++++++++------ tests/encoding.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/libespeak-ng/encoding.c b/src/libespeak-ng/encoding.c index 0ab33ee4..05651068 100644 --- a/src/libespeak-ng/encoding.c +++ b/src/libespeak-ng/encoding.c @@ -615,6 +615,12 @@ string_decoder_getc_auto(espeak_ng_TEXT_DECODER *decoder) return c; } +static uint32_t +null_decoder_getc(espeak_ng_TEXT_DECODER *decoder) +{ + return 0; +} + typedef struct { uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder); @@ -678,10 +684,10 @@ text_decoder_decode_string(espeak_ng_TEXT_DECODER *decoder, if (enc->get == NULL) return ENS_UNKNOWN_TEXT_ENCODING; - decoder->get = enc->get; + decoder->get = string ? enc->get : null_decoder_getc; decoder->codepage = enc->codepage; decoder->current = (const uint8_t *)string; - decoder->end = (const uint8_t *)(string + length); + decoder->end = (const uint8_t *)(string ? string + length : string); return ENS_OK; } @@ -698,10 +704,10 @@ text_decoder_decode_string_auto(espeak_ng_TEXT_DECODER *decoder, if (enc->get == NULL) return ENS_UNKNOWN_TEXT_ENCODING; - decoder->get = string_decoder_getc_auto; + decoder->get = string ? string_decoder_getc_auto : null_decoder_getc; decoder->codepage = enc->codepage; decoder->current = (const uint8_t *)string; - decoder->end = (const uint8_t *)(string + length); + decoder->end = (const uint8_t *)(string ? string + length : string); return ENS_OK; } @@ -710,10 +716,10 @@ text_decoder_decode_wstring(espeak_ng_TEXT_DECODER *decoder, const wchar_t *string, int length) { - decoder->get = string_decoder_getc_wchar; + decoder->get = string ? string_decoder_getc_wchar : null_decoder_getc; decoder->codepage = NULL; decoder->current = (const uint8_t *)string; - decoder->end = (const uint8_t *)(string + length); + decoder->end = (const uint8_t *)(string ? string + length : string); return ENS_OK; } diff --git a/tests/encoding.c b/tests/encoding.c index 431db8a1..af1e812e 100644 --- a/tests/encoding.c +++ b/tests/encoding.c @@ -728,6 +728,22 @@ test_iso_10646_ucs_2_encoding() destroy_text_decoder(decoder); } +void +test_char_decoder() +{ + printf("testing char decoder\n"); + + espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); + + // null string + assert(text_decoder_decode_string(decoder, NULL, 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); + assert(text_decoder_eof(decoder) == 1); + assert(text_decoder_getc(decoder) == 0); + assert(text_decoder_eof(decoder) == 1); + + destroy_text_decoder(decoder); +} + void test_wchar_decoder() { @@ -735,6 +751,12 @@ test_wchar_decoder() espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); + // null string + assert(text_decoder_decode_wstring(decoder, NULL, 5) == ENS_OK); + assert(text_decoder_eof(decoder) == 1); + assert(text_decoder_getc(decoder) == 0); + assert(text_decoder_eof(decoder) == 1); + assert(text_decoder_decode_wstring(decoder, L"aG\xA0\x2045", 4) == ENS_OK); assert(text_decoder_eof(decoder) == 0); assert(text_decoder_getc(decoder) == 'a'); @@ -756,6 +778,12 @@ test_auto_decoder() espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); + // null string + assert(text_decoder_decode_string_auto(decoder, NULL, 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); + assert(text_decoder_eof(decoder) == 1); + assert(text_decoder_getc(decoder) == 0); + assert(text_decoder_eof(decoder) == 1); + // UTF-8 assert(text_decoder_decode_string_auto(decoder, "aG\xC2\xA0 ", 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); assert(text_decoder_eof(decoder) == 0); @@ -813,6 +841,7 @@ main(int argc, char **argv) test_utf_8_encoding(); test_iso_10646_ucs_2_encoding(); + test_char_decoder(); test_wchar_decoder(); test_auto_decoder();