]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: iteration - Fix crash when overwriting iteration error
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 23 Oct 2020 11:54:22 +0000 (14:54 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 23 Oct 2020 11:54:22 +0000 (14:54 +0300)
Can't use fs_file_path() because file is NULL. Instead, add the path to
struct fs_iter directly so it can be used in the error.

Broken by eaaf40ca4e8994824abff89fc617c3cc737d83a5

src/lib-fs/fs-api-private.h
src/lib-fs/fs-api.c

index 7d4c0b5e90ef2f5fc8ed23734428af30bd849c33..9231349f67236e74cf33ab72299a072bcbc2afc1 100644 (file)
@@ -155,6 +155,7 @@ struct fs_iter {
 
        struct fs *fs;
        struct event *event;
+       char *path;
        enum fs_iter_flags flags;
        struct timeval start_time;
        char *last_error;
index 12bce8a686799e70ca4368ee63807f946d7e1b7d..44ce7e625fdbf2c62b05e4a083d63f61e82f1303 100644 (file)
@@ -635,7 +635,7 @@ fs_set_verror(struct event *event, const char *fmt, va_list args)
                        /* multiple fs_set_error() calls before the iter
                           finishes */
                        e_error(iter->fs->event, "%s (overwriting error for file %s)",
-                               iter->last_error, fs_file_path(file));
+                               iter->last_error, iter->path);
                }
                i_free(iter->last_error);
                iter->last_error = new_error;
@@ -1246,6 +1246,7 @@ fs_iter_init_with_event(struct fs *fs, struct event *event,
                iter = fs->v.iter_alloc();
                iter->fs = fs;
                iter->flags = flags;
+               iter->path = i_strdup(path);
                iter->event = fs_create_event(fs, event);
                event_set_ptr(iter->event, FS_EVENT_FIELD_FS, fs);
                event_set_ptr(iter->event, FS_EVENT_FIELD_ITER, iter);
@@ -1281,6 +1282,7 @@ int fs_iter_deinit(struct fs_iter **_iter, const char **error_r)
        if (ret < 0)
                *error_r = t_strdup(iter->last_error);
        i_free(iter->last_error);
+       i_free(iter->path);
        i_free(iter);
        event_unref(&event);
        return ret;