[erlang-patches] Win64 memory corruption fix

Fredrik fredrik@REDACTED
Wed Feb 6 10:51:12 CET 2013


Hello,
I will put it in the 'master-pu' branch for building and testing!

BR Fredrik Gustafsson (Terran player)
Erlang OTP Team
On 02/06/2013 04:27 AM, Blaine Whittle wrote:
>
> git fetch git://github.com/bwhittle/otp.git win-64-pointer-fix
>
> https://github.com/bwhittle/otp/commit/1d21ce8d0287a0a50b2e42631d361f43ce14e23e
>
> This patch should fix a number of memory corruption issues and / or 
> crashes on Win64 that can potential occur when the Erlang VM exceeds 4 
> GB of ram.    The problem stems from casting pointers to unsigned long 
> and assuming long is type that is always large enough to hold a 
> pointer.  This assumption holds up for all platforms except windows.
>
> Nix 32 (unsigned long) -> 32 bit                  (pointer size = 
> unsigned long)
>
> Nix 64 (unsigned long) -> 64 bit                  (pointer size = 
> unsigned long)
>
> Win 32 (unsigned long) -> 32 bit                (pointer size = 
> unsigned long)
>
> Win 64 (unsigned long) -> 32 bit                (pointer size != 
> unsigned long)
>
> To compound the problem these casts can appear to be fine on Win64 as 
> only those pointers that reference memory above the 32 bit address 
> space will lead to issues.    Which means you need Erlang to allocate 
> ~ 4 GB of memory before you even have a chance or running into 
> problems.     The issue is if you have a pointer that reference memory 
> above the 32 bit address space on Win64 and then type cast it to a 
> long (i.e. 32 bits) and then turn around and use that type cast value 
> as a pointer then you'll be referencing a different memory location.   
> Most of the time the incorrect pointer will still reference a valid 
> location as memory is allocated bottom up which can lead to memory 
> corruption.
>
> This patch has been tested heavily and has been used on production 
> systems.  I made the changes a year ago when the Win64 Erlang VM was 
> released (just didn't mean to wait so long to submit it.)
>
> The patch submission page recommends that I create new test cases 
> which I have not done.    However I have a small registry change that 
> should be applied on any systems that execute Erlang Win64 smoke and / 
> or unit tests.
>
> The registry change instructs Windows to allocate memory from top 
> down, meaning that any valid memory pointers will require a 64 bit 
> value and any attempt to cast them to a 32 bit value followed by a 
> dereference will produce an access violation.
>
> http://msdn.microsoft.com/en-us/library/windows/desktop/bb613473(v=vs.85).aspx
>
> To apply the registry setting just copy and paste the following 
> section and place it into a <some name>.reg file and import it on each 
> test machines followed by a reboot.
>
> =============================================================
>
> Windows Registry Editor Version 5.00
>
> [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session 
> Manager\Memory Management]
>
> "AllocationPreference"=dword:00100000.
>
> =============================================================
>
> With this registry change Erlang's existing unit tests should be able 
> to catch any incorrect pointer casts by causing the VM to crash.   
> Every pointer will reference memory above the 32 value so type casting 
> it to a 32 bit value and then dereferencing causes an access violation.
>
> One potential issue with using this registry setting is that if your 
> test machines rely on 3rd party Win64 apps it's possible they may 
> crash on startup (that is if they contain similar type casting bugs.)
>
>
>
> _______________________________________________
> erlang-patches mailing list
> erlang-patches@REDACTED
> http://erlang.org/mailman/listinfo/erlang-patches


-- 

BR Fredrik Gustafsson
Erlang OTP Team

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20130206/59fea73c/attachment.htm>


More information about the erlang-patches mailing list