From d34241d194ea35df773d481edf89dffb8782aa39 Mon Sep 17 00:00:00 2001
From: Alexey Makhalov <amakhalov@vmware.com>
Date: Thu, 10 Nov 2016 17:58:54 -0800
Subject: [PATCH 3/6] Add N:M mapping support. Invert key-values.

---
 src/core.c |  8 ++++----
 src/core.h |  5 +++--
 src/main.c | 28 +++++++++++++++++++++-------
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/src/core.c b/src/core.c
index 727ab8c..8f809a3 100644
--- a/src/core.c
+++ b/src/core.c
@@ -148,10 +148,10 @@ struct cve_entry_t *cve_db_get_cve(CveDB *self, char *id)
         return t;
 }
 
-GList *cve_db_get_issues_frac_compare(CveDB *self, char *product, char *version)
+GList *cve_db_get_issues_frac_compare(CveDB *self, char *product, char *version, GList *in)
 {
         int rc = 0;
-        GList *list = NULL;
+        GList *list = in;
         int ret = 0;
 
         if (!self || !self->db) {
@@ -187,10 +187,10 @@ GList *cve_db_get_issues_frac_compare(CveDB *self, char *product, char *version)
         return list;
 }
 
-GList *cve_db_get_issues(CveDB *self,  char *product, char *version)
+GList *cve_db_get_issues(CveDB *self,  char *product, char *version, GList *in)
 {
         int rc = 0;
-        GList *list = NULL;
+        GList *list = in;
 
         if (!self || !self->db) {
                 return NULL;
diff --git a/src/core.h b/src/core.h
index 48e295d..7a18b7d 100644
--- a/src/core.h
+++ b/src/core.h
@@ -84,8 +84,9 @@ struct cve_entry_t *cve_db_get_cve(CveDB *db, char *id);
  *
  * @return A newly allocated list of strings if found, otherwise NULL
  */
-GList *cve_db_get_issues(CveDB *db, char *product, char *version);
-GList *cve_db_get_issues_frac_compare(CveDB *db, char *product, char *version);
+GList *cve_db_get_issues(CveDB *db, char *product, char *version, GList *in);
+GList *cve_db_get_issues_frac_compare(CveDB *db, char *product, char *version,
+				      GList *in);
 
 /**
  * Util to free a struct cve_entry_t
diff --git a/src/main.c b/src/main.c
index 5bb16c9..5ee6adb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -92,6 +92,8 @@ static void cve_add_package_internal(struct source_package_t *pkg)
         GList *issues = NULL, *em = NULL;
         gchar *cur_id = NULL;
         gchar *q = NULL;
+	int i = 0;
+	gchar **t;
         CvePlugin *pkg_plugin = self_priv->pkg_plugin;
 
         if (!pkg) {
@@ -107,11 +109,24 @@ static void cve_add_package_internal(struct source_package_t *pkg)
                 q = g_hash_table_lookup(self->mapping, pkg->name);
         }
 
-        if (use_frac_compare) {
-                issues = cve_db_get_issues_frac_compare(self->cve_db, q ? q : pkg->name, pkg->version);
-        } else {
-                issues = cve_db_get_issues(self->cve_db, q ? q : pkg->name, pkg->version);
-        }
+	if (!q)
+		q = pkg->name;
+
+	t = g_strsplit(q, " ", 10);
+	while (t[i]) {
+		if (strlen(t[i]) == 0) {
+			i++;
+			continue;
+		}
+		if (use_frac_compare)
+			issues = cve_db_get_issues_frac_compare(self->cve_db,
+					t[i], pkg->version, issues);
+		else
+			issues = cve_db_get_issues(self->cve_db, t[i],
+					pkg->version, issues);
+		i++;
+	}
+	g_strfreev(t);
 
         if (!issues) {
                 goto insert;
@@ -665,8 +680,7 @@ int main(int argc, char **argv)
                                 fprintf(stderr, "Unable to load mapping string: %s\n", error->message);
                                 goto cleanup;
                         }
-                        /* Reverse the mapping */
-                        g_hash_table_insert(self->mapping, g_strdup(val), g_strdup(*c));
+                        g_hash_table_insert(self->mapping, g_strdup(*c), g_strdup(val));
                         ++c;
                 }
         }
-- 
2.10.1