On 20/1/20 5:18 am, morganamilo wrote: > When releasing the handle, alpm tries to do some self clean up by > freeing the databases and transaction. > > However, databases refuse to unregister is there is an in progress > transaction. Causing them to leak if the handle is released while > a transaction is active. >
So... I've been sitting on this for a while. It does not seem the right answer to the issue to me. But I am not sure what the right answer is! Suggestions inline below. > diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c > index 1a378db9..02b8fc9b 100644 > --- a/lib/libalpm/alpm.c > +++ b/lib/libalpm/alpm.c > @@ -30,6 +30,7 @@ > #include "alpm_list.h" > #include "handle.h" > #include "log.h" > +#include "trans.h" > #include "util.h" > > /** \addtogroup alpm_interface Interface Functions > @@ -114,6 +115,8 @@ int SYMEXPORT alpm_release(alpm_handle_t *myhandle) > > CHECK_HANDLE(myhandle, return -1); > > + _alpm_trans_free(myhandle->trans); > + Could we do an alpm_trans_release() here if handle->trans is non-null and abort if that fails? > /* close local database */ > db = myhandle->db_local; > if(db) { > diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c > index e3193f40..1e42f4a8 100644 > --- a/lib/libalpm/handle.c > +++ b/lib/libalpm/handle.c > @@ -34,7 +34,6 @@ > #include "alpm_list.h" > #include "util.h" > #include "log.h" > -#include "trans.h" > #include "alpm.h" > #include "deps.h" > > @@ -74,7 +73,6 @@ void _alpm_handle_free(alpm_handle_t *handle) > #endif > > /* free memory */ > - _alpm_trans_free(handle->trans); This needs to stay. It is unexpected that _alpm_handle_free does not free its whole memory. > FREE(handle->root); > FREE(handle->dbpath); > FREE(handle->dbext); >