aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/shada.c
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-06-21 22:40:09 +0300
committerZyX <kp-pav@yandex.ru>2016-06-23 21:17:51 +0300
commit4b9d2caec21f2150e4b253d5201809d77a1e0912 (patch)
tree4b76273849dbebb1058e530423ebca6cee17873e /src/nvim/shada.c
parenta8f3849bc04cee5d7166138a28cb1e7bbf300803 (diff)
downloadrneovim-4b9d2caec21f2150e4b253d5201809d77a1e0912.tar.gz
rneovim-4b9d2caec21f2150e4b253d5201809d77a1e0912.tar.bz2
rneovim-4b9d2caec21f2150e4b253d5201809d77a1e0912.zip
shada: Do not forget to close ShaDa reader
Previously there was file descriptor leak, not detected by sanitizers. Now it is file descriptor leak with a small memory leak which is detected by ASAN what fails one of the tests (actually, “ShaDa support code leaves .tmp.z in-place when there is error in original ShaDa and it has .tmp.a … .tmp.x”, but error is reported at the next test because leaks are not detected until Neovim exit and Neovim exit happens when clear()/reset() is called which happens in before_each only).
Diffstat (limited to 'src/nvim/shada.c')
-rw-r--r--src/nvim/shada.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index b4695603b2..a833b958b9 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -2883,12 +2883,12 @@ int shada_write_file(const char *const file, bool nomerge)
char *const fname = shada_filename(file);
char *tempname = NULL;
- ShaDaWriteDef sd_writer = (ShaDaWriteDef) {
+ ShaDaWriteDef sd_writer = {
.write = &write_file,
.close = &close_sd_writer,
.error = NULL,
};
- ShaDaReadDef sd_reader;
+ ShaDaReadDef sd_reader = { .close = NULL };
if (!nomerge) {
int error;
@@ -2931,6 +2931,8 @@ shada_write_file_open: {}
fname);
xfree(fname);
xfree(tempname);
+ assert(sd_reader.close != NULL);
+ sd_reader.close(&sd_reader);
return FAIL;
} else {
(*wp)++;
@@ -2974,6 +2976,9 @@ shada_write_file_nomerge: {}
if (sd_writer.cookie == NULL) {
xfree(fname);
xfree(tempname);
+ if (sd_reader.close != NULL) {
+ sd_reader.close(&sd_reader);
+ }
return FAIL;
}