view src/testdir/test_lispindent.vim @ 33776:9503dc55b5ed v9.0.2108

patch 9.0.2108: [security]: overflow with count for :s command Commit: https://github.com/vim/vim/commit/ac63787734fda2e294e477af52b3bd601517fa78 Author: Christian Brabandt <cb@256bit.org> Date: Tue Nov 14 20:45:48 2023 +0100 patch 9.0.2108: [security]: overflow with count for :s command Problem: [security]: overflow with count for :s command Solution: Abort the :s command if the count is too large If the count after the :s command is larger than what fits into a (signed) long variable, abort with e_value_too_large. Adds a test with INT_MAX as count and verify it correctly fails. It seems the return value on Windows using mingw compiler wraps around, so the initial test using :s/./b/9999999999999999999999999990 doesn't fail there, since the count is wrapping around several times and finally is no longer larger than 2147483647. So let's just use 2147483647 in the test, which hopefully will always cause a failure Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 16 Nov 2023 22:15:10 +0100
parents 40df8a6515f6
children
line wrap: on
line source

" Tests for 'lispwords' settings being global-local.
" And  other lisp indent stuff.

set nocompatible viminfo+=nviminfo

func Test_global_local_lispwords()
  setglobal lispwords=foo,bar,baz
  setlocal lispwords-=foo | setlocal lispwords+=quux
  call assert_equal('foo,bar,baz', &g:lispwords)
  call assert_equal('bar,baz,quux', &l:lispwords)
  call assert_equal('bar,baz,quux', &lispwords)

  setlocal lispwords<
  call assert_equal('foo,bar,baz', &g:lispwords)
  call assert_equal('foo,bar,baz', &l:lispwords)
  call assert_equal('foo,bar,baz', &lispwords)
endfunc

def Test_lisp_indent()
  enew!

  append(0, [
	       '(defun html-file (base)',
	       '(format nil "~(~A~).html" base))',
	       '',
	       '(defmacro page (name title &rest body)',
	       '(let ((ti (gensym)))',
	       '`(with-open-file (*standard-output*',
	       '(html-file ,name)',
	       ':direction :output',
	       ':if-exists :supersede)',
	       '(let ((,ti ,title))',
	       '(as title ,ti)',
	       '(with center ',
	       '(as h2 (string-upcase ,ti)))',
	       '(brs 3)',
	       ',@body))))',
	       '',
	       ';;; Utilities for generating links',
	       '',
	       '(defmacro with-link (dest &rest body)',
	       '`(progn',
	       '(format t "<a href=\"~A\">" (html-file ,dest))',
	       ',@body',
	       '(princ "</a>")))'
	       ])
  assert_equal(7, lispindent(2))
  assert_equal(5, 6->lispindent())
  assert_fails('lispindent(-1)', 'E966: Invalid line number: -1')

  set lisp
  set lispwords&
  var save_copt = &cpoptions
  set cpoptions+=p
  normal 1G=G

  assert_equal([
	       '(defun html-file (base)',
	       '  (format nil "~(~A~).html" base))',
	       '',
	       '(defmacro page (name title &rest body)',
	       '  (let ((ti (gensym)))',
	       '       `(with-open-file (*standard-output*',
	       '			 (html-file ,name)',
	       '			 :direction :output',
	       '			 :if-exists :supersede)',
	       '			(let ((,ti ,title))',
	       '			     (as title ,ti)',
	       '			     (with center ',
	       '				   (as h2 (string-upcase ,ti)))',
	       '			     (brs 3)',
	       '			     ,@body))))',
	       '',
	       ';;; Utilities for generating links',
	       '',
	       '(defmacro with-link (dest &rest body)',
	       '  `(progn',
	       '    (format t "<a href=\"~A\">" (html-file ,dest))',
	       '    ,@body',
	       '    (princ "</a>")))',
	       ''
	       ], getline(1, "$"))

  enew!
  &cpoptions = save_copt
  set nolisp
enddef

func Test_lispindent_negative()
  " in legacy script there is no error
  call assert_equal(-1, lispindent(-1))
endfunc

func Test_lispindent_with_indentexpr()
  enew
  setl ai lisp nocin indentexpr=11
  exe "normal a(x\<CR>1\<CR>2)\<Esc>"
  let expected = ['(x', '  1', '  2)']
  call assert_equal(expected, getline(1, 3))
  " with Lisp indenting the first line is not indented
  normal 1G=G
  call assert_equal(expected, getline(1, 3))

  %del
  setl lispoptions=expr:1 indentexpr=5
  exe "normal a(x\<CR>1\<CR>2)\<Esc>"
  let expected_expr = ['(x', '     1', '     2)']
  call assert_equal(expected_expr, getline(1, 3))
  normal 2G2<<=G
  call assert_equal(expected_expr, getline(1, 3))

  setl lispoptions=expr:0
  " with Lisp indenting the first line is not indented
  normal 1G3<<=G
  call assert_equal(expected, getline(1, 3))

  bwipe!
endfunc

func Test_lisp_indent_works()
  " This was reading beyond the end of the line
  new
  exe "norm a\tü(\<CR>="
  set lisp
  norm ==
  bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab