Mercurial > vim
diff src/filepath.c @ 19930:80e663e91e1b v8.2.0521
patch 8.2.0521: crash when reading a blob fails
Commit: https://github.com/vim/vim/commit/15352dc6ec43fd50cc3be4f4fd1ad74d5619da20
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Apr 6 21:12:42 2020 +0200
patch 8.2.0521: crash when reading a blob fails
Problem: Crash when reading a blob fails.
Solution: Avoid keeping a pointer to a freed blob object. (Dominique Pelle,
closes #5890) Adjust error messages.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 06 Apr 2020 21:15:37 +0200 |
parents | 435726a03481 |
children | ce463840c826 |
line wrap: on
line diff
--- a/src/filepath.c +++ b/src/filepath.c @@ -1452,20 +1452,18 @@ f_readfile(typval_T *argvars, typval_T * maxline = (long)tv_get_number(&argvars[2]); } - if (blob) - { - if (rettv_blob_alloc(rettv) == FAIL) - return; - } - else - { - if (rettv_list_alloc(rettv) == FAIL) - return; - } + if ((blob ? rettv_blob_alloc(rettv) : rettv_list_alloc(rettv)) == FAIL) + return; // Always open the file in binary mode, library functions have a mind of // their own about CR-LF conversion. fname = tv_get_string(&argvars[0]); + + if (mch_isdir(fname)) + { + semsg(_(e_isadir2), fname); + return; + } if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL) { semsg(_(e_notopen), *fname == NUL ? (char_u *)_("<empty>") : fname); @@ -1476,8 +1474,10 @@ f_readfile(typval_T *argvars, typval_T * { if (read_blob(fd, rettv->vval.v_blob) == FAIL) { - emsg("cannot read file"); + semsg(_(e_notread), fname); + // An empty blob is returned on error. blob_free(rettv->vval.v_blob); + rettv->vval.v_blob = NULL; } fclose(fd); return;