On 07/01/14 02:52, Andrew Gregory wrote: > If the user opted not to remove the unresolvable packages from the > transaction, the list wasn't saved to the transaction to be free'd in > trans_release. >
It is not removed from trans->add. See below. > Signed-off-by: Andrew Gregory <[email protected]> > --- > lib/libalpm/sync.c | 17 +++++++---------- > 1 file changed, 7 insertions(+), 10 deletions(-) > > diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c > index 4ae01ac..b6061db 100644 > --- a/lib/libalpm/sync.c > +++ b/lib/libalpm/sync.c > @@ -370,7 +370,6 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t > **data) > { > alpm_list_t *i, *j; > alpm_list_t *deps = NULL; > - alpm_list_t *unresolvable = NULL; > size_t from_sync = 0; > int ret = 0; > alpm_trans_t *trans = handle->trans; > @@ -427,7 +426,11 @@ int _alpm_sync_prepare(alpm_handle_t *handle, > alpm_list_t **data) > alpm_pkg_t *pkg = i->data; > if(_alpm_resolvedeps(handle, localpkgs, pkg, trans->add, > &resolved, remove, data) == -1) > { > - unresolvable = alpm_list_add(unresolvable, pkg); > + /* Unresolvable packages will be removed from > the target list; set > + * these aside in the transaction as a list we > won't operate on. If we > + * free them before the end of the transaction, > we may kill pointers > + * the frontend holds to package objects. */ > + trans->unresolvable = > alpm_list_add(trans->unresolvable, pkg); > } > /* Else, [resolved] now additionally contains [pkg] and > all of its > dependencies not already on the list */ > @@ -437,10 +440,10 @@ int _alpm_sync_prepare(alpm_handle_t *handle, > alpm_list_t **data) > > /* If there were unresolvable top-level packages, prompt the > user to > see if they'd like to ignore them rather than failing the > sync */ > - if(unresolvable != NULL) { > + if(trans->unresolvable != NULL) { > int remove_unresolvable = 0; > alpm_errno_t saved_err = handle->pm_errno; > - QUESTION(handle, ALPM_QUESTION_REMOVE_PKGS, > unresolvable, > + QUESTION(handle, ALPM_QUESTION_REMOVE_PKGS, > trans->unresolvable, > NULL, NULL, &remove_unresolvable); > if(remove_unresolvable) { > /* User wants to remove the unresolvable > packages from the > @@ -470,12 +473,6 @@ int _alpm_sync_prepare(alpm_handle_t *handle, > alpm_list_t **data) > } > } > > - /* Unresolvable packages will be removed from the target list; > set these > - * aside in the transaction as a list we won't operate on. If > we free them > - * before the end of the transaction, we may kill pointers the > frontend > - * holds to package objects. */ > - trans->unresolvable = unresolvable; > - > alpm_list_free(trans->add); > trans->add = resolved; Here... when the unresolved packages are added to trans->unresolvable, the trans->add list is updated to remove them. What am I missing here? Allan
