]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fs-randomfail: Fixed assert-crash in fs_write_stream_abort_error()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 8 Sep 2016 23:48:45 +0000 (02:48 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 9 Sep 2016 11:31:24 +0000 (14:31 +0300)
src/lib-fs/fs-randomfail.c

index 4c90d34e4baa524d1c2d6ed4903152c3d9bf7c9e..c4c51b20e3cfb11f99625e7799e772a5fde06560 100644 (file)
@@ -25,7 +25,7 @@ struct randomfail_fs {
 
 struct randomfail_fs_file {
        struct fs_file file;
-       struct fs_file *super, *super_read;
+       struct fs_file *super_read;
        struct istream *input;
        bool op_pending[FS_OP_COUNT];
 
@@ -218,7 +218,7 @@ fs_randomfail_file_init(struct fs *_fs, const char *path,
        file = i_new(struct randomfail_fs_file, 1);
        file->file.fs = _fs;
        file->file.path = i_strdup(path);
-       file->super = fs_file_init(_fs->parent, path, mode | flags);
+       file->file.parent = fs_file_init(_fs->parent, path, mode | flags);
        return &file->file;
 }
 
@@ -226,35 +226,11 @@ static void fs_randomfail_file_deinit(struct fs_file *_file)
 {
        struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
 
-       fs_file_deinit(&file->super);
+       fs_file_deinit(&file->file.parent);
        i_free(file->file.path);
        i_free(file);
 }
 
-static void fs_randomfail_file_close(struct fs_file *_file)
-{
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
-
-       fs_file_close(file->super);
-}
-
-static const char *fs_randomfail_file_get_path(struct fs_file *_file)
-{
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
-
-       return fs_file_path(file->super);
-}
-
-static void
-fs_randomfail_set_async_callback(struct fs_file *_file,
-                                fs_file_async_callback_t *callback,
-                                void *context)
-{
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
-
-       fs_file_set_async_callback(file->super, callback, context);
-}
-
 static bool fs_random_fail(struct fs *_fs, int divider, enum fs_op op)
 {
        struct randomfail_fs *fs = (struct randomfail_fs *)_fs;
@@ -303,22 +279,6 @@ fs_random_fail_range(struct fs *_fs, enum fs_op op, uoff_t *offset_r)
        return TRUE;
 }
 
-static int fs_randomfail_wait_async(struct fs *_fs)
-{
-       if (fs_random_fail(_fs, 1, FS_OP_WAIT))
-               return -1;
-       return fs_wait_async(_fs->parent);
-}
-
-static void
-fs_randomfail_set_metadata(struct fs_file *_file, const char *key,
-                          const char *value)
-{
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
-
-       fs_set_metadata(file->super, key, value);
-}
-
 static int
 fs_randomfail_get_metadata(struct fs_file *_file,
                           const ARRAY_TYPE(fs_metadata) **metadata_r)
@@ -328,17 +288,15 @@ fs_randomfail_get_metadata(struct fs_file *_file,
 
        if (fs_file_random_fail_begin(file, FS_OP_METADATA))
                return -1;
-       ret = fs_get_metadata(file->super, metadata_r);
+       ret = fs_get_metadata(_file->parent, metadata_r);
        return fs_file_random_fail_end(file, ret, FS_OP_METADATA);
 }
 
 static bool fs_randomfail_prefetch(struct fs_file *_file, uoff_t length)
 {
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
-
        if (fs_random_fail(_file->fs, 1, FS_OP_PREFETCH))
                return TRUE;
-       return fs_prefetch(file->super, length);
+       return fs_prefetch(_file->parent, length);
 }
 
 static ssize_t fs_randomfail_read(struct fs_file *_file, void *buf, size_t size)
@@ -348,18 +306,17 @@ static ssize_t fs_randomfail_read(struct fs_file *_file, void *buf, size_t size)
 
        if (fs_file_random_fail_begin(file, FS_OP_READ))
                return -1;
-       ret = fs_read(file->super, buf, size);
+       ret = fs_read(_file->parent, buf, size);
        return fs_file_random_fail_end(file, ret, FS_OP_READ);
 }
 
 static struct istream *
 fs_randomfail_read_stream(struct fs_file *_file, size_t max_buffer_size)
 {
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
        struct istream *input, *input2;
        uoff_t offset;
 
-       input = fs_read_stream(file->super, max_buffer_size);
+       input = fs_read_stream(_file->parent, max_buffer_size);
        if (!fs_random_fail_range(_file->fs, FS_OP_READ, &offset))
                return input;
        input2 = i_stream_create_failure_at(input, offset, RANDOMFAIL_ERROR);
@@ -374,7 +331,7 @@ static int fs_randomfail_write(struct fs_file *_file, const void *data, size_t s
 
        if (fs_file_random_fail_begin(file, FS_OP_WRITE))
                return -1;
-       ret = fs_write(file->super, data, size);
+       ret = fs_write(_file->parent, data, size);
        return fs_file_random_fail_end(file, ret, FS_OP_EXISTS);
 }
 
@@ -385,7 +342,7 @@ static void fs_randomfail_write_stream(struct fs_file *_file)
 
        i_assert(_file->output == NULL);
 
-       file->super_output = fs_write_stream(file->super);
+       file->super_output = fs_write_stream(_file->parent);
        if (!fs_random_fail_range(_file->fs, FS_OP_WRITE, &offset))
                _file->output = file->super_output;
        else {
@@ -408,21 +365,19 @@ static int fs_randomfail_write_stream_finish(struct fs_file *_file, bool success
                        return -1;
                }
                if (!fs_random_fail(_file->fs, 1, FS_OP_WRITE)) {
-                       fs_write_stream_abort_error(file->super, &file->super_output, RANDOMFAIL_ERROR);
+                       fs_write_stream_abort_error(_file->parent, &file->super_output, RANDOMFAIL_ERROR);
                        return -1;
                }
        }
-       return fs_write_stream_finish(file->super, &file->super_output);
+       return fs_write_stream_finish(_file->parent, &file->super_output);
 }
 
 static int
 fs_randomfail_lock(struct fs_file *_file, unsigned int secs, struct fs_lock **lock_r)
 {
-       struct randomfail_fs_file *file = (struct randomfail_fs_file *)_file;
-
        if (fs_random_fail(_file->fs, 1, FS_OP_LOCK))
                return -1;
-       return fs_lock(file->super, secs, lock_r);
+       return fs_lock(_file->parent, secs, lock_r);
 }
 
 static void fs_randomfail_unlock(struct fs_lock *_lock ATTR_UNUSED)
@@ -437,7 +392,7 @@ static int fs_randomfail_exists(struct fs_file *_file)
 
        if (fs_file_random_fail_begin(file, FS_OP_EXISTS))
                return -1;
-       ret = fs_exists(file->super);
+       ret = fs_exists(_file->parent);
        return fs_file_random_fail_end(file, ret, FS_OP_EXISTS);
 }
 
@@ -448,7 +403,7 @@ static int fs_randomfail_stat(struct fs_file *_file, struct stat *st_r)
 
        if (fs_file_random_fail_begin(file, FS_OP_STAT))
                return -1;
-       ret = fs_stat(file->super, st_r);
+       ret = fs_stat(_file->parent, st_r);
        return fs_file_random_fail_end(file, ret, FS_OP_STAT);
 }
 
