From: <dg...@su...> - 2009-02-16 15:40:17
|
Author: bellmich Date: Mon Feb 16 16:37:56 2009 New Revision: 927 URL: http://libsyncml.opensync.org/changeset/927 Log: Some mobiles send WBXML messages which mix UTF-8 and UTF-16 encoded content. This requires correct entity encoding. If the entities are not correctly enocded then normal XML documents can contain NULL bytes in CDATA sections (e.g. SMS sync with content-type text/x-vMessage from a Nokia E71). Therefore the length cannot be determined with normal string functions. The length must be directly taken from the libwbxml API. Example: UTF-16: A => byte1 ::= "A" + byte2 ::= "\0" UTF-8: A => byte1 ::= "A" (no second byte) Modified: trunk/libsyncml/parser/sml_wbxml.c trunk/libsyncml/parser/sml_wbxml_internals.h trunk/tests/check_wbxml_assembler.c Modified: trunk/libsyncml/parser/sml_wbxml.c ============================================================================== --- trunk/libsyncml/parser/sml_wbxml.c Fri Feb 13 11:39:24 2009 (r926) +++ trunk/libsyncml/parser/sml_wbxml.c Mon Feb 16 16:37:56 2009 (r927) @@ -36,7 +36,7 @@ #include "sml_wbxml.h" #include "sml_wbxml_internals.h" -SmlBool smlWbxmlConvertTo(WBXMLConvXML2WBXMLParams *params, const char *input, char **output, unsigned int *outputLen, SmlError** error) +SmlBool smlWbxmlConvertTo(WBXMLConvXML2WBXMLParams *params, const char *input, char **output, size_t *outputLen, SmlError** error) { smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p, %p)", __func__, params, input, output, outputLen, error); smlAssert(input); @@ -58,13 +58,13 @@ return FALSE; } -SmlBool smlWbxmlConvertFrom(WBXMLConvWBXML2XMLParams *params, const char *input, unsigned int inputLen, char **output, SmlError** error) +SmlBool smlWbxmlConvertFrom(WBXMLConvWBXML2XMLParams *params, const char *input, size_t inputLen, char **output, size_t *outputLen, SmlError** error) { - smlTrace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p)", __func__, params, input, inputLen, output, error); + smlTrace(TRACE_ENTRY, "%s(%p, %p, %i, %p, %p, %p)", __func__, params, input, inputLen, output, outputLen, error); WBXMLError wberror; smlTrace(TRACE_INTERNAL, "WBXML2 VERSION: %s", WBXML_LIB_VERSION); - wberror = wbxml_conv_wbxml2xml((WB_UTINY*)input, inputLen, (WB_UTINY**)output, params); + wberror = wbxml_conv_wbxml2xml_withlen((WB_UTINY*)input, inputLen, (WB_UTINY**)output, (WB_ULONG*)outputLen, params); if (wberror != WBXML_OK) goto error; @@ -95,10 +95,10 @@ * encapsulated into CDATA. */ char *buffer = NULL; + size_t buffer_size = 0; WBXMLConvWBXML2XMLParams params = {WBXML_ENCODER_XML_GEN_COMPACT, WBXML_LANG_UNKNOWN, 0, TRUE}; - if (!smlWbxmlConvertFrom(¶ms, data, size, &buffer, error)) + if (!smlWbxmlConvertFrom(¶ms, data, size, &buffer, &buffer_size, error)) goto error; - unsigned int buffer_size = strlen(buffer); smlTrace(TRACE_INTERNAL, "converted XML message: %s", buffer); if (!smlXmlParserStart(parser, buffer, buffer_size, error)) Modified: trunk/libsyncml/parser/sml_wbxml_internals.h ============================================================================== --- trunk/libsyncml/parser/sml_wbxml_internals.h Fri Feb 13 11:39:24 2009 (r926) +++ trunk/libsyncml/parser/sml_wbxml_internals.h Mon Feb 16 16:37:56 2009 (r927) @@ -31,8 +31,8 @@ #include <wbxml.h> -SmlBool smlWbxmlConvertTo(WBXMLConvXML2WBXMLParams *params, const char *input, char **output, unsigned int *outputLen, SmlError** error); -SmlBool smlWbxmlConvertFrom(WBXMLConvWBXML2XMLParams *params, const char *input, unsigned int inputLen, char **output, SmlError** error); +SmlBool smlWbxmlConvertTo(WBXMLConvXML2WBXMLParams *params, const char *input, char **output, size_t *outputLen, SmlError** error); +SmlBool smlWbxmlConvertFrom(WBXMLConvWBXML2XMLParams *params, const char *input, size_t inputLen, char **output, size_t *outputLen, SmlError** error); #endif //_SML_WBXML_INTERNALS_H_ /*@}*/ Modified: trunk/tests/check_wbxml_assembler.c ============================================================================== --- trunk/tests/check_wbxml_assembler.c Fri Feb 13 11:39:24 2009 (r926) +++ trunk/tests/check_wbxml_assembler.c Mon Feb 16 16:37:56 2009 (r927) @@ -211,7 +211,8 @@ sml_fail_unless(size != 0, NULL); char *buffer = NULL; - sml_fail_unless(smlWbxmlConvertFrom(NULL, data, size, &buffer, &error), NULL); + size_t buffer_size = 0; + sml_fail_unless(smlWbxmlConvertFrom(NULL, data, size, &buffer, &buffer_size, &error), NULL); sml_fail_unless(buffer != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlSafeCFree(&data); |