diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index daa193e9ccea0e9ae1ad951cf287a2125001a141..4dce5729d4668cf2eb0e359d061b6f35d983e858 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -377,15 +377,10 @@ sieve_run(struct sieve_binary *sbin, struct sieve_result *result,
  * Reading/writing sieve binaries
  */
 
-struct sieve_binary *
-sieve_load(struct sieve_instance *svinst, const char *bin_path,
-	   enum sieve_error *error_code_r)
+int sieve_load(struct sieve_instance *svinst, const char *bin_path,
+	       struct sieve_binary **sbin_r, enum sieve_error *error_code_r)
 {
-	struct sieve_binary *sbin;
-
-	if (sieve_binary_open(svinst, bin_path, NULL, &sbin, error_code_r) < 0)
-		return NULL;
-	return sbin;
+	return sieve_binary_open(svinst, bin_path, NULL, sbin_r, error_code_r);
 }
 
 static int
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 3d20d0e82ab629c9a81ecf0b5ac692662e6b81a5..cd4ff7b6de80f1816c5406153dce085271a19e57 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -57,9 +57,8 @@ int sieve_compile(struct sieve_instance *svinst, const char *script_location,
  */
 
 /* Loads the sieve binary indicated by the provided path. */
-struct sieve_binary *
-sieve_load(struct sieve_instance *svinst, const char *bin_path,
-	   enum sieve_error *error_code_r);
+int sieve_load(struct sieve_instance *svinst, const char *bin_path,
+	       struct sieve_binary **sbin_r, enum sieve_error *error_code_r);
 /* First tries to open the binary version of the specified script and if it does
    not exist or if it contains errors, the script is (re-)compiled. Note that
    errors in the bytecode are caught only at runtime.
diff --git a/src/sieve-tools/sieve-dump.c b/src/sieve-tools/sieve-dump.c
index 7a532618953be17a1beb74537c05d8f25e75d175..d197afd6e81ed153b47a9e0bb7e8efbabcd28a34 100644
--- a/src/sieve-tools/sieve-dump.c
+++ b/src/sieve-tools/sieve-dump.c
@@ -80,15 +80,13 @@ int main(int argc, char **argv)
         sieve_enable_debug_extension(svinst);
 
 	/* Dump binary */
-	sbin = sieve_load(svinst, binfile, NULL);
-	if (sbin != NULL) {
-		sieve_tool_dump_binary_to(sbin,
-					  (outfile == NULL ? "-" : outfile),
-					  hexdump);
-		sieve_close(&sbin);
-	} else {
+	if (sieve_load(svinst, binfile, &sbin, NULL) < 0) {
 		i_error("failed to load binary: %s", binfile);
 		exit_status = EXIT_FAILURE;
+	} else {
+		sieve_tool_dump_binary_to(sbin, outfile == NULL ? "-" : outfile,
+					  hexdump);
+		sieve_close(&sbin);
 	}
 
 	sieve_tool_deinit(&sieve_tool);
diff --git a/src/testsuite/testsuite-binary.c b/src/testsuite/testsuite-binary.c
index 011db85dc8094b03d6a6f82591b278917223482a..d1fec9e058dbc9cf6d197a37d5b60935d4a91666 100644
--- a/src/testsuite/testsuite-binary.c
+++ b/src/testsuite/testsuite-binary.c
@@ -75,8 +75,11 @@ bool testsuite_binary_save(struct sieve_binary *sbin, const char *name)
 struct sieve_binary *testsuite_binary_load(const char *name)
 {
 	struct sieve_instance *svinst = testsuite_sieve_instance;
+	struct sieve_binary *sbin;
 
-	return sieve_load(svinst,
-			  t_strdup_printf("%s/%s", testsuite_binary_tmp,
-					  sieve_binfile_from_name(name)), NULL);
+	if (sieve_load(svinst, t_strdup_printf("%s/%s", testsuite_binary_tmp,
+					       sieve_binfile_from_name(name)),
+		       &sbin, NULL) < 0)
+		return NULL;
+	return sbin;
 }