[linux-nfc] [neard][PATCH 14/16] ndef: fix parsing of UTF-16 text payload
Krzysztof Kozlowski <[email protected]>
| Newsgroups | org.01.lists.linux-nfc,dev.linux.lists.oe-linux-nfc |
|---|---|
| Message-ID | <[email protected]> |
The string Signed-off-by: Krzysztof Kozlowski <[email protected]> --- src/ndef.c | 22 ++++++++++++++-------- unit/test-ndef-parse.c | 27 ++++++++++++++++++++------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/ndef.c b/src/ndef.c index 13e3356c2c4c..093eba910027 100644 --- a/src/ndef.c +++ b/src/ndef.c @@ -1150,7 +1150,8 @@ parse_text_payload(uint8_t *payload, uint32_t length) { struct near_ndef_text_payload *text_payload = NULL; uint8_t status, lang_length, len; - char *g_str, *txt; + char *g_str = NULL; + char *txt; uint32_t offset; gboolean valid; @@ -1189,9 +1190,12 @@ parse_text_payload(uint8_t *payload, uint32_t length) len = length - lang_length - 1; - if (status && (len % 2)) { - DBG("Payload not valid UTF-16 (length %d does not match)", len); - goto fail; + if (status) { + if (len % 2) { + DBG("Payload not valid UTF-16 (length %d does not match)", len); + goto fail; + } + len /= 2; } if (len > 0) { @@ -1206,13 +1210,13 @@ parse_text_payload(uint8_t *payload, uint32_t length) valid = g_utf8_validate(g_str, len, NULL); - if (status) - g_free(g_str); - if (!valid) goto fail; - text_payload->data = g_strndup(txt, len); + /* FIXME: this won't parse properly UTF-8 */ + text_payload->data = g_strndup(g_str, len); + if (status) + g_free(g_str); } else { text_payload->data = NULL; } @@ -1227,6 +1231,8 @@ parse_text_payload(uint8_t *payload, uint32_t length) return text_payload; fail: + if (status) + g_free(g_str); near_error("text payload parsing failed"); free_text_payload(text_payload); diff --git a/unit/test-ndef-parse.c b/unit/test-ndef-parse.c index 6c62c7a928c7..073b36ac48ff 100644 --- a/unit/test-ndef-parse.c +++ b/unit/test-ndef-parse.c @@ -146,9 +146,16 @@ static uint8_t uri[] = {0xd1, 0x1, 0xa, 0x55, 0x1, 0x69, 0x6e, 0x74, 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d}; /* 'hello żółw' - UTF-8 - en-US Text NDEF */ -static uint8_t text[] = {0xd1, 0x1, 0x13, 0x54, 0x5, 0x65, 0x6e, 0x2d, - 0x55, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0xc5, - 0xbc, 0xc3, 0xb3, 0xc5, 0x82, 0x77}; +static uint8_t text_utf8[] = {0xd1, 0x1, 0x13, 0x54, 0x5, 0x65, 0x6e, 0x2d, + 0x55, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0xc5, + 0xbc, 0xc3, 0xb3, 0xc5, 0x82, 0x77}; + +/* 'hello' - UTF-16 - en-US Text NDEF */ +static uint8_t text_utf16[] = {0xd1, 0x1, 0x10, 0x54, 0x85, + /* en-US */ + 0x65, 0x6e, 0x2d, 0x55, 0x53, + /* hello żółw */ + 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00}; /* 'hello żółw' - UTF-16 - en-US Text NDEF UTF-16 malformed*/ static uint8_t text_utf16_invalid[] = {0xd1, 0x1, 0x19, 0x54, 0x85, @@ -227,12 +234,12 @@ static void test_ndef_uri(void) test_ndef_free_record(record); } -static void test_ndef_text(void) +static void test_ndef_text_encoding(uint8_t *text, size_t len, const char *encoding, const char *expected) { GList *records; struct near_ndef_record *record; - records = near_ndef_parse_msg(text, sizeof(text), NULL); + records = near_ndef_parse_msg(text, len, NULL); g_assert(records); g_assert(g_list_length(records) == 1); @@ -244,8 +251,8 @@ static void test_ndef_text(void) g_assert(record->header->me == 1); g_assert(record->text); - g_assert(strcmp(record->text->data, "hello żółw") == 0); - g_assert(strcmp(record->text->encoding, "UTF-8") == 0); + g_assert(strcmp(record->text->data, expected) == 0); + g_assert(strcmp(record->text->encoding, encoding) == 0); g_assert(strcmp(record->text->language_code, "en-US") == 0); if (g_test_verbose()) { @@ -262,6 +269,12 @@ static void test_ndef_text(void) test_ndef_free_record(record); } +static void test_ndef_text(void) +{ + test_ndef_text_encoding(text_utf8, sizeof(text_utf8), "UTF-8", "hello żółw"); + test_ndef_text_encoding(text_utf16, sizeof(text_utf16), "UTF-16", "hello"); +} + static void test_ndef_text_invalid_utf16(void) { GList *records; -- 2.27.0 _______________________________________________ Linux-nfc mailing list -- [email protected] To unsubscribe send an email to [email protected] %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s