mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-24 08:32:34 +02:00
Open-source engine for Heroes of Might and Magic III
23215e039c
Avoid buffer overflow caused by sws_scale(): http://trac.ffmpeg.org/ticket/9254 Currently (ffmpeg-4.4 with SSE3 enabled) sws_scale() has a few requirements for target data buffers on rescaling: 1. buffer has to be aligned to be usable for SIMD instructions 2. buffer has to be padded to allow small overflow by SIMD instructions Unfortunately SDL_Surface does not provide these guarantees. This means that atempt to rescale directly into SDL surface causes memory corruption. Usually it happens on campaign selection screen where short video moves start spinning on mouse hover. To fix [1.] we use av_malloc() for memory allocation. To fix [2.] we add an `ffmpeg_pad` that provides plenty of space. We have to use intermdiate buffer and then use memcpy() to land it to SDL_Surface. Without the change crash has the following backtrace: ``` (gdb) bt (c=0x47508940, src=0x1ffeffef50, srcStride=0x1ffeffef30, srcSliceY=0, srcSliceH=116, dst=0x1ffeffef70, dstStride=0x1ffeffef40) at src/libswscale/x86/yuv2rgb_template.c:119 (c=<optimized out>, srcSlice=<optimized out>, srcStride=0x432afa20, srcSliceY=<optimized out>, srcSliceH=116, dst=<optimized out>, dstStride=0x1ffefff0a0) at src/libswscale/swscale.c:969 (this=0x1abaa330, x=90, y=72, dst=0x1a85a4c0, forceRedraw=<optimized out>, update=<optimized out>) at ../vcmi-9999/client/CVideoHandler.cpp:332 at ../vcmi-9999/client/gui/CIntObject.cpp:83 at ../vcmi-9999/client/gui/CGuiHandler.cpp:462 ``` valgrind points to corruption right in sws_scale(): ``` Invalid write of size 8 at 0x6C50BD3: ??? (in /usr/lib64/libswscale.so.5.7.100) by 0x6C4FAE6: yuv420_rgb32_ssse3 (yuv2rgb_template.c:119) by 0x6C28DF2: sws_scale (swscale.c:969) by 0x4566F6: CVideoPlayer::nextFrame() (CVideoHandler.cpp:293) by 0x4573A6: CVideoPlayer::update(int, int, SDL_Surface*, bool, bool) (CVideoHandler.cpp:332) by 0x25EC94: CIntObject::show(SDL_Surface*) [clone .part.0] (CIntObject.cpp:83) by 0x34E855: CMainMenu::update() (CMainMenu.cpp:319) by 0x25D589: CGuiHandler::renderFrame() (CGuiHandler.cpp:462) by 0x1F7450: mainLoop (CMT.cpp:1387) by 0x1F7450: main (CMT.cpp:513) Address 0x475088a8 is 0 bytes after a block of size 92,840 alloc'd at 0x483F7E5: malloc (vg_replace_malloc.c:380) by 0x52B4E23: SDL_malloc_REAL (SDL_malloc.c:5387) by 0x5266237: SDL_SIMDAlloc_REAL (SDL_cpuinfo.c:963) by 0x52EF042: SDL_CreateRGBSurfaceWithFormat_REAL (SDL_surface.c:123) by 0x2649AC: CSDL_Ext::newSurface(int, int, SDL_Surface*) (SDL_Extensions.cpp:42) by 0x457B20: CVideoPlayer::open(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool) (CVideoHandler.cpp:182) by 0x457C60: CVideoPlayer::open(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) (CVideoHandler.cpp:84) by 0x35B14E: CCampaignScreen::CCampaignButton::show(SDL_Surface*) (CCampaignScreen.cpp:126) by 0x25EC94: CIntObject::show(SDL_Surface*) [clone .part.0] (CIntObject.cpp:83) by 0x34E855: CMainMenu::update() (CMainMenu.cpp:319) by 0x25D589: CGuiHandler::renderFrame() (CGuiHandler.cpp:462) by 0x1F7450: mainLoop (CMT.cpp:1387) by 0x1F7450: main (CMT.cpp:513) ``` Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> |
||
---|---|---|
.github/workflows | ||
AI | ||
CI | ||
client | ||
cmake_modules | ||
config | ||
debian | ||
include | ||
launcher | ||
lib | ||
Mods/vcmi | ||
osx | ||
rpm | ||
scripting | ||
scripts/lib | ||
server | ||
test | ||
.gitignore | ||
.gitmodules | ||
.travis.yml | ||
AUTHORS | ||
CCallback.cpp | ||
CCallback.h | ||
ChangeLog | ||
CMakeLists.txt | ||
fuzzylite.pc.in | ||
Global.h | ||
license.txt | ||
README.md | ||
VCMI_global_debug.props | ||
VCMI_global_release.props | ||
VCMI_global_user.props | ||
VCMI_global.props | ||
VCMI_VS15.sln | ||
vcmi.workspace | ||
vcmibuilder | ||
vcmimanual.tex | ||
Version.cpp.in | ||
Version.h |
VCMI Project
VCMI is work-in-progress attempt to recreate engine for Heroes III, giving it new and extended possibilities.
Links
- Homepage: https://vcmi.eu/
- Wiki: https://wiki.vcmi.eu/
- Forums: https://forum.vcmi.eu/
- Bugtracker: https://bugs.vcmi.eu/
- Slack: https://slack.vcmi.eu/
Installation guides
To use VCMI you need to own original data files.
Building from source
Platform support is constantly tested by continuous integration and CMake configuration adjusted to generate nice looking projects for all major IDE. Following guides will help you to setup build environment with no effort:
Copyright and license
VCMI Project source code is licensed under GPL version 2 or later. VCMI Project assets are licensed under CC-BY-SA 4.0. Assets sources and information about contributors are available under following link: [https://github.com/vcmi/vcmi-assets]
Copyright (C) 2007-2020 VCMI Team (check AUTHORS file for the contributors list)