diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-12-22 21:40:33 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-12-22 21:40:33 +0000 |
commit | 28fbbeac7046f33db350294908eecb380042d553 (patch) | |
tree | 99340cd3f303cfc63059b616e5f6e2b5dcee117f /src/typval.c | |
parent | f2f0bddf303e37d4d532ca22e2d53179c20b1d19 (diff) | |
download | vim-git-28fbbeac7046f33db350294908eecb380042d553.tar.gz |
patch 8.2.3877: function does not abort after a type error in comparev8.2.3877
Problem: Function does not abort after a type error in compare
Solution: Check getting number fails. (closes #9384)
Diffstat (limited to 'src/typval.c')
-rw-r--r-- | src/typval.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/typval.c b/src/typval.c index 9e9b05f99..358e04e67 100644 --- a/src/typval.c +++ b/src/typval.c @@ -297,8 +297,8 @@ tv_get_bool_chk(typval_T *varp, int *denote) } #if defined(FEAT_FLOAT) || defined(PROTO) - float_T -tv_get_float(typval_T *varp) + static float_T +tv_get_float_chk(typval_T *varp, int *error) { switch (varp->v_type) { @@ -347,8 +347,16 @@ tv_get_float(typval_T *varp) internal_error_no_abort("tv_get_float(UNKNOWN)"); break; } + if (error != NULL) + *error = TRUE; return 0; } + + float_T +tv_get_float(typval_T *varp) +{ + return tv_get_float_chk(varp, NULL); +} #endif /* @@ -1185,9 +1193,16 @@ typval_compare( && type != EXPR_MATCH && type != EXPR_NOMATCH) { float_T f1, f2; + int error = FALSE; - f1 = tv_get_float(tv1); - f2 = tv_get_float(tv2); + f1 = tv_get_float_chk(tv1, &error); + if (!error) + f2 = tv_get_float_chk(tv2, &error); + if (error) + { + clear_tv(tv1); + return FAIL; + } n1 = FALSE; switch (type) { @@ -1211,8 +1226,16 @@ typval_compare( else if ((tv1->v_type == VAR_NUMBER || tv2->v_type == VAR_NUMBER) && type != EXPR_MATCH && type != EXPR_NOMATCH) { - n1 = tv_get_number(tv1); - n2 = tv_get_number(tv2); + int error = FALSE; + + n1 = tv_get_number_chk(tv1, &error); + if (!error) + n2 = tv_get_number_chk(tv2, &error); + if (error) + { + clear_tv(tv1); + return FAIL; + } switch (type) { case EXPR_IS: |