From 9bfbd739176ebc41e4ec93dcd21264b87640aa5b Mon Sep 17 00:00:00 2001
From: Nagy Gabor <ngaba@bibl.u-szeged.hu>
Date: Fri, 25 Jan 2008 21:52:35 +0100
Subject: Fix PM_ERR_CONFLICTING_DEPS handling in sync.c

* eliminate asymmetry (innerconflict vs. outerconflict)
* fix a memleak (in case of PM_ERR_MEMORY deps wasn't freed)
* fix wrong pmconflict_t duplication (*retconflict = *conflict)

Note: the new code introduces some code duplication which shall disappear by
fixing FS#7524.

Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu>
Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
---
 lib/libalpm/sync.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

(limited to 'lib/libalpm')

diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 27b5454f..efdfa203 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -475,9 +475,17 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
 				rsync = sync1;
 				sync = sync2;
 			} else {
+				_alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n"));
 				pm_errno = PM_ERR_CONFLICTING_DEPS;
 				ret = -1;
-				*data = deps;
+				if(data) {
+					pmconflict_t *newconflict = _alpm_conflict_dup(conflict);
+					if(newconflict) {
+						*data = alpm_list_add(*data, newconflict);
+					}
+				}
+				alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_conflict_free);
+				alpm_list_free(deps);
 				goto cleanup;
 			}
 
@@ -542,21 +550,14 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
 				sync->data = alpm_list_add(sync->data, local);
 			} else { /* abort */
 				_alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n"));
+				pm_errno = PM_ERR_CONFLICTING_DEPS;
+				ret = -1;
 				if(data) {
-					pmconflict_t *retconflict;
-					MALLOC(retconflict, sizeof(pmconflict_t), 0);
-					if(!retconflict) {
-						pm_errno = PM_ERR_MEMORY;
-						alpm_list_free_inner(*data, (alpm_list_fn_free)_alpm_conflict_free);
-						alpm_list_free(*data);
-						ret = -1;
-						goto cleanup;
+					pmconflict_t *newconflict = _alpm_conflict_dup(conflict);
+					if(newconflict) {
+						*data = alpm_list_add(*data, newconflict);
 					}
-					*retconflict = *conflict;
-					*data = alpm_list_add(*data, retconflict);
 				}
-				pm_errno = PM_ERR_CONFLICTING_DEPS;
-				ret = -1;
 				alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_conflict_free);
 				alpm_list_free(deps);
 				goto cleanup;
-- 
cgit v1.2.3-70-g09d2