Browse Source

encoding.c: Don't crash if NULL is passed as the string to the decode APIs.

master
Reece H. Dunn 8 years ago
parent
commit
b5ed1f28a5
2 changed files with 41 additions and 6 deletions
  1. 12
    6
      src/libespeak-ng/encoding.c
  2. 29
    0
      tests/encoding.c

+ 12
- 6
src/libespeak-ng/encoding.c View File

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


+ 29
- 0
tests/encoding.c View File

@@ -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();


Loading…
Cancel
Save