/*
 * uri.c: a libFuzzer target to test the URI module.
 *
 * See Copyright for the status of this software.
 */

#include <libxml/uri.h>
#include "fuzz.h"

int
LLVMFuzzerTestOneInput(const char *data, size_t size) {
    xmlURIPtr uri;
    char *str[2] = { NULL, NULL };
    size_t numStrings;

    if (size > 10000)
        return(0);

    numStrings = xmlFuzzExtractStrings(data, size, str, 2);

    uri = xmlParseURI(str[0]);
    xmlFree(xmlSaveUri(uri));
    xmlFreeURI(uri);

    uri = xmlParseURIRaw(str[0], 1);
    xmlFree(xmlSaveUri(uri));
    xmlFreeURI(uri);

    xmlFree(xmlURIUnescapeString(str[0], -1, NULL));
    xmlFree(xmlURIEscape(BAD_CAST str[0]));
    xmlFree(xmlCanonicPath(BAD_CAST str[0]));
    xmlFree(xmlPathToURI(BAD_CAST str[0]));

    if (numStrings >= 2) {
        xmlFree(xmlBuildURI(BAD_CAST str[1], BAD_CAST str[0]));
        xmlFree(xmlBuildRelativeURI(BAD_CAST str[1], BAD_CAST str[0]));
        xmlFree(xmlURIEscapeStr(BAD_CAST str[0], BAD_CAST str[1]));
    }

    /* Modifies string, so must come last. */
    xmlNormalizeURIPath(str[0]);

    xmlFree(str[0]);
    xmlFree(str[1]);

    return 0;
}