diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index 22c21b5fb35bb912ff03f7815e87fd811ff0d6f7..299dd23a50fb278d3619e4d5df010bde72cfe884 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -573,7 +573,7 @@ int sieve_script_binary_save_default(struct sieve_script *script ATTR_UNUSED,
 	    str_begins_with(path, storage->bin_path) &&
 	    sieve_storage_setup_bin_path(
 		script->storage, mkdir_get_executable_mode(save_mode)) < 0) {
-		*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
+		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 706533b94d771ace6696743021e382d04c6f92b1..dee0b127c988e671a119922ce9b70942ee72807d 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -624,19 +624,22 @@ int sieve_storage_setup_bin_path(struct sieve_storage *storage, mode_t mode)
 	const char *bin_path = storage->bin_path;
 	struct stat st;
 
-	if (bin_path == NULL)
+	if (bin_path == NULL) {
+		sieve_storage_set_critical(
+			storage, "script_bin_path not configured for storage");
 		return -1;
+	}
 
 	if (stat(bin_path, &st) == 0)
 		return 0;
 
 	if (errno == EACCES) {
-		e_error(storage->event,
+		sieve_storage_set_critical(storage,
 			"Failed to setup directory for binaries: "
 			"%s", eacces_error_get("stat", bin_path));
 		return -1;
 	} else if (errno != ENOENT) {
-		e_error(storage->event,
+		sieve_storage_set_critical(storage,
 			"Failed to setup directory for binaries: "
 			"stat(%s) failed: %m",
 			bin_path);
@@ -653,16 +656,16 @@ int sieve_storage_setup_bin_path(struct sieve_storage *storage, mode_t mode)
 	case EEXIST:
 		return 0;
 	case ENOENT:
-		e_error(storage->event,
+		sieve_storage_set_critical(storage,
 			"Directory for binaries was deleted while it was being created");
 		break;
 	case EACCES:
-		e_error(storage->event,
+		sieve_storage_set_critical(storage,
 			"%s", eacces_error_get_creating("mkdir_parents_chgrp",
 							bin_path));
 		break;
 	default:
-		e_error(storage->event,
+		sieve_storage_set_critical(storage,
 			"mkdir_parents_chgrp(%s) failed: %m", bin_path);
 		break;
 	}