diff --git a/src/lib-sieve/storage/file/sieve-file-storage-active.c b/src/lib-sieve/storage/file/sieve-file-storage-active.c
index 9893c35e8cbb0e20d3a7172d6ec29494e8f1aadf..491d97981ff2b957115c6f61769b561adc7c98ba 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-active.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-active.c
@@ -24,6 +24,12 @@ sieve_file_storage_active_read_link(struct sieve_file_storage *fstorage,
 	const char *error = NULL;
 	int ret;
 
+	if (fstorage->is_file) {
+		/* The storage is in fact a single script file. There is no
+		   concept of an active script in this storage. */
+		return 0;
+	}
+
 	ret = t_readlink(fstorage->active_path, link_r, &error);
 	if (ret < 0) {
 		*link_r = NULL;
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index be3d7d4a872cdae4b482b8d333ad643e65ed2271..c6fa4773a309f86f4d8e63471da62d8628d9947e 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -294,7 +294,6 @@ sieve_file_storage_init_common(struct sieve_file_storage *fstorage,
 {
 	struct sieve_storage *storage = &fstorage->storage;
 	const char *tmp_dir, *link_path, *active_fname, *storage_dir, *error;
-	bool have_link = FALSE;
 	int ret;
 
 	i_assert(storage_path != NULL || active_path != NULL);
@@ -360,7 +359,7 @@ sieve_file_storage_init_common(struct sieve_file_storage *fstorage,
 	if (storage_path != NULL && *storage_path != '\0') {
 		e_debug(storage->event, "Using script storage path: %s",
 			storage_path);
-		have_link = TRUE;
+		fstorage->is_file = FALSE;
 	} else {
 		if ((storage->flags & SIEVE_STORAGE_FLAG_READWRITE) != 0) {
 			sieve_storage_set_critical(storage,
@@ -369,6 +368,7 @@ sieve_file_storage_init_common(struct sieve_file_storage *fstorage,
 		}
 
 		storage_path = active_path;
+		fstorage->is_file = TRUE;
 	}
 
 	i_assert(storage_path != NULL);
@@ -449,7 +449,7 @@ sieve_file_storage_init_common(struct sieve_file_storage *fstorage,
 	if (!exists && sieve_file_storage_stat(fstorage, storage_path) < 0)
 		return -1;
 
-	if (have_link) {
+	if (!fstorage->is_file) {
 		if (t_realpath(storage_path, &storage_path, &error) < 0) {
 			sieve_storage_set_critical(storage,
 				"Failed to normalize storage path (path=%s): %s",
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index d73a1911eaf8592a23a9376731b5c53018d5cc00..e07d8bff9f0199ddc37044a6584ef1cf90b5c9b9 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -40,6 +40,8 @@ struct sieve_file_storage {
 	gid_t file_create_gid;
 
 	time_t prev_mtime;
+
+	bool is_file:1;
 };
 
 const char *