From: <svn...@op...> - 2009-04-29 14:47:36
|
Author: bellmich Date: Wed Apr 29 16:47:30 2009 New Revision: 1076 URL: http://libsyncml.opensync.org/changeset/1076 Log: committed modified patch from ticket #235 - The original patch was modified because the end of the new function could be reached without a return statement. - A new test was introduced to verify the change. Modified: trunk/libsyncml/parser/sml_xml_parse.c trunk/tests/CMakeLists.txt trunk/tests/check_xml_parser.c Modified: trunk/libsyncml/parser/sml_xml_parse.c ============================================================================== --- trunk/libsyncml/parser/sml_xml_parse.c Wed Apr 29 10:05:49 2009 (r1075) +++ trunk/libsyncml/parser/sml_xml_parse.c Wed Apr 29 16:47:30 2009 (r1076) @@ -56,6 +56,25 @@ return ret; } +static SmlBool _smlXmlSkipNode(SmlXmlParser *parser) +{ + int node_type; + + if (xmlTextReaderNext(parser->reader) != 1) + return FALSE; + + node_type = xmlTextReaderNodeType(parser->reader); + while (xmlTextReaderNodeType(parser->reader) == XML_READER_TYPE_DOCUMENT_TYPE || + xmlTextReaderNodeType(parser->reader) == XML_READER_TYPE_WHITESPACE || + xmlTextReaderNodeType(parser->reader) == XML_READER_TYPE_SIGNIFICANT_WHITESPACE) + { + if (!_smlXmlParserStep (parser)) + return FALSE; + } + + return TRUE; +} + static SmlBool _smlXmlParserExpectNode(SmlXmlParser *parser, int type, SmlBool empty, const char *name, SmlError **error) { CHECK_ERROR_REF @@ -556,7 +575,8 @@ if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_MEM)) { /* Ignored for now */ - if (xmlTextReaderNext(parser->reader) != 1) { + smlTrace(TRACE_INTERNAL, "%s: Skipping mem node"); + if (!_smlXmlSkipNode(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "Unable to skip mem node"); goto error; } @@ -3440,7 +3460,7 @@ } else if (!strcmp((char *)xmlTextReaderConstName(parser->reader), SML_ELEMENT_EXT)) { /* Ignored for now */ smlTrace(TRACE_INTERNAL, "%s: Skipping ext node"); - if (xmlTextReaderNext(parser->reader) != 1) { + if (!_smlXmlSkipNode(parser)) { smlErrorSet(error, SML_ERROR_GENERIC, "Unable to skip ext node"); goto error; } Modified: trunk/tests/CMakeLists.txt ============================================================================== --- trunk/tests/CMakeLists.txt Wed Apr 29 10:05:49 2009 (r1075) +++ trunk/tests/CMakeLists.txt Wed Apr 29 16:47:30 2009 (r1076) @@ -141,6 +141,7 @@ SML_ADD_TESTCASE( xml_parser_devinf ) SML_ADD_TESTCASE( xml_parser_devinf_ctcap ) SML_ADD_TESTCASE( xml_parser_devinf12 ) + SML_ADD_TESTCASE( xml_parser_devinf_ext ) SML_ADD_TESTCASE( xml_parser_empty_data_element ) SML_ADD_TESTCASE( xml_parser_msgref_zero ) SML_ADD_TESTCASE( xml_parser_ctcap_property_size ) Modified: trunk/tests/check_xml_parser.c ============================================================================== --- trunk/tests/check_xml_parser.c Wed Apr 29 10:05:49 2009 (r1075) +++ trunk/tests/check_xml_parser.c Wed Apr 29 16:47:30 2009 (r1076) @@ -1406,6 +1406,71 @@ } END_TEST +START_TEST (xml_parser_devinf_ext) +{ + /* The following test ensures that the parser tolerates Ext in DevInf + * like this one from a ticket: + * <Ext> + * <XNam>X-funambol-smartslow</XNam> + * </Ext> + */ + + const char *data = "<?xml version=\"1.0\"?><!DOCTYPE SyncML PUBLIC \"-//SYNCML//DTD SyncML 1.1//EN\" \"http://www.syncml.org/docs/syncml_represent_v11_20020213.dtd\"><SyncML xmlns=\"syncml:SYNCML1.1\"><SyncHdr><VerDTD>1.1</VerDTD><VerProto>SyncML/1.1</VerProto><SessionID>21</SessionID><MsgID>1</MsgID><Target><LocURI>PC Suite</LocURI></Target><Source><LocURI>IMEI:XXXX</LocURI></Source><Meta><MaxMsgSize xmlns=\"syncml:metinf\">10000</MaxMsgSize></Meta></SyncHdr><SyncBody><Put><CmdID>8</CmdID><Meta><Type xmlns=\"syncml:metinf\">application/vnd.syncml-devinf+xml</Type></Meta><Item><Source><LocURI>./devinf11</LocURI></Source><Data><DevInf xmlns=\"syncml:devinf\"><VerDTD>1.1</VerDTD><Man>NOKIA</Man><Mod>6680</Mod><SwV>3.04.37</SwV><DevID>IMEI:XXXX</DevID><DevTyp>phone</DevTyp><SupportLargeObjs/><SupportNumberOfChanges/><DataStore><SourceRef>./C\\Systemata\\Calendar</SourceRef><MaxGUIDSize>8</MaxGUIDSize><Rx-Pref><CTType>text/x-vcalendar</CTType><VerCT>1.0</VerCT></Rx-Pref><Rx><CTType>text/calendar</CTType><VerCT>2.0</VerCT></Rx><Tx-Pref><CTType>text/x-vcalendar</CTType><VerCT>1.0</VerCT></Tx-Pref><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType><SyncType>7</SyncType></SyncCap></DataStore><DataStore><SourceRef>./C\\System\\\\\\Data\\Contacts.cdb</SourceRef><MaxGUIDSize>8</MaxGUIDSize><Rx-Pref><CTType>text/x-vcard</CTType><VerCT>2.1</VerCT></Rx-Pref><Rx><CTType>text/vcard</CTType><VerCT>3.0</VerCT></Rx><Tx-Pref><CTType>text/x-vcard</CTType><VerCT>2.1</VerCT></Tx-Pref><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType><SyncType>7</SyncType></SyncCap></DataStore><DataStore><SourceRef>./C\\System\\Data\\Notepad.dat</SourceRef><MaxGUIDSize>8</MaxGUIDSize><Rx-Pref><CTType>text/plain</CTType><VerCT>1.0</VerCT></Rx-Pref><Rx><CTType>text/plain</CTType><VerCT>1.0</VerCT></Rx><Tx-Pref><CTType>text/plain</CTType><VerCT>1.0</VerCT></Tx-Pref><Tx><CTType>text/plain</CTType><VerCT>1.0</VerCT></Tx><SyncCap><SyncType>1</SyncType><SyncType>2</SyncType><SyncType>3</SyncType><SyncType>4</SyncType><SyncType>5</SyncType><SyncType>6</SyncType><SyncType>7</SyncType></SyncCap></DataStore><CTCap><CTType>text/x-vcalendar</CTType><PropName>BEGIN</PropName><ValEnum>VCALENDAR</ValEnum><ValEnum>VEVENT</ValEnum><ValEnum>VTODO</ValEnum><PropName>END</PropName><ValEnum>VCALENDAR</ValEnum><ValEnum>VEVENT</ValEnum><ValEnum>VTODO</ValEnum><PropName>VERSION</PropName><ValEnum>1.0</ValEnum><PropName>UID</PropName><PropName>SUMMARY</PropName><PropName>DESCRIPTION</PropName><PropName>DTEND</PropName><PropName>DTSTART</PropName><PropName>AALARM</PropName><ParamName>TYPE</ParamName><PropName>CLASS</PropName><ValEnum>PUBLIC</ValEnum><ValEnum>PRIVATE</ValEnum><ValEnum>CONFIDENTIAL</ValEnum><PropName>COMPLETED</PropName><PropName>LOCATION</PropName><PropName>DCREATED</PropName><PropName>LAST-MODIFIED</PropName><PropName>PRIORITY</PropName><PropName>STATUS</PropName><PropName>RRULE</PropName><PropName>DUE</PropName><PropName>EXDATE</PropName><PropName>X-EPOCAGENDAENTRYTYPE</PropName><CTType>text/calendar</CTType><PropName>BEGIN</PropName><ValEnum>VCALENDAR</ValEnum><ValEnum>VEVENT</ValEnum><ValEnum>VTODO</ValEnum><PropName>END</PropName><ValEnum>VCALENDAR</ValEnum><ValEnum>VEVENT</ValEnum><ValEnum>VTODO</ValEnum><PropName>VERSION</PropName><ValEnum>2.0</ValEnum><PropName>UID</PropName><PropName>SUMMARY</PropName><PropName>DESCRIPTION</PropName><PropName>DTEND</PropName><PropName>DTSTART</PropName><PropName>AALARM</PropName><ParamName>TYPE</ParamName><PropName>CLASS</PropName><ValEnum>PUBLIC</ValEnum><ValEnum>PRIVATE</ValEnum><ValEnum>CONFIDENTIAL</ValEnum><PropName>COMPLETED</PropName><PropName>LOCATION</PropName><PropName>DCREATED</PropName><PropName>LAST-MODIFIED</PropName><PropName>PRIORITY</PropName><PropName>STATUS</PropName><PropName>RRULE</PropName><PropName>DUE</PropName><PropName>EXDATE</PropName><PropName>X-EPOCAGENDAENTRYTYPE</PropName><CTType>text/x-vcard</CTType><PropName>BEGIN</PropName><ValEnum>VCARD</ValEnum><PropName>END</PropName><ValEnum>VCARD</ValEnum><PropName>VERSION</PropName><ValEnum>2.1</ValEnum><PropName>REV</PropName><PropName>N</PropName><PropName>ADR</PropName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><PropName>TEL</PropName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><ParamName>CELL</ParamName><ParamName>PAGER</ParamName><ParamName>FAX</ParamName><ParamName>VIDEO</ParamName><PropName>FN</PropName><PropName>EMAIL</PropName><ParamName>INTERNET</ParamName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><PropName>URL</PropName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><PropName>NOTE</PropName><PropName>TITLE</PropName><PropName>ORG</PropName><PropName>PHOTO</PropName><PropName>BDAY</PropName><PropName>SOUND</PropName><ParamName>X-IRMC-N</ParamName><CTType>text/vcard</CTType><PropName>BEGIN</PropName><ValEnum>VCARD</ValEnum><PropName>END</PropName><ValEnum>VCARD</ValEnum><PropName>VERSION</PropName><ValEnum>3.0</ValEnum><PropName>REV</PropName><PropName>N</PropName><PropName>ADR</PropName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><PropName>TEL</PropName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><ParamName>CELL</ParamName><ParamName>PAGER</ParamName><ParamName>FAX</ParamName><ParamName>VIDEO</ParamName><PropName>FN</PropName><PropName>EMAIL</PropName><ParamName>INTERNET</ParamName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><PropName>URL</PropName><ParamName>HOME</ParamName><ParamName>WORK</ParamName><PropName>NOTE</PropName><PropName>TITLE</PropName><PropName>ORG</PropName><PropName>PHOTO</PropName><PropName>BDAY</PropName><PropName>SOUND</PropName><ParamName>X-IRMC-N</ParamName><CTType>text/plain</CTType></CTCap>\n<Ext>\n <XNam>X-funambol-smartslow</XNam>\n</Ext></DevInf></Data></Item></Put><Final/></SyncBody></SyncML>"; + + SmlError *error = NULL; + SmlParser *parser = start_parser(data, &error); + sml_fail_unless(parser != NULL, "%s", smlErrorPrint(&error)); + + SmlHeader *header = NULL; + SmlCred *cred = NULL; + + sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); + sml_fail_unless(header != NULL, NULL); + sml_fail_unless(cred == NULL, NULL); + sml_fail_unless(error == NULL, NULL); + + sml_fail_unless(header->messageID == 1, NULL); + smlHeaderFree(header); + + SmlStatus *status = NULL; + sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); + sml_fail_unless(status == NULL, NULL); + sml_fail_unless(error == NULL, NULL); + + SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error) == SML_PARSER_RESULT_NORMAL, NULL); + sml_fail_unless(cmd != NULL, NULL); + sml_fail_unless(error == NULL, NULL); + sml_fail_unless(cmd->cmdID == 8, NULL); + sml_fail_unless(cmd->type == SML_COMMAND_TYPE_PUT, NULL); + sml_fail_unless(cmd->private.access.item != NULL, NULL); + + char *buffer = NULL; + unsigned int size = 0; + sml_fail_unless(smlItemGetData(cmd->private.access.item, &buffer, &size, &error), NULL); + sml_fail_unless(error == NULL, NULL); + + SmlDevInf *devinf = smlDevInfParse(buffer, size, &error); + sml_fail_unless(devinf != NULL, "%s", smlErrorPrint(&error)); + sml_fail_unless(error == NULL, NULL); + smlDevInfUnref(devinf); + + smlCommandUnref(cmd); + + sml_fail_unless(smlParserGetCommand(parser, &cmd, &error) == SML_PARSER_RESULT_OTHER, NULL); + sml_fail_unless(cmd == NULL, NULL); + sml_fail_unless(error == NULL, NULL); + + SmlBool final = FALSE; + SmlBool end = TRUE; + sml_fail_unless(smlParserEnd(parser, &final, &end, &error), NULL); + sml_fail_unless(error == NULL, NULL); + sml_fail_unless(final == TRUE, NULL); + sml_fail_unless(end == FALSE, NULL); + + smlParserFree(parser); +} +END_TEST + START_TEST (xml_parser_empty_data_element) { const char *data = "<SyncML><SyncHdr><VerProto>SyncML/1.2</VerProto><VerDTD>1.2</VerDTD><MsgID>1</MsgID><SessionID>1</SessionID><Target><LocURI>test</LocURI></Target><Source><LocURI>test</LocURI></Source></SyncHdr><SyncBody><Get><CmdID>2</CmdID><Item><Target><LocURI>./devinf12</LocURI></Target><Data/></Item></Get></SyncBody></SyncML>"; |