[pacman-dev] [PATCH] libalpm: free trans before databases

Allan McRae allan at archlinux.org
Fri Jan 31 03:28:30 UTC 2020


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);
> 


More information about the pacman-dev mailing list