Blame libgupnp-av/xsd-data.c

Packit 712bc5
/*
Packit 712bc5
 * Copyright (C) 2012 Intel Corporation
Packit 712bc5
 *
Packit 712bc5
 * Authors: Krzesimir Nowak <krnowak@openismus.com>
Packit 712bc5
 *
Packit 712bc5
 * This library is free software; you can redistribute it and/or
Packit 712bc5
 * modify it under the terms of the GNU Library General Public
Packit 712bc5
 * License as published by the Free Software Foundation; either
Packit 712bc5
 * version 2 of the License, or (at your option) any later version.
Packit 712bc5
 *
Packit 712bc5
 * This library is distributed in the hope that it will be useful,
Packit 712bc5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 712bc5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 712bc5
 * Library General Public License for more details.
Packit 712bc5
 *
Packit 712bc5
 * You should have received a copy of the GNU Library General Public
Packit 712bc5
 * License along with this library; if not, write to the
Packit 712bc5
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit 712bc5
 * Boston, MA 02110-1301, USA.
Packit 712bc5
 */
Packit 712bc5
Packit 712bc5
#include <libxml/parser.h>
Packit 712bc5
#include <libxml/xmlschemas.h>
Packit 712bc5
Packit 712bc5
#include "xsd-data.h"
Packit 712bc5
Packit 712bc5
struct _XSDData {
Packit 712bc5
        xmlSchemaPtr schema;
Packit 712bc5
        xmlSchemaValidCtxtPtr valid_context;
Packit 712bc5
};
Packit 712bc5
Packit 712bc5
XSDData *
Packit 712bc5
xsd_data_new (const gchar *xsd_file)
Packit 712bc5
{
Packit 712bc5
        XSDData *xsd_data = g_slice_new0 (XSDData);
Packit 712bc5
        gboolean failed = TRUE;
Packit 712bc5
        xmlSchemaParserCtxtPtr context = xmlSchemaNewParserCtxt (xsd_file);
Packit 712bc5
Packit 712bc5
        if (context == NULL)
Packit 712bc5
                /* unable to create a parser context for the schema */
Packit 712bc5
                goto out;
Packit 712bc5
        xsd_data->schema = xmlSchemaParse (context);
Packit 712bc5
        if (xsd_data->schema == NULL)
Packit 712bc5
                /* the schema itself is not valid */
Packit 712bc5
                goto out;
Packit 712bc5
        xsd_data->valid_context = xmlSchemaNewValidCtxt (xsd_data->schema);
Packit 712bc5
        if (xsd_data->valid_context == NULL)
Packit 712bc5
                /* unable to create a validation context for the schema */
Packit 712bc5
                goto out;
Packit 712bc5
        failed = FALSE;
Packit 712bc5
 out:
Packit 712bc5
        if (context != NULL)
Packit 712bc5
                xmlSchemaFreeParserCtxt (context);
Packit 712bc5
        if (failed) {
Packit 712bc5
                xsd_data_free (xsd_data);
Packit 712bc5
                xsd_data = NULL;
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        return xsd_data;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
void
Packit 712bc5
xsd_data_free (XSDData *xsd_data)
Packit 712bc5
{
Packit 712bc5
        if (xsd_data == NULL)
Packit 712bc5
                return;
Packit 712bc5
        if (xsd_data->valid_context != NULL)
Packit 712bc5
                xmlSchemaFreeValidCtxt (xsd_data->valid_context);
Packit 712bc5
        if (xsd_data->schema != NULL)
Packit 712bc5
                xmlSchemaFree (xsd_data->schema);
Packit 712bc5
        g_slice_free (XSDData, xsd_data);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
gboolean
Packit 712bc5
xsd_data_validate_doc (XSDData *xsd_data,
Packit 712bc5
                       xmlDoc  *doc)
Packit 712bc5
{
Packit 712bc5
        static xmlSAXHandler empty_handler = {
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                XML_SAX2_MAGIC,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL,
Packit 712bc5
                NULL
Packit 712bc5
        };
Packit 712bc5
        xmlChar *dump = NULL;
Packit 712bc5
        int size = 0;
Packit 712bc5
        xmlParserInputBufferPtr buffer = NULL;
Packit 712bc5
        gboolean result = FALSE;
Packit 712bc5
Packit 712bc5
        if (xsd_data == NULL)
Packit 712bc5
                return TRUE;
Packit 712bc5
Packit 712bc5
        xmlDocDumpMemory (doc, &dump, &size);
Packit 712bc5
        if (dump == NULL)
Packit 712bc5
                goto out;
Packit 712bc5
        g_debug ("Doc dump:\n%s", dump);
Packit 712bc5
        buffer = xmlParserInputBufferCreateMem ((char *) dump,
Packit 712bc5
                                                   size,
Packit 712bc5
                                                   XML_CHAR_ENCODING_NONE);
Packit 712bc5
        if (buffer == NULL)
Packit 712bc5
                goto out;
Packit 712bc5
        if (!xmlSchemaValidateStream (xsd_data->valid_context,
Packit 712bc5
                                      buffer,
Packit 712bc5
                                      XML_CHAR_ENCODING_NONE,
Packit 712bc5
                                      &empty_handler,
Packit 712bc5
                                      NULL))
Packit 712bc5
                result = TRUE;
Packit 712bc5
 out:
Packit 712bc5
        /* Commented out, because it crashes because of double free. I
Packit 712bc5
         * suppose that it is freed by xmlSchemaValidateStream.
Packit 712bc5
         */
Packit 712bc5
        /*
Packit 712bc5
        if (buffer)
Packit 712bc5
                xmlFreeParserInputBuffer (buffer);
Packit 712bc5
        */
Packit 712bc5
        if (dump != NULL)
Packit 712bc5
                xmlFree (dump);
Packit 712bc5
        return result;
Packit 712bc5
}