diff --git a/src/apk_database.h b/src/apk_database.h
index f613458488b15a0650555d2946c193aae1b7ef95..1f20b6046f907fe4d7da2889407e5dd8e55f7968 100644
--- a/src/apk_database.h
+++ b/src/apk_database.h
@@ -223,7 +223,7 @@ int apk_db_permanent(struct apk_database *db);
 int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *world);
 int apk_db_fire_triggers(struct apk_database *db);
 int apk_db_run_script(struct apk_database *db, char *fn, char **argv);
-void apk_db_update_directory_permissions(struct apk_database *db);
+int apk_db_update_directory_permissions(struct apk_database *db);
 static inline time_t apk_db_url_since(struct apk_database *db, time_t since) {
 	return apk_ctx_since(db->ctx, since);
 }
diff --git a/src/apk_package.h b/src/apk_package.h
index d54e9cf941237278721da600308cfb0e4a013085..3bdef8bd44169d2585f083ba845b682ce945e95c 100644
--- a/src/apk_package.h
+++ b/src/apk_package.h
@@ -153,8 +153,8 @@ int apk_ipkg_assign_script(struct apk_installed_package *ipkg, unsigned int type
 int apk_ipkg_add_script(struct apk_installed_package *ipkg,
 			struct apk_istream *is,
 			unsigned int type, unsigned int size);
-void apk_ipkg_run_script(struct apk_installed_package *ipkg, struct apk_database *db,
-			 unsigned int type, char **argv);
+int apk_ipkg_run_script(struct apk_installed_package *ipkg, struct apk_database *db,
+			unsigned int type, char **argv);
 
 struct apk_package *apk_pkg_parse_index_entry(struct apk_database *db, apk_blob_t entry);
 int apk_pkg_write_index_header(struct apk_package *pkg, struct apk_ostream *os);
diff --git a/src/commit.c b/src/commit.c
index 0e9c916250d09ac9376b8c63f3fec46c5bcc716d..2bc458b9adb5f6b0524735d0aa9797df38b1dd01 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -206,13 +206,14 @@ static int cmp_upgrade(struct apk_change *change)
 	return 0;
 }
 
-static void run_triggers(struct apk_database *db, struct apk_changeset *changeset)
+static int run_triggers(struct apk_database *db, struct apk_changeset *changeset)
 {
 	struct apk_change *change;
 	struct apk_installed_package *ipkg;
+	int errors = 1;
 
 	if (apk_db_fire_triggers(db) == 0)
-		return;
+		return 0;
 
 	foreach_array_item(change, changeset->changes) {
 		struct apk_package *pkg = change->new_pkg;
@@ -223,10 +224,11 @@ static void run_triggers(struct apk_database *db, struct apk_changeset *changese
 			continue;
 
 		*apk_string_array_add(&ipkg->pending_triggers) = NULL;
-		apk_ipkg_run_script(ipkg, db, APK_SCRIPT_TRIGGER,
-				    ipkg->pending_triggers->item);
+		errors += apk_ipkg_run_script(ipkg, db, APK_SCRIPT_TRIGGER,
+					      ipkg->pending_triggers->item) != 0;
 		apk_string_array_free(&ipkg->pending_triggers);
 	}
+	return errors;
 }
 
 #define PRE_COMMIT_HOOK		0
@@ -384,8 +386,8 @@ int apk_solver_commit_changeset(struct apk_database *db,
 	apk_print_progress(&prog.prog, prog.total.bytes + prog.total.packages,
 			   prog.total.bytes + prog.total.packages);
 
-	apk_db_update_directory_permissions(db);
-	run_triggers(db, changeset);
+	errors += apk_db_update_directory_permissions(db) != 0;
+	errors += run_triggers(db, changeset);
 
 all_done:
 	apk_dependency_array_copy(&db->world, world);
diff --git a/src/database.c b/src/database.c
index 4bcefd84c4115e5e17f98c81d6fd52cc3a31b343..8a7f43888606e911e9773991d5da125d10ce78f4 100644
--- a/src/database.c
+++ b/src/database.c
@@ -2077,7 +2077,7 @@ static int update_permissions(apk_hash_item item, void *pctx)
 	return 0;
 }
 
-void apk_db_update_directory_permissions(struct apk_database *db)
+int apk_db_update_directory_permissions(struct apk_database *db)
 {
 	struct apk_out *out = &db->ctx->out;
 	struct apk_installed_package *ipkg;
@@ -2103,6 +2103,7 @@ void apk_db_update_directory_permissions(struct apk_database *db)
 	}
 	apk_hash_foreach(&db->installed.dirs, update_permissions, &ctx);
 	if (ctx.errors) apk_err(out, "%d errors updating directory permissions", ctx.errors);
+	return ctx.errors;
 }
 
 int apk_db_cache_active(struct apk_database *db)
diff --git a/src/package.c b/src/package.c
index 6628e99ad3e101470e3ef8df2512c97a2c26cd91..53bcef1f29f360ef36b3b68f7ae6539cf8893e4c 100644
--- a/src/package.c
+++ b/src/package.c
@@ -791,9 +791,9 @@ static inline int make_device_tree(struct apk_database *db)
 }
 #endif
 
-void apk_ipkg_run_script(struct apk_installed_package *ipkg,
-			 struct apk_database *db,
-			 unsigned int type, char **argv)
+int apk_ipkg_run_script(struct apk_installed_package *ipkg,
+			struct apk_database *db,
+			unsigned int type, char **argv)
 {
 	// script_exec_dir is the directory to which the script is extracted,
 	// executed from, and removed. It needs to not be 'noexec' mounted, and
@@ -806,10 +806,10 @@ void apk_ipkg_run_script(struct apk_installed_package *ipkg,
 	struct apk_out *out = &db->ctx->out;
 	struct apk_package *pkg = ipkg->pkg;
 	char fn[PATH_MAX];
-	int fd, root_fd = db->root_fd;
+	int fd, root_fd = db->root_fd, ret = 0;
 
 	if (type >= APK_SCRIPT_MAX || ipkg->script[type].ptr == NULL)
-		return;
+		return 0;
 
 	argv[0] = (char *) apk_script_types[type];
 
@@ -818,7 +818,7 @@ void apk_ipkg_run_script(struct apk_installed_package *ipkg,
 		apk_script_types[type]);
 
 	if ((db->ctx->flags & (APK_NO_SCRIPTS | APK_SIMULATE)) != 0)
-		return;
+		return 0;
 
 	if (!db->script_dirs_checked) {
 		if (apk_make_dirs(root_fd, "tmp", 01777, 0) <0 ||
@@ -855,8 +855,10 @@ err_log:
 	apk_err(out, "%s: failed to execute: %s", &fn[strlen(script_exec_dir)+1], apk_error_str(errno));
 err:
 	ipkg->broken_script = 1;
+	ret = 1;
 cleanup:
 	unlinkat(root_fd, fn, 0);
+	return ret;
 }
 
 static int parse_index_line(void *ctx, apk_blob_t line)