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