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

return c; return c;
} }


static uint32_t
null_decoder_getc(espeak_ng_TEXT_DECODER *decoder)
{
return 0;
}

typedef struct typedef struct
{ {
uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder); uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder);
if (enc->get == NULL) if (enc->get == NULL)
return ENS_UNKNOWN_TEXT_ENCODING; return ENS_UNKNOWN_TEXT_ENCODING;


decoder->get = enc->get;
decoder->get = string ? enc->get : null_decoder_getc;
decoder->codepage = enc->codepage; decoder->codepage = enc->codepage;
decoder->current = (const uint8_t *)string; 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; return ENS_OK;
} }


if (enc->get == NULL) if (enc->get == NULL)
return ENS_UNKNOWN_TEXT_ENCODING; 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->codepage = enc->codepage;
decoder->current = (const uint8_t *)string; 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; return ENS_OK;
} }


const wchar_t *string, const wchar_t *string,
int length) int length)
{ {
decoder->get = string_decoder_getc_wchar;
decoder->get = string ? string_decoder_getc_wchar : null_decoder_getc;
decoder->codepage = NULL; decoder->codepage = NULL;
decoder->current = (const uint8_t *)string; 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; return ENS_OK;
} }



+ 29
- 0
tests/encoding.c View File

destroy_text_decoder(decoder); 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 void
test_wchar_decoder() test_wchar_decoder()
{ {


espeak_ng_TEXT_DECODER *decoder = create_text_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_decode_wstring(decoder, L"aG\xA0\x2045", 4) == ENS_OK);
assert(text_decoder_eof(decoder) == 0); assert(text_decoder_eof(decoder) == 0);
assert(text_decoder_getc(decoder) == 'a'); assert(text_decoder_getc(decoder) == 'a');


espeak_ng_TEXT_DECODER *decoder = create_text_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 // UTF-8
assert(text_decoder_decode_string_auto(decoder, "aG\xC2\xA0 ", 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); assert(text_decoder_decode_string_auto(decoder, "aG\xC2\xA0 ", 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK);
assert(text_decoder_eof(decoder) == 0); assert(text_decoder_eof(decoder) == 0);
test_utf_8_encoding(); test_utf_8_encoding();
test_iso_10646_ucs_2_encoding(); test_iso_10646_ucs_2_encoding();


test_char_decoder();
test_wchar_decoder(); test_wchar_decoder();
test_auto_decoder(); test_auto_decoder();



Loading…
Cancel
Save