0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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.
This commit is contained in:
Bram Moolenaar
2020-04-06 21:12:42 +02:00
parent 6c307dcd55
commit 15352dc6ec
3 changed files with 16 additions and 11 deletions

View File

@@ -1452,20 +1452,18 @@ f_readfile(typval_T *argvars, typval_T *rettv)
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 *rettv)
{
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;

View File

@@ -257,6 +257,9 @@ func Test_blob_read_write()
let br = readfile('Xblob', 'B')
call assert_equal(b, br)
call delete('Xblob')
" This was crashing when calling readfile() with a directory.
call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
endfunc
" filter() item in blob

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
521,
/**/
520,
/**/