The version is now 8.3.0401.
authorHiroshi Inoue <inoue@tpf.co.jp>
Sun, 23 Nov 2008 01:00:53 +0000 (01:00 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Sun, 23 Nov 2008 01:00:53 +0000 (01:00 +0000)
1) Avoid a crash on exit when using SSL connections by resetting
   CRTPTO_xx_callbacks before unloding libpq.
2) Correct the funtion name DiscardRollbackState pointed out by Zoltan Boszormenyi.
3) Correct the value of INDEX_QUALIFIER column which returned by
   SLQSTATISTICS();

info.c
loadlib.c
odbcapi.c
psqlodbc.h
version.h
win32.mak
win64.mak

diff --git a/info.c b/info.c
index 734444e84ebb45d6ad9d83ef6e568b1b708cb2d5..3f982f84af098c208262797b0e5341c92c072a83 100644 (file)
--- a/info.c
+++ b/info.c
@@ -3241,7 +3241,7 @@ PGAPI_Statistics(
        set_tuplefield_int2(&tuple[STATS_NON_UNIQUE], (Int2) (ci->drivers.unique_index ? FALSE : TRUE));
 
        /* no index qualifier */
-       set_tuplefield_string(&tuple[STATS_INDEX_QUALIFIER], CurrCat(conn));
+       set_tuplefield_string(&tuple[STATS_INDEX_QUALIFIER], GET_SCHEMA_NAME(table_schemaname));
 
        snprintf(buf, sizeof(table_name), "%s_idx_fake_oid", table_name);
        set_tuplefield_string(&tuple[STATS_INDEX_NAME], buf);
@@ -3286,7 +3286,7 @@ PGAPI_Statistics(
                    set_tuplefield_int2(&tuple[STATS_NON_UNIQUE], TRUE);
 
                /* no index qualifier */
-               set_tuplefield_string(&tuple[STATS_INDEX_QUALIFIER], CurrCat(conn));
+               set_tuplefield_string(&tuple[STATS_INDEX_QUALIFIER], GET_SCHEMA_NAME(table_schemaname));
                set_tuplefield_string(&tuple[STATS_INDEX_NAME], index_name);
 
                /*
index 1ad6348aaf75e01711ac7095a288e9930bfb9229..8442b3856d558b6407e3c6d22dc5d56bc8c4dcb1 100644 (file)
--- a/loadlib.c
+++ b/loadlib.c
@@ -15,6 +15,9 @@
 #include <errno.h>
 #endif /* WIN32 */
 #ifndef NOT_USE_LIBPQ
+#ifdef RESET_CRYPTO_CALLBACKS
+#include <openssl/ssl.h>
+#endif /* RESET_CRYPTO_CALLBACKS */
 #include <libpq-fe.h>
 #endif /* NOT_USE_LIBPQ */
 #include "loadlib.h"
@@ -26,6 +29,9 @@
 #ifndef    NOT_USE_LIBPQ
 #pragma comment(lib, "libpq")
 #pragma comment(lib, "ssleay32")
+#ifdef RESET_CRYPTO_CALLBACKS
+#pragma comment(lib, "libeay32")
+#endif /* RESET_CRYPTO_CALLBACKS */
 #endif /* NOT_USE_LIBPQ */
 #ifdef _HANDLE_ENLIST_IN_DTC_
 #ifdef UNICODE_SUPPORT
@@ -40,6 +46,9 @@
 #ifndef    NOT_USE_LIBPQ
 #pragma comment(linker, "/Delayload:libpq.dll")
 #pragma comment(linker, "/Delayload:ssleay32.dll")
+#ifdef RESET_CRYPTO_CALLBACKS
+#pragma comment(linker, "/Delayload:libeay32.dll")
+#endif /* RESET_CRYPTO_CALLBACKS */
 #endif /* NOT_USE_LIBPQ */
 #ifdef UNICODE_SUPPORT
 #pragma comment(linker, "/Delayload:pgenlist.dll")
@@ -115,7 +124,7 @@ DliErrorHook(unsigned   dliNotify,
    int i;
    static const char * const libarray[] = {"libssl32", "ssleay32"};
 
-   mylog("Dli%sHook Notify=%d %p\n", (dliFailLoadLib == dliNotify || dliFailGetProc == dliNotify) ? "Error" : "Notify", dliNotify, pdli);
+   mylog("Dli%sHook %s Notify=%d\n", (dliFailLoadLib == dliNotify || dliFailGetProc == dliNotify) ? "Error" : "Notify", NULL != pdli->szDll ? pdli->szDll : pdli->dlp.szProcName, dliNotify);
    switch (dliNotify)
    {
        case dliNotePreLoadLibrary:
@@ -172,6 +181,17 @@ void CleanupDelayLoadedDLLs(void)
    /* The dll names are case sensitive for the unload helper */
    if (loaded_libpq)
    {
+#ifdef RESET_CRYPTO_CALLBACKS
+       /*
+        *  May be needed to avoid crash on exit
+        *  when libpq doesn't reset the callbacks.
+        */
+       CRYPTO_set_locking_callback(NULL);
+       CRYPTO_set_id_callback(NULL);
+       mylog("passed RESET_CRYPTO_CALLBACKS\n");
+#else
+       mylog("not passed RESET_CRYPTO_CALLBACKS\n");
+#endif /* RESET_CRYPTO_CALLBACKS */
        success = (*func)(libpqdll);
        mylog("%s unload success=%d\n", libpqdll, success);
    }
index 8f8cadf9f90da71c7e351d9faec5d02d12896265..e07571d22bd7c97312e60c16571be132dd6a799f 100644 (file)
--- a/odbcapi.c
+++ b/odbcapi.c
@@ -573,7 +573,7 @@ SQLGetStmtOption(HSTMT StatementHandle,
    SC_clear_error(stmt);
    StartRollbackState(stmt);
    ret = PGAPI_GetStmtOption(StatementHandle, Option, Value, NULL, 64);
-   ret = DiscardRollbackState(stmt, ret, FALSE);
+   ret = DiscardStatementSvp(stmt, ret, FALSE);
    LEAVE_STMT_CS(stmt);
    return ret;
 }
index df682b1f1b149b676438b0c0b3602192cdbfb0aa..f38db0ed738be736e6005eb44f049e3568f07656 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Comments:       See "notice.txt" for copyright and license information.
  *
- * $Id: psqlodbc.h,v 1.123 2008/09/21 15:35:44 hinoue Exp $
+ * $Id: psqlodbc.h,v 1.124 2008/11/23 01:00:53 hinoue Exp $
  *
  */
 
@@ -119,8 +119,8 @@ typedef UInt4   OID;
 #define    FORMAT_ULPTR    "%lu"   /* ULONG_PTR */
 #endif /* _WIN64 */
 #else
-#define    FORMAT_SIZE_T   "%xu"   /* size_t */    
-#define    FORMAT_SSIZE_T  "%xd"   /* ssize_t */
+#define    FORMAT_SIZE_T   "%zu"   /* size_t */    
+#define    FORMAT_SSIZE_T  "%zd"   /* ssize_t */
 #ifndef    HAVE_SSIZE_T
 typedef    long    ssize_t
 #endif /* HAVE_SSIZE_T */
index f465ae30d3f702497213fb8425c4bf7e3d994f82..31dcd0f2902819f77930d1608a9ae9b63be10002 100644 (file)
--- a/version.h
+++ b/version.h
@@ -9,9 +9,9 @@
 #ifndef __VERSION_H__
 #define __VERSION_H__
 
-#define POSTGRESDRIVERVERSION      "08.03.0400"
-#define POSTGRES_RESOURCE_VERSION  "08.03.0400\0"
-#define PG_DRVFILE_VERSION     8,3,04,00
-#define PG_BUILD_VERSION       "200811070001"
+#define POSTGRESDRIVERVERSION      "08.03.0401"
+#define POSTGRES_RESOURCE_VERSION  "08.03.0401\0"
+#define PG_DRVFILE_VERSION     8,3,04,01
+#define PG_BUILD_VERSION       "200811230001"
 
 #endif
index a0996d4f7799a94ed53a349549232e0fc4bacb3e..45c0e42075bd80a6920333798cb7dbe47bc66b55 100644 (file)
--- a/win32.mak
+++ b/win32.mak
@@ -70,6 +70,7 @@ SSL_LIB=C:\OpenSSL\lib\VC
 
 !IF "$(USE_LIBPQ)" != "no"
 SSL_DLL = "SSLEAY32.dll"
+RESET_CRYPTO = yes
 ADD_DEFINES = $(ADD_DEFINES) /D "SSL_DLL=\"$(SSL_DLL)\"" /D USE_SSL
 !ELSE
 ADD_DEFINES = $(ADD_DEFINES) /D NOT_USE_LIBPQ
@@ -94,6 +95,10 @@ VC_FLAGS=/GX /YX
 MSVC_VERSION=vc70
 !IF "$(USE_LIBPQ)" != "no"
 VC07_DELAY_LOAD=/DelayLoad:libpq.dll /DelayLoad:$(SSL_DLL)
+!IF "$(RESET_CRYPTO)" == "yes"
+VC07_DELAY_LOAD=$(VC07_DELAY_LOAD) /DelayLoad:libeay32.dll
+ADD_DEFINES=$(ADD_DEFINES) /D RESET_CRYPTO_CALLBACKS
+!ENDIF
 !ENDIF
 !IF "$(USE_SSPI)" == "yes"
 VC07_DELAY_LOAD=$(VC07_DELAY_LOAD) /Delayload:secur32.dll /Delayload:crypt32.dll
index fbbfcb4983007fccca52f84751a5c9de2f460d35..b4c4a949c7bd31804aae2b7df8c8bb6b559ea039 100755 (executable)
--- a/win64.mak
+++ b/win64.mak
@@ -69,6 +69,7 @@ SSL_LIB="C:\develop\lib\$(CPU)"
 !ENDIF
 
 SSL_DLL = "SSLEAY32.dll"
+RESET_CRYPTO = yes
 ADD_DEFINES = $(ADD_DEFINES) /D "SSL_DLL=\"$(SSL_DLL)\"" /D USE_SSL
 !ELSE
 ADD_DEFINES = $(ADD_DEFINES) /D NOT_USE_LIBPQ
@@ -90,12 +91,16 @@ VC07_DELAY_LOAD=
 MSDTC=no
 !ELSE
 !IF "$(USE_LIBPQ)" != "no"
-VC07_DELAY_LOAD="/DelayLoad:libpq.dll /DelayLoad:$(SSL_DLL)
+VC07_DELAY_LOAD=/DelayLoad:libpq.dll /DelayLoad:$(SSL_DLL)
+!IF "$(RESET_CRYPTO)" == "yes"
+VC07_DELAY_LOAD=$(VC07_DELAY_LOAD) /DelayLoad:libeay32.dll
+ADD_DEFINES=$(ADD_DEFINES) /D RESET_CRYPTO_CALLBACKS
+!ENDIF
 !ENDIF
 !IF "$(USE_SSPI)" == "yes"
 VC07_DELAY_LOAD=$(VC07_DELAY_LOAD) /DelayLoad:secur32.dll /Delayload:crypt32.dll
 !ENDIF
-VC07_DELAY_LOAD=$(VC07_DELAY_LOAD) /DelayLoad:$(DTCDLL) /DELAY:UNLOAD"
+VC07_DELAY_LOAD="$(VC07_DELAY_LOAD) /DelayLoad:$(DTCDLL) /DELAY:UNLOAD"
 !ENDIF
 ADD_DEFINES = $(ADD_DEFINES) /D "DYNAMIC_LOAD"