annotate src/create_nvcmdidxs.vim @ 33862:242b964d6269 v9.0.2140

patch 9.0.2140: [security]: use-after-free in win-enter Commit: https://github.com/vim/vim/commit/eec0c2b3a4cfab93dd8d4adaa60638d47a2bbc8a Author: Christian Brabandt <cb@256bit.org> Date: Tue Nov 28 22:03:48 2023 +0100 patch 9.0.2140: [security]: use-after-free in win-enter Problem: [security]: use-after-free in win-enter Solution: validate window pointer before calling win_enter() win_goto() may stop visual mode, if it is active. However, this may in turn trigger the ModeChanged autocommand, which could potentially free the wp pointer which was valid before now became stale and points to now freed memory. So before calling win_enter(), let's verify one more time, that the wp pointer still points to a valid window structure. Reported by @henices, thanks! Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Dec 2023 15:16:01 +0100
parents ee1019e59bef
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
1 " This script generates the table nv_cmd_idx[] which contains the index in
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
2 " nv_cmds[] table (normal.c) for each of the command character supported in
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
3 " normal/visual mode.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
4 " This is used to speed up the command lookup in nv_cmds[].
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
5 "
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
6 " Script should be run using "make nvcmdidxs", every time the nv_cmds[] table
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
7 " in src/nv_cmds.h changes.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
8 "
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
9 " This is written in legacy Vim script so that it can be run by a slightly
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
10 " older Vim version.
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
12 " Generate the table of normal/visual mode command characters and their
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
13 " corresponding index.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
14 let cmd = 'create_nvcmdidxs'
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
15 if has('unix')
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
16 let cmd = './' .. cmd
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
17 endif
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
18 let nv_cmdtbl = systemlist(cmd)->map({i, ch -> {'idx': i, 'cmdchar': ch}})
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
20 " sort the table by the command character
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
21 call sort(nv_cmdtbl, {a, b -> a.cmdchar - b.cmdchar})
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
23 " Compute the highest index upto which the command character can be directly
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
24 " used as an index.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
25 let nv_max_linear = 0
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
26 for i in range(nv_cmdtbl->len())
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
27 if i != nv_cmdtbl[i].cmdchar
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
28 let nv_max_linear = i - 1
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
29 break
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
30 endif
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
31 endfor
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
33 " Generate a header file with the table
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
34 let output =<< trim END
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
35 /*
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
36 * Automatically generated code by the create_nvcmdidxs.vim script.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
37 *
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
38 * Table giving the index in nv_cmds[] to lookup based on
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
39 * the command character.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
40 */
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
42 // nv_cmd_idx[<normal mode command character>] => nv_cmds[] index
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
43 static const unsigned short nv_cmd_idx[] =
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
44 {
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
45 END
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
47 " Add each command character in comment and the corresponding index
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
48 let output += nv_cmdtbl->map({_, v ->
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
49 \ printf(' /* %5d */ %3d,', v.cmdchar, v.idx)})
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
51 let output += ['};', '',
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
52 \ '// The highest index for which',
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
53 \ '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]']
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
55 let output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';']
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
56
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
57 call writefile(output, "nv_cmdidxs.h")
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 quit
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
60 " vim: shiftwidth=2 sts=2 expandtab