-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* update to 16.2 (implements #815) * reinstate gettimeofday implementation from PostgreSQL 15 (fixes qgis/QGIS#56604)
- Loading branch information
Showing
3 changed files
with
78 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,80 @@ | ||
diff -ur postgresql-15.1/src/backend/libpq/be-secure-openssl.c ../postgresql-15.1/src/backend/libpq/be-secure-openssl.c | ||
--- postgresql-15.1/src/backend/libpq/be-secure-openssl.c 2022-11-07 22:36:53.000000000 +0100 | ||
+++ ../postgresql-15.1/src/backend/libpq/be-secure-openssl.c 2023-02-04 11:16:54.733927500 +0100 | ||
@@ -38,6 +38,17 @@ | ||
#include "utils/memutils.h" | ||
--- postgresql-16.1/src/port/win32gettimeofday.c 2023-11-06 23:04:27.000000000 +0100 | ||
+++ ../postgresql-16.1/src/port/win32gettimeofday.c 2024-02-29 21:41:11.389016200 +0100 | ||
@@ -28,8 +28,6 @@ | ||
|
||
/* | ||
+ * On Windows, <wincrypt.h> includes a #define for X509_NAME, which breaks our | ||
+ * ability to use OpenSSL's version of that symbol if <wincrypt.h> is pulled | ||
+ * in after <openssl/ssl.h> ... and, at least on some builds, it is. We | ||
+ * can't reliably fix that by re-ordering #includes, because libpq/libpq-be.h | ||
+ * #includes <openssl/ssl.h>. Instead, just zap the #define again here. | ||
#include "c.h" | ||
|
||
-#include <sysinfoapi.h> | ||
- | ||
#include <sys/time.h> | ||
|
||
/* FILETIME of Jan 1 1970 00:00:00, the PostgreSQL epoch */ | ||
@@ -42,6 +40,59 @@ | ||
#define FILETIME_UNITS_PER_SEC 10000000L | ||
#define FILETIME_UNITS_PER_USEC 10 | ||
|
||
+/* | ||
+ * Both GetSystemTimeAsFileTime and GetSystemTimePreciseAsFileTime share a | ||
+ * signature, so we can just store a pointer to whichever we find. This | ||
+ * is the pointer's type. | ||
+ */ | ||
+#ifdef X509_NAME | ||
+#undef X509_NAME | ||
+#endif | ||
+typedef VOID(WINAPI * PgGetSystemTimeFn) (LPFILETIME); | ||
+ | ||
+/* One-time initializer function, must match that signature. */ | ||
+static void WINAPI init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime); | ||
+ | ||
+/* Storage for the function we pick at runtime */ | ||
+static PgGetSystemTimeFn pg_get_system_time = &init_gettimeofday; | ||
+ | ||
+/* | ||
* These SSL-related #includes must come after all system-provided headers. | ||
* This ensures that OpenSSL can take care of conflicts with Windows' | ||
* <wincrypt.h> by #undef'ing the conflicting macros. (We don't directly | ||
+ * One time initializer. Determine whether GetSystemTimePreciseAsFileTime | ||
+ * is available and if so, plan to use it; if not, fall back to | ||
+ * GetSystemTimeAsFileTime. | ||
+ */ | ||
+static void WINAPI | ||
+init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime) | ||
+{ | ||
+ /* | ||
+ * Because it's guaranteed that kernel32.dll will be linked into our | ||
+ * address space already, we don't need to LoadLibrary it and worry about | ||
+ * closing it afterwards, so we're not using Pg's dlopen/dlsym() wrapper. | ||
+ * | ||
+ * We'll just look up the address of GetSystemTimePreciseAsFileTime if | ||
+ * present. | ||
+ * | ||
+ * While we could look up the Windows version and skip this on Windows | ||
+ * versions below Windows 8 / Windows Server 2012 there isn't much point, | ||
+ * and determining the windows version is its self somewhat Windows | ||
+ * version and development SDK specific... | ||
+ */ | ||
+ pg_get_system_time = (PgGetSystemTimeFn) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), | ||
+ "GetSystemTimePreciseAsFileTime"); | ||
+ if (pg_get_system_time == NULL) | ||
+ { | ||
+ /* | ||
+ * The expected error from GetLastError() is ERROR_PROC_NOT_FOUND, if | ||
+ * the function isn't present. No other error should occur. | ||
+ * | ||
+ * We can't report an error here because this might be running in | ||
+ * frontend code; and even if we're in the backend, it's too early to | ||
+ * elog(...) if we get some unexpected error. Also, it's not a | ||
+ * serious problem, so just silently fall back to | ||
+ * GetSystemTimeAsFileTime irrespective of why the failure occurred. | ||
+ */ | ||
+ pg_get_system_time = &GetSystemTimeAsFileTime; | ||
+ } | ||
+ | ||
+ (*pg_get_system_time) (lpSystemTimeAsFileTime); | ||
+} | ||
|
||
/* | ||
* timezone information is stored outside the kernel so tzp isn't used anymore. | ||
@@ -63,7 +114,7 @@ | ||
*/ | ||
Assert(tzp == NULL); | ||
|
||
- GetSystemTimePreciseAsFileTime(&file_time); | ||
+ (*pg_get_system_time) (&file_time); | ||
ularge.LowPart = file_time.dwLowDateTime; | ||
ularge.HighPart = file_time.dwHighDateTime; | ||
|
147f771
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @jef-n, thanks! I've installed libpq 16.2 on a Windows 7 system and it makes QGIS start.
I see a little glitch in the Help->About window, where the installed version is 16.2 while the reported version in still 16.1: