static void check_all(const char *provider) { check_weird_bug(provider); verify_element(provider, 1, -4, 4, 0, 2, 4, 4, -8); verify_group(provider, 4, 2); if (no_ref) printf("WARNING: no verification is done.\n"); else printf("verification passed.\n"); }
static char * thex_download_handle_xml(struct thex_download *ctx, const char *data, size_t size) { xnode_t *hashtree = NULL, *node; char *hashtree_id = NULL; bool success = FALSE; vxml_parser_t *vp; vxml_error_t e; if (size <= 0) { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH XML record has no data"); } goto finish; } /* * Parse the XML record. */ vp = vxml_parser_make("THEX record", VXML_O_STRIP_BLANKS); vxml_parser_add_data(vp, data, size); e = vxml_parse_tree(vp, &hashtree); vxml_parser_free(vp); if (VXML_E_OK != e) { if (GNET_PROPERTY(tigertree_debug)) { g_warning("TTH cannot parse XML record: %s", vxml_strerror(e)); dump_hex(stderr, "XML record", data, size); } goto finish; } if (0 != strcmp("hashtree", xnode_element_name(hashtree))) { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH couldn't find root hashtree element"); } goto finish; } node = find_element_by_name(hashtree, "file"); if (node) { if (!verify_element(node, "size", filesize_to_string(ctx->filesize))) goto finish; if (!verify_element(node, "segmentsize", THEX_SEGMENT_SIZE)) goto finish; } else { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH couldn't find hashtree/file element"); } goto finish; } node = find_element_by_name(hashtree, "digest"); if (node) { if (!verify_element(node, "algorithm", THEX_HASH_ALGO)) goto finish; if (!verify_element(node, "outputsize", THEX_HASH_SIZE)) goto finish; } else { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH couldn't find hashtree/digest element"); } goto finish; } node = find_element_by_name(hashtree, "serializedtree"); if (node) { const char *value; int error; if (!verify_element(node, "type", THEX_TREE_TYPE)) goto finish; value = xnode_prop_get(node, "uri"); if (NULL == value) { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH couldn't find property \"uri\" of node \"%s\"", xnode_element_name(node)); } goto finish; } hashtree_id = h_strdup(value); value = xnode_prop_get(node, "depth"); if (NULL == value) { if (GNET_PROPERTY(tigertree_debug)) { g_debug("TTH couldn't find property \"depth\" of node \"%s\"", xnode_element_name(node)); } goto finish; } ctx->depth = parse_uint16(value, NULL, 10, &error); error |= ctx->depth > tt_full_depth(ctx->filesize); if (error) { ctx->depth = 0; g_warning("TTH bad value for \"depth\" of node \"%s\": \"%s\"", xnode_element_name(node), value); } if (error) goto finish; } else { if (GNET_PROPERTY(tigertree_debug)) g_debug("TTH couldn't find hashtree/serializedtree element"); goto finish; } success = TRUE; finish: if (!success) HFREE_NULL(hashtree_id); xnode_tree_free_null(&hashtree); return hashtree_id; }