static int xml_start(struct archive_read *,
const char *, struct xmlattr_list *);
static void xml_end(void *, const char *);
-static void xml_data(void *, const char *, size_t);
+static int xml_data(void *, const char *, size_t);
static int xml_parse_file_flags(struct xar *, const char *);
static int xml_parse_file_ext2(struct xar *, const char *);
#if defined(HAVE_LIBXML_XMLREADER_H)
return memcmp(data, known, len);
}
-static void
+static int
xml_data(void *userData, const char *s, size_t len)
{
struct archive_read *a;
break;
}
if (xar->file == NULL)
- return;
+ return (ARCHIVE_OK);
switch (xar->xmlsts) {
case FILE_NAME:
case UNKNOWN:
break;
}
+
+ return (ARCHIVE_OK);
}
/*
break;
case XML_READER_TYPE_TEXT:
value = (const char *)xmlTextReaderConstValue(reader);
- xml_data(a, value, strlen(value));
+ r = xml_data(a, value, strlen(value));
+ if (r != ARCHIVE_OK) {
+ xmlFreeTextReader(reader);
+ xmlCleanupParser();
+ return (r);
+ }
break;
case XML_READER_TYPE_SIGNIFICANT_WHITESPACE:
default:
{
struct expat_userData *ud = (struct expat_userData *)userData;
- xml_data(ud->archive, s, (size_t)len);
+ if (ud->state != ARCHIVE_OK)
+ return;
+
+ ud->state = xml_data(ud->archive, s, (size_t)len);
}
static int
goto out;
}
- xml_data(a, as.s, archive_strlen(&as));
+ r = xml_data(a, as.s, archive_strlen(&as));
+ if (r != ARCHIVE_OK) {
+ /* xml_data sets an appropriate error */
+ goto out;
+ }
archive_string_free(&as);
case XmlNodeType_None: