patch 8.2.4229: possible crash when invoking timer callback fails
Problem: Possible crash when invoking timer callback fails.
Solution: Initialize the typval. Give an error for an empty callback.
(closes #9636)
This commit is contained in:
@ -4132,6 +4132,8 @@ enddef
|
|||||||
def Test_timer_start()
|
def Test_timer_start()
|
||||||
CheckDefAndScriptFailure(['timer_start("a", "1")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
|
CheckDefAndScriptFailure(['timer_start("a", "1")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
|
||||||
CheckDefAndScriptFailure(['timer_start(1, "1", [1])'], ['E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3'])
|
CheckDefAndScriptFailure(['timer_start(1, "1", [1])'], ['E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3'])
|
||||||
|
CheckDefExecAndScriptFailure(['timer_start(100, 0)'], 'E921:')
|
||||||
|
CheckDefExecAndScriptFailure(['timer_start(100, "")'], 'E921:')
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_timer_stop()
|
def Test_timer_stop()
|
||||||
|
|||||||
@ -481,6 +481,7 @@ timer_callback(timer_T *timer)
|
|||||||
argv[0].vval.v_number = (varnumber_T)timer->tr_id;
|
argv[0].vval.v_number = (varnumber_T)timer->tr_id;
|
||||||
argv[1].v_type = VAR_UNKNOWN;
|
argv[1].v_type = VAR_UNKNOWN;
|
||||||
|
|
||||||
|
rettv.v_type = VAR_UNKNOWN;
|
||||||
call_callback(&timer->tr_callback, -1, &rettv, 1, argv);
|
call_callback(&timer->tr_callback, -1, &rettv, 1, argv);
|
||||||
clear_tv(&rettv);
|
clear_tv(&rettv);
|
||||||
}
|
}
|
||||||
@ -854,6 +855,13 @@ f_timer_start(typval_T *argvars, typval_T *rettv)
|
|||||||
callback = get_callback(&argvars[1]);
|
callback = get_callback(&argvars[1]);
|
||||||
if (callback.cb_name == NULL)
|
if (callback.cb_name == NULL)
|
||||||
return;
|
return;
|
||||||
|
if (in_vim9script() && *callback.cb_name == NUL)
|
||||||
|
{
|
||||||
|
// empty callback is not useful for a timer
|
||||||
|
emsg(_(e_invalid_callback_argument));
|
||||||
|
free_callback(&callback);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
timer = create_timer(msec, repeat);
|
timer = create_timer(msec, repeat);
|
||||||
if (timer == NULL)
|
if (timer == NULL)
|
||||||
|
|||||||
@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
4229,
|
||||||
/**/
|
/**/
|
||||||
4228,
|
4228,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user