From 9e02e20ab6df093e1ab751157dfb5c51a420187b Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Tue, 21 Oct 2014 22:55:43 -0400 Subject: [PATCH] MinGW: Link with shell32.dll instead of shfolder.dll. This improves consistency with the MSVC build. On buildfarm member narwhal, since commit 846e91e0223cf9f2821c3ad4dfffffbb929cb027, shfolder.dll:SHGetFolderPath() crashes when dblink calls it by way of pqGetHomeDirectory(). Back-patch to 9.4, where that commit first appeared. How it caused this regression remains a mystery. This is a partial revert of commit 889f03812916b146ae504c0fad5afdc7bf2e8a2a, which adopted shfolder.dll for Windows NT 4.0 compatibility. PostgreSQL 8.2 dropped support for that operating system. --- src/Makefile.global.in | 5 ++--- src/interfaces/ecpg/ecpglib/Makefile | 5 ----- src/interfaces/libpq/Makefile | 2 +- src/interfaces/libpq/win32.mak | 2 +- src/port/path.c | 8 +++++--- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 7b6ccd5f9c..d347322233 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -547,10 +547,9 @@ LIBOBJS = @LIBOBJS@ LIBS := -lpgcommon -lpgport $(LIBS) -# to make ws2_32.lib the last library, and always link with shfolder, -# so SHGetFolderName isn't picked up from shell32.dll +# to make ws2_32.lib the last library ifeq ($(PORTNAME),win32) -LIBS += -lws2_32 -lshfolder +LIBS += -lws2_32 endif # Not really standard libc functions, used by the backend. diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile index ae4474f988..e65fea9345 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -38,11 +38,6 @@ SHLIB_PREREQS = submake-libpq submake-pgtypeslib SHLIB_EXPORTS = exports.txt -ifeq ($(PORTNAME), win32) -# Link to shfolder.dll instead of shell32.dll -SHLIB_LINK += -lshfolder -endif - PKG_CONFIG_REQUIRES_PRIVATE = libpq libpgtypes all: all-lib diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index c794b9647c..7fea34369f 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -70,7 +70,7 @@ else SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lk5crypto -lkrb5 -lgssapi32 -lssl -lsocket -lnsl -lresolv -lintl $(PTHREAD_LIBS), $(LIBS)) $(LDAP_LIBS_FE) endif ifeq ($(PORTNAME), win32) -SHLIB_LINK += -lshfolder -lwsock32 -lws2_32 -lsecur32 $(filter -leay32 -lssleay32 -lcomerr32 -lkrb5_32, $(LIBS)) +SHLIB_LINK += -lshell32 -lwsock32 -lws2_32 -lsecur32 $(filter -leay32 -lssleay32 -lcomerr32 -lkrb5_32, $(LIBS)) endif SHLIB_EXPORTS = exports.txt diff --git a/src/interfaces/libpq/win32.mak b/src/interfaces/libpq/win32.mak index 23e09e9810..4e4a60e9b8 100644 --- a/src/interfaces/libpq/win32.mak +++ b/src/interfaces/libpq/win32.mak @@ -208,7 +208,7 @@ CPP_SBRS=. RSC_PROJ=/l 0x409 /fo"$(INTDIR)\libpq.res" LINK32=link.exe -LINK32_FLAGS=kernel32.lib user32.lib advapi32.lib shfolder.lib wsock32.lib ws2_32.lib secur32.lib $(SSL_LIBS) $(KFW_LIB) $(ADD_SECLIB) \ +LINK32_FLAGS=kernel32.lib user32.lib advapi32.lib shell32.lib wsock32.lib ws2_32.lib secur32.lib $(SSL_LIBS) $(KFW_LIB) $(ADD_SECLIB) \ /nologo /subsystem:windows /dll $(LOPT) /incremental:no \ /pdb:"$(OUTDIR)\libpqdll.pdb" /machine:$(CPU) \ /out:"$(OUTDIR)\$(OUTFILENAME).dll"\ diff --git a/src/port/path.c b/src/port/path.c index 378920597d..4f2b152fdc 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -785,9 +785,11 @@ get_home_path(char *ret_path) char *tmppath; /* - * Note: We use getenv here because the more modern - * SHGetSpecialFolderPath() will force us to link with shell32.lib which - * eats valuable desktop heap. + * Note: We use getenv() here because the more modern SHGetFolderPath() + * would force the backend to link with shell32.lib, which eats valuable + * desktop heap. XXX This function is used only in psql, which already + * brings in shell32 via libpq. Moving this function to its own file + * would keep it out of the backend, freeing it from this concern. */ tmppath = getenv("APPDATA"); if (!tmppath) -- 2.40.0