Skip to content

Commit

Permalink
libpq:
Browse files Browse the repository at this point in the history
* update to 16.2 (implements #815)
* reinstate gettimeofday implementation from PostgreSQL 15 (fixes
  qgis/QGIS#56604)
  • Loading branch information
jef-n committed Feb 29, 2024
1 parent b4aadca commit 147f771
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 18 deletions.
1 change: 1 addition & 0 deletions acceptable.lst
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,5 @@ bb1a27fdd409f635a3f92106ef78d30a protozero
397c6526409a699d4c34b1cba4b48b04 grass
3c031a10a6c2f360752e62f882691ca8 PDAL
c31f662bb2bfb3b4187fe9a53e0ffe7c libpq
89afbb2d7716371015101c2b2cb4297a libpq 16.2
6a905a337cc228a1f68f0b5416f52a7f libjxl
2 changes: 1 addition & 1 deletion src/libpq/osgeo4w/package.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export P=libpq
export V=16.1
export V=16.2
export B=next
export MAINTAINER=JuergenFischer
export BUILDDEPENDS="openssl-devel zlib-devel libiconv-devel"
Expand Down
93 changes: 76 additions & 17 deletions src/libpq/osgeo4w/patch
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;

1 comment on commit 147f771

@agiudiceandrea
Copy link
Contributor

@agiudiceandrea agiudiceandrea commented on 147f771 Mar 1, 2024

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:
image

Please sign in to comment.