summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorOlivier Brunel <jjk@jjacky.com>2015-12-15 09:14:37 +0100
committerAllan McRae <allan@archlinux.org>2015-12-15 11:33:26 +0100
commiteadf38960776e36df75d6c3caf3a35b976acc56c (patch)
tree2453b678046bf068ab1472ae5c3147502f9ea502 /lib
parent8454daa7feef14b660561f2434448d0b4ac0576d (diff)
downloadpacman-eadf38960776e36df75d6c3caf3a35b976acc56c.tar.gz
pacman-eadf38960776e36df75d6c3caf3a35b976acc56c.tar.xz
alpm: Abort ASAP on failure in pre-transaction hooks
There is no need to run any/remaining pre-transaction hooks as soon as a failure has occured, which will lead to aborting the transaction. So if an error occured during the first phase (reading directories/parsing files), or as soon as a hook flagged abort_on_fail does fail, we stop processing them and return. (For post-transaction hooks, all hooks are run regardless since there's no aborting.) Signed-off-by: Olivier Brunel <jjk@jjacky.com> Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/libalpm/hook.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/libalpm/hook.c b/lib/libalpm/hook.c
index fd251fa9..b5ed17d6 100644
--- a/lib/libalpm/hook.c
+++ b/lib/libalpm/hook.c
@@ -712,6 +712,10 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
closedir(d);
}
+ if(ret != 0 && when == ALPM_HOOK_PRE_TRANSACTION) {
+ goto cleanup;
+ }
+
hooks = alpm_list_msort(hooks, alpm_list_count(hooks),
(alpm_list_fn_cmp)_alpm_hook_cmp);
@@ -745,6 +749,10 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
hook_event.type = ALPM_EVENT_HOOK_RUN_DONE;
EVENT(handle, &hook_event);
+
+ if(ret != 0 && when == ALPM_HOOK_PRE_TRANSACTION) {
+ break;
+ }
}
alpm_list_free(hooks_triggered);