From 4fa6d4d7af39f992ccb1bb9d6f88908c8a414bf6 Mon Sep 17 00:00:00 2001 From: Tomas Mlcoch Date: Wed, 28 Mar 2012 10:10:01 +0200 Subject: [PATCH] Better error handling in load_metadata parser callbacks --- src/load_metadata.c | 213 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 128 insertions(+), 85 deletions(-) diff --git a/src/load_metadata.c b/src/load_metadata.c index ed504f8..127ee41 100644 --- a/src/load_metadata.c +++ b/src/load_metadata.c @@ -69,6 +69,8 @@ struct ParserData { Package *pkg; ParserContext context; TextElement last_elem; + + gboolean error; }; @@ -112,6 +114,12 @@ void pri_start_handler(void *data, const char *el, const char **attr) { // } else if (!strcmp(el, "rpm:entry")) { + if (!pkg) { + ppd->error = TRUE; + g_critical(MODULE"%s: Have but pkg object doesn't exist!", __func__); + return; + } + Dependency *dependency; dependency = dependency_new(); @@ -160,10 +168,12 @@ void pri_start_handler(void *data, const char *el, const char **attr) { } else if (!strcmp(el, "package")) { // Check sanity if (ppd->context != METADATA) { + ppd->error = TRUE; g_critical(MODULE"%s: Package element: Bad XML context!", __func__); return; } if (ppd->pkg) { + ppd->error = TRUE; g_critical(MODULE"%s: Package element: Pkg pointer is not NULL", __func__); return; } @@ -181,6 +191,12 @@ void pri_start_handler(void *data, const char *el, const char **attr) { // } else if (!strcmp(el, "version")) { + if (!pkg) { + ppd->error = TRUE; + g_critical(MODULE"%s: Have but pkg object doesn't exist!", __func__); + return; + } + for (i = 0; attr[i]; i += 2) { if (!strcmp(attr[i], "epoch")) { pkg->epoch = g_string_chunk_insert(pkg->chunk, attr[i+1]); @@ -197,6 +213,12 @@ void pri_start_handler(void *data, const char *el, const char **attr) { } else if (!strcmp(el, "checksum")) { ppd->last_elem = CHECKSUM_ELEM; + if (!pkg) { + ppd->error = TRUE; + g_critical(MODULE"%s: Have but pkg object doesn't exist!", __func__); + return; + } + for (i = 0; attr[i]; i += 2) { if (!strcmp(attr[i], "type")) { pkg->checksum_type = g_string_chunk_insert(pkg->chunk, attr[i+1]); @@ -221,6 +243,12 @@ void pri_start_handler(void *data, const char *el, const char **attr) { //