mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-11-09 16:01:12 +00:00
encoding.c: Don't crash if NULL is passed as the string to the decode APIs.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user