2014-08-08 23:34 GMT+02:00 Richard Hipp>:
> Please continue to test the latest snapshots and report any issues you find.

I already reported this to sqlite-dev, but without test-case exposing the
problem. Here is the test-case, which is 100% reproducable.
And below is a minimal patch which fixes this problem.

=============== main.c ================
#include <sqlite3.h>
int main(){
        sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE);
        int rc = sqlite3_mutex_try(mutex);
        if( rc == SQLITE_OK) sqlite3_mutex_leave(mutex);
}
======================================

Compile this using any Windows compiler (MSVC, MinGW, MinGW-w64)
with the following options.e.g.:

i686-w64-mingw32-gcc -o bug.exe -DNTDDI_VERSION=NTDDI_WINBLUE
-D_WIN32_WINNT=0x0400 -DSQLITE_THREADSAFE=1 main.c sqlite3.c

Then simply run "bug.exe", it will crash immediately in the function
sqlite3_win32_is_nt(), because osGetVersionExW is a NULL pointer.

Regards,
        Jan Nijtmans

---------- Forwarded message ----------
From: Jan Nijtmans <jan.nijtm...@gmail.com>
Date: 2014-08-05 13:24 GMT+02:00
Subject: Re: SQLite trunk on win32 broken with -DSQLITE_WIN32_NO_ANSI
To: sqlite-dev <sqlite-...@sqlite.org>


2014-08-03 9:37 GMT+02:00 Jan Nijtmans <jan.nijtm...@gmail.com>:
> Fixed here:
>   <http://www.sqlite.org/src/info/ba78265429>
>
> Thanks!

Actually, just discovered that it is still not fixed for
all cases: When SQLITE_WIN32_GETVERSIONEX
is equal to 0 (later MS SDK's), then any call to
sqlite3_win32_is_nt() will crash because the
function osGetVersionExW() is a null pointer ;-(

Suggested patch (current SQLite trunk) below.

Regards,
        Jan Nijtmans

Index: src/os_win.c
==================================================================
--- src/os_win.c
+++ src/os_win.c
@@ -413,11 +413,11 @@
 ** In order to facilitate testing on a WinNT system, the test fixture
 ** can manually set this value to 1 to emulate Win98 behavior.
 */
 #ifdef SQLITE_TEST
 LONG volatile sqlite3_os_type = 0;
-#else
+#elif SQLITE_WIN32_GETVERSIONEX
 static LONG volatile sqlite3_os_type = 0;
 #endif

 #ifndef SYSCALL
 #  define SYSCALL sqlite3_syscall_ptr
@@ -1308,10 +1308,11 @@
 /*
 ** This function determines if the machine is running a version of Windows
 ** based on the NT kernel.
 */
 int sqlite3_win32_is_nt(void){
+#if SQLITE_WIN32_GETVERSIONEX
   if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){
 #if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WIN8
     OSVERSIONINFOW sInfo;
     sInfo.dwOSVersionInfoSize = sizeof(sInfo);
     osGetVersionExW(&sInfo);
@@ -1322,10 +1323,13 @@
 #endif
     osInterlockedCompareExchange(&sqlite3_os_type,
         (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0);
   }
   return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2;
+#else
+  return 1;
+#endif
 }

 #ifdef SQLITE_WIN32_MALLOC
 /*
 ** Allocate nBytes of memory.
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to