[pacman-dev] lock file may be left behind when a signal arrives while in cleanup

Message ID 20200812053607.1626325-1-lilydjwg@gmail.com
State Superseded, archived
Headers show
Series [pacman-dev] lock file may be left behind when a signal arrives while in cleanup | expand

Commit Message

lilydjwg Aug. 12, 2020, 5:36 a.m. UTC
When a SIGINT or SIGHUP arrives before alpm_unlock (in alpm_release) but
after remove_soft_interrupt_handler, the lock file will be left behind.

Signed-off-by: lilydjwg <lilydjwg@gmail.com>
---
 src/pacman/pacman.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Andrew Gregory Aug. 12, 2020, 2:53 p.m. UTC | #1
On 08/12/20 at 01:36pm, lilydjwg wrote:
> When a SIGINT or SIGHUP arrives before alpm_unlock (in alpm_release) but
> after remove_soft_interrupt_handler, the lock file will be left behind.
> 
> Signed-off-by: lilydjwg <lilydjwg@gmail.com>
> ---
>  src/pacman/pacman.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
> index fefd3fa4..2d2e41d2 100644
> --- a/src/pacman/pacman.c
> +++ b/src/pacman/pacman.c
> @@ -287,7 +287,6 @@ static void setuseragent(void)
>   */
>  static void cleanup(int ret)
>  {
> -	remove_soft_interrupt_handler();
>  	if(config) {
>  		/* free alpm library resources */
>  		if(config->handle && alpm_release(config->handle) == -1) {
> @@ -297,6 +296,7 @@ static void cleanup(int ret)
>  		config_free(config);
>  		config = NULL;
>  	}

The signal handler uses config->handle; this will segfault if a signal
arrives between alpm_release and here.

> +	remove_soft_interrupt_handler();
>  
>  	/* free memory */
>  	FREELIST(pm_targets);
> -- 
> 2.28.0

Patch

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index fefd3fa4..2d2e41d2 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -287,7 +287,6 @@  static void setuseragent(void)
  */
 static void cleanup(int ret)
 {
-	remove_soft_interrupt_handler();
 	if(config) {
 		/* free alpm library resources */
 		if(config->handle && alpm_release(config->handle) == -1) {
@@ -297,6 +296,7 @@  static void cleanup(int ret)
 		config_free(config);
 		config = NULL;
 	}
+	remove_soft_interrupt_handler();
 
 	/* free memory */
 	FREELIST(pm_targets);