Mercurial > vim
comparison src/option.c @ 16728:e55c26aaf484 v8.1.1366
patch 8.1.1366: using expressions in a modeline is unsafe
commit https://github.com/vim/vim/commit/110289e78195b6d01e1e6ad26ad450de476d41c1
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu May 23 15:38:06 2019 +0200
patch 8.1.1366: using expressions in a modeline is unsafe
Problem: Using expressions in a modeline is unsafe.
Solution: Disallow using expressions in a modeline, unless the
'modelineexpr' option is set. Update help, add more tests.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 23 May 2019 15:45:06 +0200 |
parents | 77bcb5055fec |
children | 000350f8e4d1 |
comparison
equal
deleted
inserted
replaced
16727:8be69877c5de | 16728:e55c26aaf484 |
---|---|
465 #define P_NO_ML 0x2000000L /* not allowed in modeline */ | 465 #define P_NO_ML 0x2000000L /* not allowed in modeline */ |
466 #define P_CURSWANT 0x4000000L /* update curswant required; not needed when | 466 #define P_CURSWANT 0x4000000L /* update curswant required; not needed when |
467 * there is a redraw flag */ | 467 * there is a redraw flag */ |
468 #define P_NDNAME 0x8000000L /* only normal dir name chars allowed */ | 468 #define P_NDNAME 0x8000000L /* only normal dir name chars allowed */ |
469 #define P_RWINONLY 0x10000000L /* only redraw current window */ | 469 #define P_RWINONLY 0x10000000L /* only redraw current window */ |
470 #define P_MLE 0x20000000L /* under control of 'modelineexpr' */ | |
470 | 471 |
471 #define ISK_LATIN1 (char_u *)"@,48-57,_,192-255" | 472 #define ISK_LATIN1 (char_u *)"@,48-57,_,192-255" |
472 | 473 |
473 /* 'isprint' for latin1 is also used for MS-Windows cp1252, where 0x80 is used | 474 /* 'isprint' for latin1 is also used for MS-Windows cp1252, where 0x80 is used |
474 * for the currency sign. */ | 475 * for the currency sign. */ |
648 #else | 649 #else |
649 (char_u *)NULL, PV_NONE, | 650 (char_u *)NULL, PV_NONE, |
650 {(char_u *)0L, (char_u *)0L} | 651 {(char_u *)0L, (char_u *)0L} |
651 #endif | 652 #endif |
652 SCTX_INIT}, | 653 SCTX_INIT}, |
653 {"balloonexpr", "bexpr", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM, | 654 {"balloonexpr", "bexpr", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE, |
654 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) | 655 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) |
655 (char_u *)&p_bexpr, PV_BEXPR, | 656 (char_u *)&p_bexpr, PV_BEXPR, |
656 {(char_u *)"", (char_u *)0L} | 657 {(char_u *)"", (char_u *)0L} |
657 #else | 658 #else |
658 (char_u *)NULL, PV_NONE, | 659 (char_u *)NULL, PV_NONE, |
725 SCTX_INIT}, | 726 SCTX_INIT}, |
726 {"casemap", "cmp", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP, | 727 {"casemap", "cmp", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP, |
727 (char_u *)&p_cmp, PV_NONE, | 728 (char_u *)&p_cmp, PV_NONE, |
728 {(char_u *)"internal,keepascii", (char_u *)0L} | 729 {(char_u *)"internal,keepascii", (char_u *)0L} |
729 SCTX_INIT}, | 730 SCTX_INIT}, |
730 {"cdpath", "cd", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP, | 731 {"cdpath", "cd", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE|P_COMMA|P_NODUP, |
731 #ifdef FEAT_SEARCHPATH | 732 #ifdef FEAT_SEARCHPATH |
732 (char_u *)&p_cdpath, PV_NONE, | 733 (char_u *)&p_cdpath, PV_NONE, |
733 {(char_u *)",,", (char_u *)0L} | 734 {(char_u *)",,", (char_u *)0L} |
734 #else | 735 #else |
735 (char_u *)NULL, PV_NONE, | 736 (char_u *)NULL, PV_NONE, |
1173 #else | 1174 #else |
1174 (char_u *)NULL, PV_NONE, | 1175 (char_u *)NULL, PV_NONE, |
1175 {(char_u *)NULL, (char_u *)0L} | 1176 {(char_u *)NULL, (char_u *)0L} |
1176 #endif | 1177 #endif |
1177 SCTX_INIT}, | 1178 SCTX_INIT}, |
1178 {"foldexpr", "fde", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN, | 1179 {"foldexpr", "fde", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN|P_MLE, |
1179 #if defined(FEAT_FOLDING) && defined(FEAT_EVAL) | 1180 #if defined(FEAT_FOLDING) && defined(FEAT_EVAL) |
1180 (char_u *)VAR_WIN, PV_FDE, | 1181 (char_u *)VAR_WIN, PV_FDE, |
1181 {(char_u *)"0", (char_u *)NULL} | 1182 {(char_u *)"0", (char_u *)NULL} |
1182 #else | 1183 #else |
1183 (char_u *)NULL, PV_NONE, | 1184 (char_u *)NULL, PV_NONE, |
1256 #else | 1257 #else |
1257 (char_u *)NULL, PV_NONE, | 1258 (char_u *)NULL, PV_NONE, |
1258 {(char_u *)NULL, (char_u *)0L} | 1259 {(char_u *)NULL, (char_u *)0L} |
1259 #endif | 1260 #endif |
1260 SCTX_INIT}, | 1261 SCTX_INIT}, |
1261 {"foldtext", "fdt", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN, | 1262 {"foldtext", "fdt", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN|P_MLE, |
1262 #if defined(FEAT_FOLDING) && defined(FEAT_EVAL) | 1263 #if defined(FEAT_FOLDING) && defined(FEAT_EVAL) |
1263 (char_u *)VAR_WIN, PV_FDT, | 1264 (char_u *)VAR_WIN, PV_FDT, |
1264 {(char_u *)"foldtext()", (char_u *)NULL} | 1265 {(char_u *)"foldtext()", (char_u *)NULL} |
1265 #else | 1266 #else |
1266 (char_u *)NULL, PV_NONE, | 1267 (char_u *)NULL, PV_NONE, |
1267 {(char_u *)NULL, (char_u *)0L} | 1268 {(char_u *)NULL, (char_u *)0L} |
1268 #endif | 1269 #endif |
1269 SCTX_INIT}, | 1270 SCTX_INIT}, |
1270 {"formatexpr", "fex", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM, | 1271 {"formatexpr", "fex", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE, |
1271 #ifdef FEAT_EVAL | 1272 #ifdef FEAT_EVAL |
1272 (char_u *)&p_fex, PV_FEX, | 1273 (char_u *)&p_fex, PV_FEX, |
1273 {(char_u *)"", (char_u *)0L} | 1274 {(char_u *)"", (char_u *)0L} |
1274 #else | 1275 #else |
1275 (char_u *)NULL, PV_NONE, | 1276 (char_u *)NULL, PV_NONE, |
1404 (char_u *)&p_guipty, PV_NONE, | 1405 (char_u *)&p_guipty, PV_NONE, |
1405 #else | 1406 #else |
1406 (char_u *)NULL, PV_NONE, | 1407 (char_u *)NULL, PV_NONE, |
1407 #endif | 1408 #endif |
1408 {(char_u *)TRUE, (char_u *)0L} SCTX_INIT}, | 1409 {(char_u *)TRUE, (char_u *)0L} SCTX_INIT}, |
1409 {"guitablabel", "gtl", P_STRING|P_VI_DEF|P_RWIN, | 1410 {"guitablabel", "gtl", P_STRING|P_VI_DEF|P_RWIN|P_MLE, |
1410 #if defined(FEAT_GUI_TABLINE) | 1411 #if defined(FEAT_GUI_TABLINE) |
1411 (char_u *)&p_gtl, PV_NONE, | 1412 (char_u *)&p_gtl, PV_NONE, |
1412 {(char_u *)"", (char_u *)0L} | 1413 {(char_u *)"", (char_u *)0L} |
1413 #else | 1414 #else |
1414 (char_u *)NULL, PV_NONE, | 1415 (char_u *)NULL, PV_NONE, |
1475 (char_u *)&p_icon, PV_NONE, | 1476 (char_u *)&p_icon, PV_NONE, |
1476 #else | 1477 #else |
1477 (char_u *)NULL, PV_NONE, | 1478 (char_u *)NULL, PV_NONE, |
1478 #endif | 1479 #endif |
1479 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, | 1480 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, |
1480 {"iconstring", NULL, P_STRING|P_VI_DEF, | 1481 {"iconstring", NULL, P_STRING|P_VI_DEF|P_MLE, |
1481 #ifdef FEAT_TITLE | 1482 #ifdef FEAT_TITLE |
1482 (char_u *)&p_iconstring, PV_NONE, | 1483 (char_u *)&p_iconstring, PV_NONE, |
1483 #else | 1484 #else |
1484 (char_u *)NULL, PV_NONE, | 1485 (char_u *)NULL, PV_NONE, |
1485 #endif | 1486 #endif |
1547 #else | 1548 #else |
1548 (char_u *)NULL, PV_NONE, | 1549 (char_u *)NULL, PV_NONE, |
1549 {(char_u *)0L, (char_u *)0L} | 1550 {(char_u *)0L, (char_u *)0L} |
1550 #endif | 1551 #endif |
1551 SCTX_INIT}, | 1552 SCTX_INIT}, |
1552 {"includeexpr", "inex", P_STRING|P_ALLOCED|P_VI_DEF, | 1553 {"includeexpr", "inex", P_STRING|P_ALLOCED|P_VI_DEF|P_MLE, |
1553 #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL) | 1554 #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL) |
1554 (char_u *)&p_inex, PV_INEX, | 1555 (char_u *)&p_inex, PV_INEX, |
1555 {(char_u *)"", (char_u *)0L} | 1556 {(char_u *)"", (char_u *)0L} |
1556 #else | 1557 #else |
1557 (char_u *)NULL, PV_NONE, | 1558 (char_u *)NULL, PV_NONE, |
1559 #endif | 1560 #endif |
1560 SCTX_INIT}, | 1561 SCTX_INIT}, |
1561 {"incsearch", "is", P_BOOL|P_VI_DEF|P_VIM, | 1562 {"incsearch", "is", P_BOOL|P_VI_DEF|P_VIM, |
1562 (char_u *)&p_is, PV_NONE, | 1563 (char_u *)&p_is, PV_NONE, |
1563 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, | 1564 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, |
1564 {"indentexpr", "inde", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM, | 1565 {"indentexpr", "inde", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM|P_MLE, |
1565 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) | 1566 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) |
1566 (char_u *)&p_inde, PV_INDE, | 1567 (char_u *)&p_inde, PV_INDE, |
1567 {(char_u *)"", (char_u *)0L} | 1568 {(char_u *)"", (char_u *)0L} |
1568 #else | 1569 #else |
1569 (char_u *)NULL, PV_NONE, | 1570 (char_u *)NULL, PV_NONE, |
1886 #endif | 1887 #endif |
1887 SCTX_INIT}, | 1888 SCTX_INIT}, |
1888 {"modeline", "ml", P_BOOL|P_VIM, | 1889 {"modeline", "ml", P_BOOL|P_VIM, |
1889 (char_u *)&p_ml, PV_ML, | 1890 (char_u *)&p_ml, PV_ML, |
1890 {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT}, | 1891 {(char_u *)FALSE, (char_u *)TRUE} SCTX_INIT}, |
1892 {"modelineexpr", "mle", P_BOOL|P_VI_DEF, | |
1893 (char_u *)&p_mle, PV_NONE, | |
1894 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, | |
1891 {"modelines", "mls", P_NUM|P_VI_DEF, | 1895 {"modelines", "mls", P_NUM|P_VI_DEF, |
1892 (char_u *)&p_mls, PV_NONE, | 1896 (char_u *)&p_mls, PV_NONE, |
1893 {(char_u *)5L, (char_u *)0L} SCTX_INIT}, | 1897 {(char_u *)5L, (char_u *)0L} SCTX_INIT}, |
1894 {"modifiable", "ma", P_BOOL|P_VI_DEF|P_NOGLOB, | 1898 {"modifiable", "ma", P_BOOL|P_VI_DEF|P_NOGLOB, |
1895 (char_u *)&p_ma, PV_MA, | 1899 (char_u *)&p_ma, PV_MA, |
2309 (char_u *)&p_ru, PV_NONE, | 2313 (char_u *)&p_ru, PV_NONE, |
2310 #else | 2314 #else |
2311 (char_u *)NULL, PV_NONE, | 2315 (char_u *)NULL, PV_NONE, |
2312 #endif | 2316 #endif |
2313 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, | 2317 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, |
2314 {"rulerformat", "ruf", P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT, | 2318 {"rulerformat", "ruf", P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT|P_MLE, |
2315 #ifdef FEAT_STL_OPT | 2319 #ifdef FEAT_STL_OPT |
2316 (char_u *)&p_ruf, PV_NONE, | 2320 (char_u *)&p_ruf, PV_NONE, |
2317 #else | 2321 #else |
2318 (char_u *)NULL, PV_NONE, | 2322 (char_u *)NULL, PV_NONE, |
2319 #endif | 2323 #endif |
2575 (char_u *)&p_spr, PV_NONE, | 2579 (char_u *)&p_spr, PV_NONE, |
2576 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, | 2580 {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, |
2577 {"startofline", "sol", P_BOOL|P_VI_DEF|P_VIM, | 2581 {"startofline", "sol", P_BOOL|P_VI_DEF|P_VIM, |
2578 (char_u *)&p_sol, PV_NONE, | 2582 (char_u *)&p_sol, PV_NONE, |
2579 {(char_u *)TRUE, (char_u *)0L} SCTX_INIT}, | 2583 {(char_u *)TRUE, (char_u *)0L} SCTX_INIT}, |
2580 {"statusline" ,"stl", P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT, | 2584 {"statusline" ,"stl", P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT|P_MLE, |
2581 #ifdef FEAT_STL_OPT | 2585 #ifdef FEAT_STL_OPT |
2582 (char_u *)&p_stl, PV_STL, | 2586 (char_u *)&p_stl, PV_STL, |
2583 #else | 2587 #else |
2584 (char_u *)NULL, PV_NONE, | 2588 (char_u *)NULL, PV_NONE, |
2585 #endif | 2589 #endif |
2622 #else | 2626 #else |
2623 (char_u *)NULL, PV_NONE, | 2627 (char_u *)NULL, PV_NONE, |
2624 {(char_u *)0L, (char_u *)0L} | 2628 {(char_u *)0L, (char_u *)0L} |
2625 #endif | 2629 #endif |
2626 SCTX_INIT}, | 2630 SCTX_INIT}, |
2627 {"tabline", "tal", P_STRING|P_VI_DEF|P_RALL, | 2631 {"tabline", "tal", P_STRING|P_VI_DEF|P_RALL|P_MLE, |
2628 #ifdef FEAT_STL_OPT | 2632 #ifdef FEAT_STL_OPT |
2629 (char_u *)&p_tal, PV_NONE, | 2633 (char_u *)&p_tal, PV_NONE, |
2630 #else | 2634 #else |
2631 (char_u *)NULL, PV_NONE, | 2635 (char_u *)NULL, PV_NONE, |
2632 #endif | 2636 #endif |
2800 #else | 2804 #else |
2801 (char_u *)NULL, PV_NONE, | 2805 (char_u *)NULL, PV_NONE, |
2802 {(char_u *)0L, (char_u *)0L} | 2806 {(char_u *)0L, (char_u *)0L} |
2803 #endif | 2807 #endif |
2804 SCTX_INIT}, | 2808 SCTX_INIT}, |
2805 {"titlestring", NULL, P_STRING|P_VI_DEF, | 2809 {"titlestring", NULL, P_STRING|P_VI_DEF|P_MLE, |
2806 #ifdef FEAT_TITLE | 2810 #ifdef FEAT_TITLE |
2807 (char_u *)&p_titlestring, PV_NONE, | 2811 (char_u *)&p_titlestring, PV_NONE, |
2808 #else | 2812 #else |
2809 (char_u *)NULL, PV_NONE, | 2813 (char_u *)NULL, PV_NONE, |
2810 #endif | 2814 #endif |
4547 if (flags & (P_SECURE | P_NO_ML)) | 4551 if (flags & (P_SECURE | P_NO_ML)) |
4548 { | 4552 { |
4549 errmsg = _("E520: Not allowed in a modeline"); | 4553 errmsg = _("E520: Not allowed in a modeline"); |
4550 goto skip; | 4554 goto skip; |
4551 } | 4555 } |
4556 if ((flags & P_MLE) && !p_mle) | |
4557 { | |
4558 errmsg = _("E992: Not allowed in a modeline when 'modelineexpr' is off"); | |
4559 goto skip; | |
4560 } | |
4552 #ifdef FEAT_DIFF | 4561 #ifdef FEAT_DIFF |
4553 /* In diff mode some options are overruled. This avoids that | 4562 /* In diff mode some options are overruled. This avoids that |
4554 * 'foldmethod' becomes "marker" instead of "diff" and that | 4563 * 'foldmethod' becomes "marker" instead of "diff" and that |
4555 * "wrap" gets set. */ | 4564 * "wrap" gets set. */ |
4556 if (curwin->w_p_diff | 4565 if (curwin->w_p_diff |