From f06ce33a2404bf80f20a1297f2a105db64db2cb0 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Mon, 30 Sep 2024 22:53:44 +0200 Subject: [PATCH] lib-sieve: storage: file: Refactor sieve_file_script_sequence_next() --- .../storage/file/sieve-file-script-sequence.c | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/lib-sieve/storage/file/sieve-file-script-sequence.c b/src/lib-sieve/storage/file/sieve-file-script-sequence.c index 993ddac80..8cbc682ec 100644 --- a/src/lib-sieve/storage/file/sieve-file-script-sequence.c +++ b/src/lib-sieve/storage/file/sieve-file-script-sequence.c @@ -202,36 +202,45 @@ int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq, { struct sieve_file_script_sequence *fseq = container_of(sseq, struct sieve_file_script_sequence, seq); + struct sieve_storage *storage = sseq->storage; struct sieve_file_storage *fstorage = - container_of(sseq->storage, struct sieve_file_storage, storage); - struct sieve_file_script *fscript; + container_of(storage, struct sieve_file_storage, storage); + struct sieve_file_script *fscript = NULL; const char *const *files; unsigned int count; - fscript = NULL; if (fseq->storage_is_file) { - if (fseq->index++ < 1) { - fscript = sieve_file_script_open_from_name( - fstorage, NULL); - } + i_assert(fseq->index <= 1); + if (fseq->index++ > 0) + return 0; + + fscript = sieve_file_script_open_from_name(fstorage, NULL); } else { files = array_get(&fseq->script_files, &count); - while (fseq->index < count) { + i_assert(fseq->index <= count); + if (fseq->index == count) + return 0; + + for (;;) { fscript = sieve_file_script_open_from_filename( fstorage, files[fseq->index++], NULL); if (fscript != NULL) break; if (sseq->storage->error_code != SIEVE_ERROR_NOT_FOUND) break; - sieve_storage_clear_error(sseq->storage); + sieve_storage_clear_error(storage); + if (fseq->index >= count) + return 0; } } if (fscript == NULL) { + if (storage->error_code == SIEVE_ERROR_NOT_FOUND) + return 0; if (error_code_r != NULL) - *error_code_r = sseq->storage->error_code; - return (error_code_r == SIEVE_ERROR_NONE ? 0 : -1); + *error_code_r = storage->error_code; + return -1; } *script_r = &fscript->script; return 1; -- GitLab