Re: Crash with old Windows on new CPU

From: Christian Ullrich <chris(at)chrullrich(dot)net>
To: Magnus Hagander <magnus(at)hagander(dot)net>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Robert Haas <robertmhaas(at)gmail(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Crash with old Windows on new CPU
Date: 2016-03-09 16:55:21
Message-ID: 56E05579.1040705@chrullrich.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

* Magnus Hagander wrote:

> On Wed, Mar 9, 2016 at 4:36 PM, Christian Ullrich <chris(at)chrullrich(dot)net>
> wrote:
>
>> * Magnus Hagander wrote:

>>> How does this work wrt mingw, though? Do we have the same problem there?
>>> AIUI this code can never run on mingw, correct?
>>
>> Not unless mingw defines _MSC_VER.
>
> The question is then - should it, under some conditions?

I have no clue about MinGW, so all I can say is that msvcrt.dll (even in
Windows 10) does not use the problematic instructions, nor does it
export anything with "FMA" in its name. If there is nothing to turn off,
and nothing to turn it off with, then I suspect we are safe there. (This
is based on a minimal test program, just to see where MinGW takes its
log() from; it comes from msvcrt.)

Also, we have confirmation, in the link I sent when I started this
thread, that the bug is only and specifically in the VS2013 CRT, not
anywhere else before or since.

>>> I notice the code checks IsWindows7SP1OrGreater() but the comment refers to
>>> W7SP1 *or* 2008R2 SP1. I assume this is correct, or should there actually
>>> be a separate check for server-windows?

>> No, that is fine. I think it's just to keep the function name from getting
>> too ridiculously long. The functions in <versionhelpers.h> are all named
>> for the client versions only, and only check the version number, not the
>> client/server capability flags. Or, rather, there is a separate function to
>> determine that.

> Presumably the link is documented somewhere (the docs don't seem to say
> anything about it).

<https://msdn.microsoft.com/en-us/library/windows/desktop/dn424960(v=vs.85).aspx>
("IsWindows7SP1OrGreater function"):

> This function does not differentiate between client and server
> releases. It will return true if the current OS version number is
> equal to or higher than the version of the client named in the call.
> For example, a call to IsWindowsXPSP3OrGreater will return true on
> Windows Server 2008. Applications that need to distinguish between
> server and client versions of Windows should call IsWindowsServer.

The internal version numbers (since NT4) are:

Version | Client | Server
---------+--------+--------
4.0 | NT4 | NT4
5.0 | 2000 | 2000
5.1 | XP |
5.2 | | 2003
6.0 | Vista | 2008
6.1 | 7 | 2008R2
6.2 | 8 | 2012
6.3 | 8.1 | 2012R2
10.0 | 10 | [2016]

The relevant SDK header (<sdkddkver.h>), where constants for the version
numbers are defined, also only has entries named for the client
versions, with the sole exception of 2008, with the same value as Vista,
and the special case of 2003 with no equivalent client version (unless
you count the second attempt at an XP x64 ... but I digress again).

If Microsoft wanted the added complexity of separate symbols for what is
basically the same code, I rather think they would have them.

--
Christian

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2016-03-09 16:58:29 Re: Alter or rename enum value
Previous Message David Steele 2016-03-09 16:55:17 Re: [PATCH v6] GSSAPI encryption support