Hello, We found some problems in smltk DevInf decoding for some Nokia phones[1], here are the two patches:
commit 1077b831ecf4dcc7e780bc4d4ec0f7b4326ceb94 Author: Chen Congwu <congwu.c...@intel.com> Date: Wed Mar 24 12:00:42 2010 +0800 smltk+DevInf decoding: avoid a possible infinite loop For DevInf 1.1 parsing, DevInf decoding will cause an infinite loop if there is an empty <PropName> tag (found from Nokia N900, Nokia 7210c): eg: <CTCap> <CTType>text/plain</CTType> <PropName/> </CTCap> buildDevInfProperty will return OK without further processing if encountering an empty tag (in this case <PropName>) and the caller buildDevInfCtCap will re-evaluate the tag without advancing the parser, the re-evaluation can only end if current tag is an end tag or an unknown tag, otherwize it will call buildDevInfProperty with exactly the same environment again. diff --git a/src/syncml_tk/src/sml/xlt/all/xltdevinf.c b/src/syncml_tk/src/sml/xlt/all/xltdevinf.c index 28b2aea..5ad9e4c 100755 --- a/src/syncml_tk/src/sml/xlt/all/xltdevinf.c +++ b/src/syncml_tk/src/sml/xlt/all/xltdevinf.c @@ -651,7 +651,9 @@ static Ret_t buildDevInfProperty(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, in XltDecScannerPtr_t pScanner = pDecoder->scanner; Ret_t rc; - if (IS_EMPTY(pScanner->curtok)) { + /* Do not return immediately for <1.2 style, the outer loop ends only meeting an end tag + * which will lead to an infinite loop*/ + if (datastoreLocal && IS_EMPTY(pScanner->curtok)) { return SML_ERR_OK; } @@ -825,6 +827,7 @@ Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, Boolean_t da rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,datastoreLocal); if (rc==SML_ERR_OK) continue; // re-evaluate current tag (tag that caused buildDevInfProperty() to end, either unknown or closing </CTCap> + // this means do not return SML_ERR_OK unless this is an unknow tag or closing </CTCcap>, otherwise it will tri } break; commit 277d35dc82f814e86da26020a17eeea65f7d9634 Author: Chen Congwu <congwu.c...@intel.com> Date: Wed Mar 24 09:58:25 2010 +0800 smltk: DevInf decoding Some Nokia phones (N900) sent a nor-wellformed DevInf: The DevInf version was declared as 1.2, while <CTCAP> was not inside <Datastore>(which is the DevInf 1.1 behaviour). In addition, the content inside <CTCAP> was in DevInf 1.2 format. The original approach detects whether this is a DevInf 1.2 or 1.1 by testing whether <CTCAP> was inside <datastore>, thus will think this is a DevInf 1.1 when decoding the <CTCAP> which fails. The patch worked around this, when decoding <CTCAP> (precisely the <Property> or <PropName> inside <CTCAP>), use 1.2 style if we are decoding <Property> and 1.1 stype when decoding <PropName> diff --git a/src/syncml_tk/src/sml/xlt/all/xltdevinf.c b/src/syncml_tk/src/sml/xlt/all/xltdevinf.c index b589209..28b2aea 100755 --- a/src/syncml_tk/src/sml/xlt/all/xltdevinf.c +++ b/src/syncml_tk/src/sml/xlt/all/xltdevinf.c @@ -812,7 +812,10 @@ Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, Boolean_t da break; case TN_DEVINF_PROPERTY: // DS 1.2 case: only </Property> ends the property building process, next token must be read first - rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,datastoreLocal); + // If there is a Property tag, let's take it as DS 1.2 Property Decoding even if the CTCAP is globally + // This is found from some Nokia phones (eg. N900, which will send a DevInf v1.2 but the CTCAP + // was not inside the datastore as DevInf v1.1) + rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,TRUE); break; case TN_DEVINF_PROPNAME: // <DS 1.2 case: current token TN_DEVINF_PROPNAME is processed by builder, next occurence of TN_DEVINF_PROPNAME ends property [1] http://bugzilla.moblin.org/show_bug.cgi?id=10324 -- Regards, Chen Congwu Moblin China Development _______________________________________________ os-libsynthesis mailing list os-libsynthesis@synthesis.ch http://lists.synthesis.ch/mailman/listinfo/os-libsynthesis