diff options
| author | ZyX <kp-pav@yandex.ru> | 2016-06-21 22:40:09 +0300 | 
|---|---|---|
| committer | ZyX <kp-pav@yandex.ru> | 2016-06-23 21:17:51 +0300 | 
| commit | 4b9d2caec21f2150e4b253d5201809d77a1e0912 (patch) | |
| tree | 4b76273849dbebb1058e530423ebca6cee17873e /src | |
| parent | a8f3849bc04cee5d7166138a28cb1e7bbf300803 (diff) | |
| download | rneovim-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')
| -rw-r--r-- | src/nvim/file.c | 2 | ||||
| -rw-r--r-- | src/nvim/shada.c | 9 | 
2 files changed, 8 insertions, 3 deletions
diff --git a/src/nvim/file.c b/src/nvim/file.c index 35c659f7fd..2fb0e1cd87 100644 --- a/src/nvim/file.c +++ b/src/nvim/file.c @@ -310,7 +310,7 @@ ptrdiff_t file_skip(FileDescriptor *const fp, const size_t size)        break;      }      read_bytes += (size_t)new_read_bytes; -  } while (read_bytes < size && !fp->eof); +  } while (read_bytes < size && !file_eof(fp));    return (ptrdiff_t)read_bytes;  } 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;    }  | 
