[libvirt] [PATCH 2/2] virschematest: Make sure that validator is initialized

Michal Privoznik mprivozn at redhat.com
Fri Aug 12 12:59:09 UTC 2016


It may happen that a developer wants to run just a specific
subset of tests:

tests $ VIR_TEST_RANGE=22 ../run ./virschematest

This now fails miserably:

    ==6840== Invalid read of size 8
    ==6840==    at 0x4F397C0: virXMLValidatorValidate (virxml.c:1216)
    ==6840==    by 0x402B72: testSchemaFile (virschematest.c:53)
    ==6840==    by 0x403737: virTestRun (testutils.c:180)
    ==6840==    by 0x402CF5: testSchemaDir (virschematest.c:98)
    ==6840==    by 0x402EB1: testSchemaDirs (virschematest.c:131)
    ==6840==    by 0x40314D: mymain (virschematest.c:194)
    ==6840==    by 0x4051AF: virTestMain (testutils.c:982)
    ==6840==    by 0x4035A9: main (virschematest.c:217)
    ==6840==  Address 0x10 is not stack'd, malloc'd or (recently) free'd

Problem is, we are trying to do two types of tests here: validate
RNG schema itself, and validate XML files against RNG schemas.
And the latter tries to re-use a resource allocated in the
former. Therefore if the former is skipped (due to
VIR_TEST_RANGE) we have to allocate the resource manually.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 tests/virschematest.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/tests/virschematest.c b/tests/virschematest.c
index c9cc314..1b55dad 100644
--- a/tests/virschematest.c
+++ b/tests/virschematest.c
@@ -38,6 +38,14 @@ struct testSchemaData {
     const char *xml_path;
 };
 
+static char *
+testGetSchemaPath(const char *schema)
+{
+    char *schema_path;
+    ignore_value(virAsprintf(&schema_path, "%s/docs/schemas/%s",
+                             abs_topsrcdir, schema));
+    return schema_path;
+}
 
 static int
 testSchemaFile(const void *args)
@@ -120,6 +128,20 @@ testSchemaDirs(const char *schema, virXMLValidatorPtr validator, ...)
     int ret = 0;
     char *dir_path = NULL;
     const char *dir;
+    bool freeValidator = false;
+
+    if (!validator) {
+        char *schema_path = testGetSchemaPath(schema);
+
+        if (!schema_path ||
+            !(validator = virXMLValidatorInit(schema_path))) {
+            VIR_FREE(schema_path);
+            goto cleanup;
+        }
+
+        VIR_FREE(schema_path);
+        freeValidator = true;
+    }
 
     va_start(args, validator);
 
@@ -134,6 +156,8 @@ testSchemaDirs(const char *schema, virXMLValidatorPtr validator, ...)
     }
 
  cleanup:
+    if (freeValidator)
+        virXMLValidatorFree(validator);
     VIR_FREE(dir_path);
     va_end(args);
     return ret;
@@ -152,8 +176,7 @@ testSchemaGrammar(const void *opaque)
     char *schema_path;
     int ret = -1;
 
-    if (virAsprintf(&schema_path, "%s/docs/schemas/%s",
-                    abs_topsrcdir, data->schema) < 0)
+    if (!(schema_path = testGetSchemaPath(data->schema)))
         return -1;
 
     if (!(data->validator = virXMLValidatorInit(schema_path)))
-- 
2.8.4




More information about the libvir-list mailing list