]> granicus.if.org Git - libexpat/commitdiff
runtests.c: Add two test cases for/from issue #240
authorSebastian Pipping <sebastian@pipping.org>
Wed, 31 Jul 2019 18:41:24 +0000 (20:41 +0200)
committerSebastian Pipping <sebastian@pipping.org>
Sun, 4 Aug 2019 13:17:07 +0000 (15:17 +0200)
Many thanks to Rolf Ade (@pointsman)!

expat/Changes
expat/tests/runtests.c

index 5085865c8b8b9a2120f857152a350c82d1af5431..3c18c6acc029630475da306316a462bb134d2c7a 100644 (file)
@@ -23,6 +23,7 @@ Release x.x.x xxx xxx xx xxxx
             Khajapasha Mohammed
             Kishore Kunche
             Marco Maggi
+            Rolf Ade
             xantares
 
 Release 2.2.7 Wed June 19 2019
index 60710c8368083ff7ba98a2a1799c7b7627784bc0..c3f65bea4d7a2e994c2eda4f3eefc337856752f1 100644 (file)
@@ -7259,6 +7259,69 @@ START_TEST(test_misc_utf16le) {
 }
 END_TEST
 
+typedef struct {
+  XML_Parser parser;
+  int deep;
+} DataIssue240;
+
+static void
+start_element_issue_240(void *userData, const XML_Char *UNUSED_P(name),
+                        const XML_Char **UNUSED_P(atts)) {
+  DataIssue240 *mydata = (DataIssue240 *)userData;
+  mydata->deep++;
+}
+
+static void
+end_element_issue_240(void *userData, const XML_Char *UNUSED_P(name)) {
+  DataIssue240 *mydata = (DataIssue240 *)userData;
+  mydata->deep--;
+  if (mydata->deep == 0) {
+    XML_StopParser(mydata->parser, 0);
+  }
+}
+
+START_TEST(test_misc_stop_during_end_handler_issue_240_1) {
+  XML_Parser parser;
+  DataIssue240 *mydata;
+  enum XML_Status result;
+  const char *const doc1 = "<doc><e1/><e><foo/></e></doc>";
+
+  parser = XML_ParserCreate(NULL);
+  XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
+  mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
+  mydata->parser = parser;
+  mydata->deep = 0;
+  XML_SetUserData(parser, mydata);
+
+  result = XML_Parse(parser, doc1, (int)strlen(doc1), 1);
+  XML_ParserFree(parser);
+  free(mydata);
+  if (result != XML_STATUS_ERROR)
+    fail("Stopping the parser did not work as expected");
+}
+END_TEST
+
+START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
+  XML_Parser parser;
+  DataIssue240 *mydata;
+  enum XML_Status result;
+  const char *const doc2 = "<doc><elem/></doc>";
+
+  parser = XML_ParserCreate(NULL);
+  XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
+  mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
+  mydata->parser = parser;
+  mydata->deep = 0;
+  XML_SetUserData(parser, mydata);
+
+  result = XML_Parse(parser, doc2, (int)strlen(doc2), 1);
+  XML_ParserFree(parser);
+  free(mydata);
+  if (result != XML_STATUS_ERROR)
+    fail("Stopping the parser did not work as expected");
+}
+END_TEST
+
 static void
 alloc_setup(void) {
   XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
@@ -11170,6 +11233,8 @@ make_suite(void) {
   tcase_add_test(tc_misc, test_misc_features);
   tcase_add_test(tc_misc, test_misc_attribute_leak);
   tcase_add_test(tc_misc, test_misc_utf16le);
+  tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_1);
+  tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_2);
 
   suite_add_tcase(s, tc_alloc);
   tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);