@@ -459,13 +414,12 @@ static int fs_randomfail_get_nlinks(struct fs_file *_file, nlink_t *nlinks_r)
 
        if (fs_file_random_fail_begin(file, FS_OP_STAT))
                return -1;
-       ret = fs_get_nlinks(file->super, nlinks_r);
+       ret = fs_get_nlinks(_file->parent, nlinks_r);
        return fs_file_random_fail_end(file, ret, FS_OP_STAT);
 }
 
 static int fs_randomfail_copy(struct fs_file *_src, struct fs_file *_dest)
 {
-       struct randomfail_fs_file *src = (struct randomfail_fs_file *)_src;
        struct randomfail_fs_file *dest = (struct randomfail_fs_file *)_dest;
        int ret;
 
@@ -473,21 +427,20 @@ static int fs_randomfail_copy(struct fs_file *_src, struct fs_file *_dest)
                return -1;
 
        if (_src != NULL)
-               ret = fs_copy(src->super, dest->super);
+               ret = fs_copy(_src->parent, _dest->parent);
        else
-               ret = fs_copy_finish_async(dest->super);
+               ret = fs_copy_finish_async(_dest->parent);
        return fs_file_random_fail_end(dest, ret, FS_OP_COPY);
 }
 
 static int fs_randomfail_rename(struct fs_file *_src, struct fs_file *_dest)
 {
-       struct randomfail_fs_file *src = (struct randomfail_fs_file *)_src;
        struct randomfail_fs_file *dest = (struct randomfail_fs_file *)_dest;
        int ret;
 
        if (fs_file_random_fail_begin(dest, FS_OP_RENAME))
                return -1;
-       ret = fs_rename(src->super, dest->super);
+       ret = fs_rename(_src->parent, _dest->parent);
        return fs_file_random_fail_end(dest, ret, FS_OP_RENAME);
 }
 
@@ -498,7 +451,7 @@ static int fs_randomfail_delete(struct fs_file *_file)
 
        if (fs_file_random_fail_begin(file, FS_OP_DELETE))
                return -1;
-       ret = fs_delete(file->super);
+       ret = fs_delete(_file->parent);
        return fs_file_random_fail_end(file, ret, FS_OP_DELETE);
 }
 
@@ -561,11 +514,11 @@ const struct fs fs_class_randomfail = {
                fs_randomfail_get_properties,
                fs_randomfail_file_init,
                fs_randomfail_file_deinit,
-               fs_randomfail_file_close,
-               fs_randomfail_file_get_path,
-               fs_randomfail_set_async_callback,
-               fs_randomfail_wait_async,
-               fs_randomfail_set_metadata,
+               fs_wrapper_file_close,
+               fs_wrapper_file_get_path,
+               fs_wrapper_set_async_callback,
+               fs_wrapper_wait_async,
+               fs_wrapper_set_metadata,
                fs_randomfail_get_metadata,
                fs_randomfail_prefetch,
                fs_randomfail_read,