]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Don't hide errors when iteration calls fs_set_error() multiple times
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 16 Apr 2020 17:17:11 +0000 (20:17 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 7 May 2020 12:40:40 +0000 (12:40 +0000)
The last error is returned by fs_iter_deinit(). The other errors are
logged directly.

src/lib-fs/fs-api.c

index 26d869031141a9a4325cbf019ab397e31bca25ea..01d1aa0a617b2b8a3af0b7b1ec5fe015e4d49f4a 100644 (file)
@@ -619,12 +619,17 @@ fs_set_verror(struct event *event, const char *fmt, va_list args)
                file->last_error = new_error;
        } else {
                i_assert(iter != NULL);
-               /* Preserve the first error for iters. That's the first
-                  thing that went wrong and broke the iteration. */
-               if (iter->last_error == NULL)
-                       iter->last_error = new_error;
-               else
-                       i_free(new_error);
+               if (iter->last_error != NULL &&
+                   strcmp(iter->last_error, new_error) == 0) {
+                       /* identical error - ignore */
+               } else if (iter->last_error != NULL) {
+                       /* multiple fs_set_error() calls before the iter
+                          finishes */
+                       e_error(iter->fs->event, "%s (overwriting error)",
+                               iter->last_error);
+               }
+               i_free(iter->last_error);
+               iter->last_error = new_error;
        }
 }