Re: OK, so culicidae is *still* broken
Noah Misch <noah@leadboat.com>
From: Noah Misch <noah@leadboat.com>
To: Andres Freund <andres@anarazel.de>, Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@postgresql.org
Date: 2017-05-20T12:26:33Z
Lists: pgsql-hackers
On Sat, Apr 15, 2017 at 02:30:18PM -0700, Andres Freund wrote: > On 2017-04-15 17:24:54 -0400, Tom Lane wrote: > > Andres Freund <andres@anarazel.de> writes: > > > On 2017-04-15 17:09:38 -0400, Tom Lane wrote: > > >> Why doesn't Windows' ability to map the segment into the new process > > >> before it executes take care of that? > > > > > Because of ASLR of the main executable (i.e. something like PIE). > > > > Not following. Are you saying that the main executable gets mapped into > > the process address space immediately, but shared libraries are not? At the time of the pgwin32_ReserveSharedMemoryRegion() call, the child process contains only ntdll.dll and the executable. > Without PIE/ASLR we can somewhat rely on pgwin32_ReserveSharedMemoryRegion > to find the space that PGSharedMemoryCreate allocated still unoccupied. I've never had access to a Windows system that can reproduce the fork failures. My best theory is that antivirus or similar software injects an additional DLL at that early stage. > > I wonder whether we could work around that by just destroying the created > > process and trying again if we get a collision. It'd be a tad > > inefficient, but hopefully collisions wouldn't happen often enough to be a > > big problem. > > That might work, although it's obviously not pretty. I didn't like that idea when Michael proposed it in 2015. Since disabling ASLR on the exe proved insufficient, I do like it now. It degrades nicely; if something raises the collision rate from 1% to 10%, that just looks like fork latency degrading. > We could also just > default to some out-of-the-way address for MapViewOfFileEx, that might > also work. Dave Vitek proposed that: https://www.postgresql.org/message-id/flat/5046CAEB.4010600%40grammatech.com I estimate more risk than retrying forks. There's no guarantee that a fixed address helpful today won't make the collisions worse after the next Windows security patch.
Commits
-
Provide a way to control SysV shmem attach address in EXEC_BACKEND builds.
- 0d7591c67d68 9.2.21 landed
- fddc10146eb2 9.3.17 landed
- 07a990c6e7d1 9.4.12 landed
- bbd4a1b60b6e 9.5.7 landed
- a30f146db4e7 9.6.3 landed
- a74740fbd3bb 10.0 landed
-
Disable RandomizedBaseAddress on MSVC builds
- 7f3e17b4827b 9.4.0 cited