Mercurial > vim
view vimtutor.bat @ 34309:d7cfd8fb1d75 v9.1.0089
patch 9.1.0089: qsort() comparison functions should be transitive
Commit: https://github.com/vim/vim/commit/e06e43766500ecb4cd1031fa16cf9cbebdb222c1
Author: Christian Brabandt <cb@256bit.org>
Date: Fri Feb 9 19:39:14 2024 +0100
patch 9.1.0089: qsort() comparison functions should be transitive
Problem: qsort() comparison functions should be transitive
Solution: Do not subtract values, but rather use explicit comparisons
Improve qsort() comparison functions
There has been a recent report on qsort() causing out-of-bounds read &
write in glibc for non transitive comparison functions
https://www.qualys.com/2024/01/30/qsort.txt
Even so the bug is in glibc's implementation of the qsort() algorithm,
it's bad style to just use substraction for the comparison functions,
which may cause overflow issues and as hinted at in OpenBSD's manual
page for qsort(): "It is almost always an error to use subtraction to
compute the return value of the comparison function."
So check the qsort() comparison functions and change them to be safe.
closes: #13980
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 09 Feb 2024 19:45:06 +0100 |
parents | 79aaaa134298 |
children |
line wrap: on
line source
:: Start Vim on a copy of the tutor file. @echo off :: Usage: vimtutor [-console] [xx] :: :: -console means gvim will not be used :: xx is a language code like "es" or "nl". :: When an xx argument is given, it tries loading that tutor. :: When this fails or no xx argument was given, it tries using 'v:lang' :: When that also fails, it uses the English version. :: Use Vim to copy the tutor, it knows the value of $VIMRUNTIME FOR %%d in (. %TMP% %TEMP%) DO ( call :test_dir_writable "%~dpf0" %%d IF NOT ERRORLEVEL 1 GOTO dir_ok ) echo No working directory is found GOTO end :test_dir_writable SET TUTORCOPY=%2\$tutor$ COPY %1 %TUTORCOPY% >nul 2>nul GOTO end :dir_ok SET xx=%1 IF NOT .%1==.-console GOTO use_gui SHIFT SET xx=%1 GOTO use_vim :use_gui :: Try making a copy of tutor with gvim. If gvim cannot be found, try using :: vim instead. If vim cannot be found, alert user to check environment and :: installation. :: The script tutor.vim tells Vim which file to copy. start "dummy" /b /w "%~dp0gvim.exe" -u NONE -c "so $VIMRUNTIME/tutor/tutor.vim" IF ERRORLEVEL 1 GOTO use_vim :: Start gvim without any .vimrc, set 'nocompatible' start "dummy" /b /w "%~dp0gvim.exe" -u NONE -c "set nocp" %TUTORCOPY% GOTO end :use_vim :: The script tutor.vim tells Vim which file to copy call vim -u NONE -c "so $VIMRUNTIME/tutor/tutor.vim" IF ERRORLEVEL 1 GOTO no_executable :: Start vim without any .vimrc, set 'nocompatible' call vim -u NONE -c "set nocp" %TUTORCOPY% GOTO end :no_executable ECHO. ECHO. ECHO No vim or gvim found in current directory or PATH. ECHO Check your installation or re-run install.exe :end :: remove the copy of the tutor IF EXIST %TUTORCOPY% DEL %TUTORCOPY% SET xx=