Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Update parser code for multiple names support.
Vsevolod Stakhov committed 12 years ago
commit 38a981733a3a5c4b6c93fa0e82a9b3aac73d0cbd
parent d17e090
1 file changed +15 -22
modified src/audit.c
@@ -227,6 +227,9 @@ audit_expand_entries(struct audit_entry *entry, struct audit_entry *head)
	struct audit_pkgname_entry *pcur;

	/* Set the name of the current entry */
+
	if (entry->names == NULL)
+
		return;
+

	entry->pkgname = entry->names->pkgname;

	if (entry->names->next == NULL) {
@@ -277,7 +280,7 @@ vulnxml_start_element(void *data, const char *element, const char **attributes)
{
	struct vulnxml_userdata *ud = (struct vulnxml_userdata *)data;
	struct audit_versions *vers;
-
	struct audit_entry *tmp_entry;
+
	struct audit_pkgname_entry *name_entry;
	int i;

	if (ud->state == VULNXML_PARSE_INIT && strcasecmp(element, "vuln") == 0) {
@@ -298,23 +301,16 @@ vulnxml_start_element(void *data, const char *element, const char **attributes)
	}
	else if (ud->state == VULNXML_PARSE_VULN && strcasecmp(element, "package") == 0) {
		ud->state = VULNXML_PARSE_PACKAGE;
-
		if (ud->npkg++ > 0) {
-
			/* Need to copy entry */
-
			tmp_entry = ud->cur_entry;
-
			LL_PREPEND(ud->h, tmp_entry);
-
			ud->cur_entry = calloc(1, sizeof(struct audit_entry));
-
			if (ud->cur_entry == NULL)
-
				err(1, "calloc(audit_entry)");
-
			ud->cur_entry->id = strdup(tmp_entry->id);
-
			ud->cur_entry->desc = strdup(tmp_entry->desc);
-
			ud->cur_entry->next = ud->h;
-
		}
	}
	else if (ud->state == VULNXML_PARSE_VULN && strcasecmp(element, "cvename") == 0) {
		ud->state = VULNXML_PARSE_CVE;
	}
	else if (ud->state == VULNXML_PARSE_PACKAGE && strcasecmp(element, "name") == 0) {
		ud->state = VULNXML_PARSE_PACKAGE_NAME;
+
		name_entry = calloc(1, sizeof(struct audit_pkgname_entry));
+
		if (name_entry == NULL)
+
			err(1, "calloc(audit_pkgname_entry)");
+
		LL_PREPEND(ud->cur_entry->names, name_entry);
	}
	else if (ud->state == VULNXML_PARSE_PACKAGE && strcasecmp(element, "range") == 0) {
		ud->state = VULNXML_PARSE_RANGE;
@@ -352,11 +348,13 @@ vulnxml_end_element(void *data, const char *element)
	struct vulnxml_userdata *ud = (struct vulnxml_userdata *)data;

	if (ud->state == VULNXML_PARSE_VULN && strcasecmp(element, "vuln") == 0) {
+
		audit_expand_entries(ud->cur_entry, ud->h);
		if (ud->cur_entry->pkgname != NULL) {
			LL_PREPEND(ud->h, ud->cur_entry);
		}
		else {
			/* Ignore canceled entries */
+
			/* XXX: can memory leak here */
			if (ud->cur_entry->id != NULL)
				free(ud->cur_entry->id);
			free(ud->cur_entry);
@@ -402,7 +400,7 @@ vulnxml_handle_data(void *data, const char *content, int length)
	struct audit_versions *vers;
	struct audit_cve *cve;
	struct audit_entry *entry;
-
	int range_type = -1, i;
+
	int range_type = -1;

	switch(ud->state) {
	case VULNXML_PARSE_INIT:
@@ -415,7 +413,7 @@ vulnxml_handle_data(void *data, const char *content, int length)
		ud->cur_entry->desc = strndup(content, length);
		break;
	case VULNXML_PARSE_PACKAGE_NAME:
-
		ud->cur_entry->pkgname = strndup(content, length);
+
		ud->cur_entry->names->pkgname = strndup(content, length);
		break;
	case VULNXML_PARSE_RANGE_GT:
		range_type = GT;
@@ -434,13 +432,9 @@ vulnxml_handle_data(void *data, const char *content, int length)
		break;
	case VULNXML_PARSE_CVE:
		entry = ud->cur_entry;
-
		for (i = 0; i < ud->npkg; i ++, entry = entry->next) {
-
			if (entry == NULL)
-
				break;
-
			cve = malloc(sizeof(struct audit_cve));
-
			cve->cvename = strndup(content, length);
-
			LL_PREPEND(entry->cve, cve);
-
		}
+
		cve = malloc(sizeof(struct audit_cve));
+
		cve->cvename = strndup(content, length);
+
		LL_PREPEND(entry->cve, cve);
		break;
	}

@@ -486,7 +480,6 @@ parse_db_vulnxml(const char *path, struct audit_entry **h)

	ud.cur_entry = NULL;
	ud.h = *h;
-
	ud.npkg = 0;
	ud.range_num = 0;
	ud.state = VULNXML_PARSE_INIT;