From e5605e92924b0055da19905d761919e3011c29a3 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 14 Apr 2015 11:26:05 +0200 Subject: [PATCH] Fix crash in schema parser Closes #71. Includes testcase. --- lib/pc_schema.c | 7 ------- pgsql/Makefile | 2 +- pgsql/expected/schema.out | 8 ++++++++ pgsql/sql/schema.sql | 2 ++ 4 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 pgsql/expected/schema.out create mode 100644 pgsql/sql/schema.sql diff --git a/lib/pc_schema.c b/lib/pc_schema.c index b800c17..98e459f 100644 --- a/lib/pc_schema.c +++ b/lib/pc_schema.c @@ -402,7 +402,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) xml_doc = xmlReadMemory(xml_ptr, xml_size, NULL, NULL, 0); if ( ! xml_doc ) { - xmlCleanupParser(); pcwarn("unable to parse schema XML"); return PC_FAILURE; } @@ -417,7 +416,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) if( ! xpath_ctx ) { xmlFreeDoc(xml_doc); - xmlCleanupParser(); pcwarn("unable to create new XPath context to read schema XML"); return PC_FAILURE; } @@ -432,7 +430,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) { xmlXPathFreeContext(xpath_ctx); xmlFreeDoc(xml_doc); - xmlCleanupParser(); pcwarn("unable to evaluate xpath expression \"%s\" against schema XML", xpath_str); return PC_FAILURE; } @@ -512,7 +509,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) xmlXPathFreeObject(xpath_obj); xmlXPathFreeContext(xpath_ctx); xmlFreeDoc(xml_doc); - xmlCleanupParser(); pc_schema_free(s); pcwarn("schema dimension at position \"%d\" is declared twice", d->position + 1, ndims); return PC_FAILURE; @@ -532,7 +528,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) xmlXPathFreeObject(xpath_obj); xmlXPathFreeContext(xpath_ctx); xmlFreeDoc(xml_doc); - xmlCleanupParser(); pc_schema_free(s); pcwarn("schema dimension states position \"%d\", but number of XML dimensions is \"%d\"", d->position + 1, ndims); return PC_FAILURE; @@ -554,7 +549,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) { xmlXPathFreeContext(xpath_ctx); xmlFreeDoc(xml_doc); - xmlCleanupParser(); pcwarn("unable to evaluate xpath expression \"%s\" against schema XML", xpath_metadata_str); return PC_FAILURE; } @@ -594,7 +588,6 @@ pc_schema_from_xml(const char *xml_str, PCSCHEMA **schema) xmlXPathFreeContext(xpath_ctx); xmlFreeDoc(xml_doc); - xmlCleanupParser(); return PC_SUCCESS; } diff --git a/pgsql/Makefile b/pgsql/Makefile index 7b5492a..44c40cc 100644 --- a/pgsql/Makefile +++ b/pgsql/Makefile @@ -24,7 +24,7 @@ DATA_built = \ $(EXTENSION)--$(EXTVERSION).sql \ $(UPGRADES) -REGRESS = pointcloud pointcloud_columns +REGRESS = pointcloud pointcloud_columns schema ifneq ($(GHT_LDFLAGS),) REGRESS += pointcloud-ght diff --git a/pgsql/expected/schema.out b/pgsql/expected/schema.out new file mode 100644 index 0000000..3b1a726 --- /dev/null +++ b/pgsql/expected/schema.out @@ -0,0 +1,8 @@ +-- See https://github.com/pgpointcloud/pointcloud/issues/71 +select '#71', PC_SchemaIsValid(''::xml::text); +WARNING: unable to evaluate xpath expression "/pc:PointCloudSchema/pc:dimension" against schema XML + ?column? | pc_schemaisvalid +----------+------------------ + #71 | f +(1 row) + diff --git a/pgsql/sql/schema.sql b/pgsql/sql/schema.sql new file mode 100644 index 0000000..34a1133 --- /dev/null +++ b/pgsql/sql/schema.sql @@ -0,0 +1,2 @@ +-- See https://github.com/pgpointcloud/pointcloud/issues/71 +select '#71', PC_SchemaIsValid(''::xml::text);