Mercurial > vim
comparison src/userfunc.c @ 29771:c71a42be2d7f v9.0.0225
patch 9.0.0225: using freed memory with multiple line breaks in expression
Commit: https://github.com/vim/vim/commit/91c7cbfe31bbef57d5fcf7d76989fc159f73ef15
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Aug 18 13:28:31 2022 +0100
patch 9.0.0225: using freed memory with multiple line breaks in expression
Problem: Using freed memory with multiple line breaks in expression.
Solution: Free eval_tofree later.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 18 Aug 2022 14:30:05 +0200 |
parents | d19adfd545e2 |
children | cd573d7bc30d |
comparison
equal
deleted
inserted
replaced
29770:653c04c1dcf1 | 29771:c71a42be2d7f |
---|---|
1370 int ret; | 1370 int ret; |
1371 char_u *s; | 1371 char_u *s; |
1372 char_u *start, *end; | 1372 char_u *start, *end; |
1373 int *old_eval_lavars = eval_lavars_used; | 1373 int *old_eval_lavars = eval_lavars_used; |
1374 int eval_lavars = FALSE; | 1374 int eval_lavars = FALSE; |
1375 char_u *tofree1 = NULL; | |
1376 char_u *tofree2 = NULL; | 1375 char_u *tofree2 = NULL; |
1377 int equal_arrow = **arg == '('; | 1376 int equal_arrow = **arg == '('; |
1378 int white_error = FALSE; | 1377 int white_error = FALSE; |
1379 int called_emsg_start = called_emsg; | 1378 int called_emsg_start = called_emsg; |
1380 int vim9script = in_vim9script(); | 1379 int vim9script = in_vim9script(); |
1455 // Get the start and the end of the expression. | 1454 // Get the start and the end of the expression. |
1456 start = *arg; | 1455 start = *arg; |
1457 ret = skip_expr_concatenate(arg, &start, &end, evalarg); | 1456 ret = skip_expr_concatenate(arg, &start, &end, evalarg); |
1458 if (ret == FAIL) | 1457 if (ret == FAIL) |
1459 goto errret; | 1458 goto errret; |
1460 if (evalarg != NULL) | |
1461 { | |
1462 // avoid that the expression gets freed when another line break follows | |
1463 tofree1 = evalarg->eval_tofree; | |
1464 evalarg->eval_tofree = NULL; | |
1465 } | |
1466 | 1459 |
1467 if (!equal_arrow) | 1460 if (!equal_arrow) |
1468 { | 1461 { |
1469 *arg = skipwhite_and_linebreak(*arg, evalarg); | 1462 *arg = skipwhite_and_linebreak(*arg, evalarg); |
1470 if (**arg != '}') | 1463 if (**arg != '}') |
1583 hash_add(&func_hashtab, UF2HIKEY(fp)); | 1576 hash_add(&func_hashtab, UF2HIKEY(fp)); |
1584 } | 1577 } |
1585 | 1578 |
1586 theend: | 1579 theend: |
1587 eval_lavars_used = old_eval_lavars; | 1580 eval_lavars_used = old_eval_lavars; |
1588 if (evalarg != NULL && evalarg->eval_tofree == NULL) | |
1589 evalarg->eval_tofree = tofree1; | |
1590 else | |
1591 vim_free(tofree1); | |
1592 vim_free(tofree2); | 1581 vim_free(tofree2); |
1593 if (types_optional) | 1582 if (types_optional) |
1594 ga_clear_strings(&argtypes); | 1583 ga_clear_strings(&argtypes); |
1595 | 1584 |
1596 return OK; | 1585 return OK; |
1605 if (fp != NULL) | 1594 if (fp != NULL) |
1606 vim_free(fp->uf_arg_types); | 1595 vim_free(fp->uf_arg_types); |
1607 } | 1596 } |
1608 vim_free(fp); | 1597 vim_free(fp); |
1609 vim_free(pt); | 1598 vim_free(pt); |
1610 if (evalarg != NULL && evalarg->eval_tofree == NULL) | |
1611 evalarg->eval_tofree = tofree1; | |
1612 else | |
1613 vim_free(tofree1); | |
1614 vim_free(tofree2); | 1599 vim_free(tofree2); |
1615 eval_lavars_used = old_eval_lavars; | 1600 eval_lavars_used = old_eval_lavars; |
1616 return FAIL; | 1601 return FAIL; |
1617 } | 1602 } |
1618 | 1603 |