Re: Is the linking with -lodbc necessary? (--with-odbc)

Pavel Raiskup <[email protected]> Wed, 13 Nov 2013 11:53 +0100
Newsgroups gmane.comp.db.postgresql.odbc,gmane.comp.db.unixodbc.devel
Organization Red Hat
Message-ID <[email protected]>
This is a multi-part message in MIME format.

--nextPart1784014.CCzNHuL1ec
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"

> I attached possible solution.

I removed too much code in the previous patch.  Attached once again.

--nextPart1784014.CCzNHuL1ec
Content-Disposition: attachment; filename="0001-DM-Don-t-load-plugins-linked-back-against-libodbc.so.patch"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-patch; charset="UTF-8"; name="0001-DM-Don-t-load-plugins-linked-back-against-libodbc.so.patch"

From ae88c2c28534699f1620d2cae6bb01c9f100f4ba Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <[email protected]>
Date: Wed, 13 Nov 2013 10:37:30 +0100
Subject: [PATCH] DM: don't load plugins linked back against libodbc.so

Previously, DM tried to load and work with such plugins.  This
could result on some arm and s390 architectures (linux) to
problems with resolving API symbols.

As a solution we should not try to load such moudules and rather
fail with proper explanation.  This should force plugin developers
to not link against libodbc.so as there should not be any real
need.

For more info look at:
http://www.postgresql.org/message-id/[email protected]
---
 DriverManager/DriverManager.exp |   1 +
 DriverManager/Makefile.am       |   9 +-
 DriverManager/SQLConnect.c      | 224 ++++++++++++++++------------------------
 DriverManager/drivermanager.h   |  16 ++-
 configure.in                    |   2 +
 odbcinst/Makefile.am            |   2 +-
 6 files changed, 108 insertions(+), 146 deletions(-)

diff --git a/DriverManager/DriverManager.exp b/DriverManager/DriverManager.exp
index bb09bdb..39b801f 100644
--- a/DriverManager/DriverManager.exp
+++ b/DriverManager/DriverManager.exp
@@ -159,3 +159,4 @@ uodbc_get_stats
 uodbc_stats_error
 ODBCSetTryWaitValue
 ODBCGetTryWaitValue
+__UNIXODBC_PLUGIN_GUARD
diff --git a/DriverManager/Makefile.am b/DriverManager/Makefile.am
index d5d7421..d7162d9 100644
--- a/DriverManager/Makefile.am
+++ b/DriverManager/Makefile.am
@@ -18,16 +18,17 @@ libodbc_la_LIBADD = \
 	$(LIBICONV)
 
 libodbc_la_LDFLAGS = \
-	-version-info @LIB_VERSION@ \
+	-version-info @LIBINST_VERSION@ \
 	-no-undefined \
 	-export-dynamic \
 	-export-symbols @srcdir@/DriverManager.exp
 
 libodbc_la_DEPENDENCIES = $(LTDLDEPS) \
 	../lst/liblstlc.la \
-    ../log/libloglc.la \
-    ../ini/libinilc.la \
-    ../odbcinst/libodbcinstlc.la 
+	../log/libloglc.la \
+	../ini/libinilc.la \
+	../odbcinst/libodbcinstlc.la \
+	DriverManager.exp
 
 libodbc_la_SOURCES = \
 	SQLAllocConnect.c \
diff --git a/DriverManager/SQLConnect.c b/DriverManager/SQLConnect.c
index 306e951..a107792 100644
--- a/DriverManager/SQLConnect.c
+++ b/DriverManager/SQLConnect.c
@@ -614,122 +614,85 @@ static char const rcsid[]= "$RCSfile: SQLConnect.c,v $ $Revision: 1.66 $";
 
 static struct driver_func  template_func[] =
 {
-    /* 00 */ { SQL_API_SQLALLOCCONNECT,      "SQLAllocConnect", (void*)SQLAllocConnect },
-    /* 01 */ { SQL_API_SQLALLOCENV,          "SQLAllocEnv", (void*)SQLAllocEnv  },
-    /* 02 */ { SQL_API_SQLALLOCHANDLE,       "SQLAllocHandle", (void*)SQLAllocHandle },
-    /* 03 */ { SQL_API_SQLALLOCSTMT,         "SQLAllocStmt", (void*)SQLAllocStmt },
-    /* 04 */ { SQL_API_SQLALLOCHANDLESTD,    "SQLAllocHandleStd", (void*)SQLAllocHandleStd },
-    /* 05 */ { SQL_API_SQLBINDCOL,           "SQLBindCol", (void*)SQLBindCol },
-    /* 06 */ { SQL_API_SQLBINDPARAM,         "SQLBindParam", (void*)SQLBindParam },
-    /* 07 */ { SQL_API_SQLBINDPARAMETER,     "SQLBindParameter", (void*)SQLBindParameter },
-    /* 08 */ { SQL_API_SQLBROWSECONNECT,     "SQLBrowseConnect", 
-                (void*)SQLBrowseConnect, (void*)SQLBrowseConnectW },
-    /* 09 */ { SQL_API_SQLBULKOPERATIONS,    "SQLBulkOperations", (void*)SQLBulkOperations },
-    /* 10 */ { SQL_API_SQLCANCEL,            "SQLCancel", (void*)SQLCancel },
-    /* 11 */ { SQL_API_SQLCLOSECURSOR,       "SQLCloseCursor", (void*)SQLCloseCursor },
-    /* 12 */ { SQL_API_SQLCOLATTRIBUTE,      "SQLColAttribute", 
-                (void*)SQLColAttribute, (void*)SQLColAttributeW },
-    /* 13 */ { SQL_API_SQLCOLATTRIBUTES,     "SQLColAttributes", 
-                (void*)SQLColAttributes, (void*)SQLColAttributesW },
-    /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES,  "SQLColumnPrivileges", 
-                (void*)SQLColumnPrivileges, (void*)SQLColumnPrivilegesW },
-    /* 15 */ { SQL_API_SQLCOLUMNS,           "SQLColumns", 
-                (void*)SQLColumns, (void*)SQLColumnsW },
-    /* 16 */ { SQL_API_SQLCONNECT,           "SQLConnect", 
-                (void*)SQLConnect, (void*)SQLConnectW },
-    /* 17 */ { SQL_API_SQLCOPYDESC,          "SQLCopyDesc", (void*)SQLCopyDesc },
-    /* 18 */ { SQL_API_SQLDATASOURCES,       "SQLDataSources", 
-                (void*)SQLDataSources, (void*)SQLDataSourcesW },
-    /* 19 */ { SQL_API_SQLDESCRIBECOL,       "SQLDescribeCol", 
-                (void*)SQLDescribeCol, (void*)SQLDescribeColW },
-    /* 20 */ { SQL_API_SQLDESCRIBEPARAM,     "SQLDescribeParam", (void*)SQLDescribeParam },
-    /* 21 */ { SQL_API_SQLDISCONNECT,        "SQLDisconnect", (void*)SQLDisconnect },
-    /* 22 */ { SQL_API_SQLDRIVERCONNECT,     "SQLDriverConnect", 
-                (void*)SQLDriverConnect, (void*)SQLDriverConnectW },
-    /* 23 */ { SQL_API_SQLDRIVERS,           "SQLDrivers", 
-                (void*)SQLDrivers, (void*)SQLDriversW },
-    /* 24 */ { SQL_API_SQLENDTRAN,           "SQLEndTran", (void*)SQLEndTran },
-    /* 25 */ { SQL_API_SQLERROR,             "SQLError", 
-                (void*)SQLError, (void*)SQLErrorW },
-    /* 26 */ { SQL_API_SQLEXECDIRECT,        "SQLExecDirect", 
-                (void*)SQLExecDirect, (void*)SQLExecDirectW },
-    /* 27 */ { SQL_API_SQLEXECUTE,           "SQLExecute", (void*)SQLExecute },
-    /* 28 */ { SQL_API_SQLEXTENDEDFETCH,     "SQLExtendedFetch", (void*)SQLExtendedFetch },
-    /* 29 */ { SQL_API_SQLFETCH,             "SQLFetch", (void*)SQLFetch },
-    /* 30 */ { SQL_API_SQLFETCHSCROLL,       "SQLFetchScroll", (void*)SQLFetchScroll },
-    /* 31 */ { SQL_API_SQLFOREIGNKEYS,       "SQLForeignKeys", 
-                (void*)SQLForeignKeys, (void*)SQLForeignKeysW },
-    /* 32 */ { SQL_API_SQLFREEENV,           "SQLFreeEnv", (void*)SQLFreeEnv },
-    /* 33 */ { SQL_API_SQLFREEHANDLE,        "SQLFreeHandle", (void*)SQLFreeHandle },
-    /* 34 */ { SQL_API_SQLFREESTMT,          "SQLFreeStmt", (void*)SQLFreeStmt },
-    /* 35 */ { SQL_API_SQLFREECONNECT,       "SQLFreeConnect", (void*)SQLFreeConnect },
-    /* 36 */ { SQL_API_SQLGETCONNECTATTR,    "SQLGetConnectAttr", 
-                (void*)SQLGetConnectAttr, (void*)SQLGetConnectAttrW },
-    /* 37 */ { SQL_API_SQLGETCONNECTOPTION,  "SQLGetConnectOption", 
-                (void*)SQLGetConnectOption, (void*)SQLGetConnectOptionW },
-    /* 38 */ { SQL_API_SQLGETCURSORNAME,     "SQLGetCursorName", 
-                (void*)SQLGetCursorName, (void*)SQLGetCursorNameW },
-    /* 39 */ { SQL_API_SQLGETDATA,           "SQLGetData", (void*)SQLGetData },
-    /* 40 */ { SQL_API_SQLGETDESCFIELD,      "SQLGetDescField", 
-                (void*)SQLGetDescField, (void*)SQLGetDescFieldW },
-    /* 41 */ { SQL_API_SQLGETDESCREC,        "SQLGetDescRec", 
-                (void*)SQLGetDescRec, (void*)SQLGetDescRecW },
-    /* 42 */ { SQL_API_SQLGETDIAGFIELD,      "SQLGetDiagField", 
-                (void*)SQLGetDiagField, (void*)SQLGetDiagFieldW },
-    /* 43 */ { SQL_API_SQLGETENVATTR,        "SQLGetEnvAttr", (void*)SQLGetEnvAttr },
-    /* 44 */ { SQL_API_SQLGETFUNCTIONS,      "SQLGetFunctions", (void*)SQLGetFunctions },
-    /* 45 */ { SQL_API_SQLGETINFO,           "SQLGetInfo", 
-                (void*)SQLGetInfo, (void*)SQLGetInfoW },
-    /* 46 */ { SQL_API_SQLGETSTMTATTR,       "SQLGetStmtAttr", 
-                (void*)SQLGetStmtAttr, (void*)SQLGetStmtAttrW },
-    /* 47 */ { SQL_API_SQLGETSTMTOPTION,     "SQLGetStmtOption", (void*)SQLGetStmtOption },
-    /* 48 */ { SQL_API_SQLGETTYPEINFO,       "SQLGetTypeInfo", 
-                (void*)SQLGetTypeInfo, (void*)SQLGetTypeInfoW },
-    /* 49 */ { SQL_API_SQLMORERESULTS,       "SQLMoreResults", (void*)SQLMoreResults },
-    /* 50 */ { SQL_API_SQLNATIVESQL,         "SQLNativeSql", 
-                (void*)SQLNativeSql, (void*)SQLNativeSqlW },
-    /* 51 */ { SQL_API_SQLNUMPARAMS,         "SQLNumParams", (void*)SQLNumParams },
-    /* 52 */ { SQL_API_SQLNUMRESULTCOLS,     "SQLNumResultCols", (void*)SQLNumResultCols },
-    /* 53 */ { SQL_API_SQLPARAMDATA,         "SQLParamData", (void*)SQLParamData },
-    /* 54 */ { SQL_API_SQLPARAMOPTIONS,      "SQLParamOptions", (void*)SQLParamOptions },
-    /* 55 */ { SQL_API_SQLPREPARE,           "SQLPrepare", 
-                (void*)SQLPrepare, (void*)SQLPrepareW },
-    /* 56 */ { SQL_API_SQLPRIMARYKEYS,       "SQLPrimaryKeys", 
-                (void*)SQLPrimaryKeys, (void*)SQLPrimaryKeysW },
-    /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS,  "SQLProcedureColumns", 
-                (void*)SQLProcedureColumns, (void*)SQLProcedureColumnsW },
-    /* 58 */ { SQL_API_SQLPROCEDURES,        "SQLProcedures", 
-                (void*)SQLProcedures, (void*)SQLProceduresW },
-    /* 59 */ { SQL_API_SQLPUTDATA,           "SQLPutData", (void*)SQLPutData },
-    /* 60 */ { SQL_API_SQLROWCOUNT,          "SQLRowCount", (void*)SQLRowCount },
-    /* 61 */ { SQL_API_SQLSETCONNECTATTR,    "SQLSetConnectAttr", 
-                (void*)SQLSetConnectAttr, (void*)SQLSetConnectAttrW },
-    /* 62 */ { SQL_API_SQLSETCONNECTOPTION,  "SQLSetConnectOption", 
-                (void*)SQLSetConnectOption, (void*)SQLSetConnectOptionW },
-    /* 63 */ { SQL_API_SQLSETCURSORNAME,     "SQLSetCursorName", 
-                (void*)SQLSetCursorName, (void*)SQLSetCursorNameW },
-    /* 64 */ { SQL_API_SQLSETDESCFIELD,      "SQLSetDescField", 
-                (void*)SQLSetDescField, (void*)SQLSetDescFieldW },
-    /* 65 */ { SQL_API_SQLSETDESCREC,        "SQLSetDescRec", (void*)SQLSetDescRec },
-    /* 66 */ { SQL_API_SQLSETENVATTR,        "SQLSetEnvAttr", (void*)SQLSetEnvAttr },
-    /* 67 */ { SQL_API_SQLSETPARAM,          "SQLSetParam", (void*)SQLSetParam },
-    /* 68 */ { SQL_API_SQLSETPOS,            "SQLSetPos", (void*)SQLSetPos },
-    /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS,  "SQLSetScrollOptions", (void*)SQLSetScrollOptions },
-    /* 70 */ { SQL_API_SQLSETSTMTATTR,       "SQLSetStmtAttr", 
-                (void*)SQLSetStmtAttr, (void*)SQLSetStmtAttrW },
-    /* 71 */ { SQL_API_SQLSETSTMTOPTION,     "SQLSetStmtOption", (void*)SQLSetStmtOption },
-    /* 72 */ { SQL_API_SQLSPECIALCOLUMNS,    "SQLSpecialColumns", 
-                (void*)SQLSpecialColumns, (void*)SQLSpecialColumnsW },
-    /* 73 */ { SQL_API_SQLSTATISTICS,        "SQLStatistics", 
-                (void*)SQLStatistics, (void*)SQLStatisticsW },
-    /* 74 */ { SQL_API_SQLTABLEPRIVILEGES,   "SQLTablePrivileges", 
-                (void*)SQLTablePrivileges, (void*)SQLTablePrivilegesW },
-    /* 75 */ { SQL_API_SQLTABLES,            "SQLTables", 
-                (void*)SQLTables, (void*)SQLTablesW },
-    /* 76 */ { SQL_API_SQLTRANSACT,          "SQLTransact", (void*)SQLTransact },
-    /* 77 */ { SQL_API_SQLGETDIAGREC,        "SQLGetDiagRec", 
-                (void*)SQLGetDiagRec, (void*)SQLGetDiagRecW },
-    /* 78 */ { SQL_API_SQLCANCELHANDLE,      "SQLCancelHandle", (void*)SQLCancelHandle },
+    /* 00 */ { SQL_API_SQLALLOCCONNECT,      "SQLAllocConnect"               },
+    /* 01 */ { SQL_API_SQLALLOCENV,          "SQLAllocEnv"                   },
+    /* 02 */ { SQL_API_SQLALLOCHANDLE,       "SQLAllocHandle"                },
+    /* 03 */ { SQL_API_SQLALLOCSTMT,         "SQLAllocStmt"                  },
+    /* 04 */ { SQL_API_SQLALLOCHANDLESTD,    "SQLAllocHandleStd"             },
+    /* 05 */ { SQL_API_SQLBINDCOL,           "SQLBindCol"                    },
+    /* 06 */ { SQL_API_SQLBINDPARAM,         "SQLBindParam"                  },
+    /* 07 */ { SQL_API_SQLBINDPARAMETER,     "SQLBindParameter"              },
+    /* 08 */ { SQL_API_SQLBROWSECONNECT,     "SQLBrowseConnect",             },
+    /* 09 */ { SQL_API_SQLBULKOPERATIONS,    "SQLBulkOperations"             },
+    /* 10 */ { SQL_API_SQLCANCEL,            "SQLCancel"                     },
+    /* 11 */ { SQL_API_SQLCLOSECURSOR,       "SQLCloseCursor"                },
+    /* 12 */ { SQL_API_SQLCOLATTRIBUTE,      "SQLColAttribute",         TRUE },
+    /* 13 */ { SQL_API_SQLCOLATTRIBUTES,     "SQLColAttributes",        TRUE },
+    /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES,  "SQLColumnPrivileges",     TRUE },
+    /* 15 */ { SQL_API_SQLCOLUMNS,           "SQLColumns",              TRUE },
+    /* 16 */ { SQL_API_SQLCONNECT,           "SQLConnect",              TRUE },
+    /* 17 */ { SQL_API_SQLCOPYDESC,          "SQLCopyDesc"                   },
+    /* 18 */ { SQL_API_SQLDATASOURCES,       "SQLDataSources",          TRUE },
+    /* 19 */ { SQL_API_SQLDESCRIBECOL,       "SQLDescribeCol",          TRUE },
+    /* 20 */ { SQL_API_SQLDESCRIBEPARAM,     "SQLDescribeParam"              },
+    /* 21 */ { SQL_API_SQLDISCONNECT,        "SQLDisconnect"                 },
+    /* 22 */ { SQL_API_SQLDRIVERCONNECT,     "SQLDriverConnect",        TRUE },
+    /* 23 */ { SQL_API_SQLDRIVERS,           "SQLDrivers",              TRUE },
+    /* 24 */ { SQL_API_SQLENDTRAN,           "SQLEndTran",              TRUE },
+    /* 25 */ { SQL_API_SQLERROR,             "SQLError",                TRUE },
+    /* 26 */ { SQL_API_SQLEXECDIRECT,        "SQLExecDirect",           TRUE },
+    /* 27 */ { SQL_API_SQLEXECUTE,           "SQLExecute"                    },
+    /* 28 */ { SQL_API_SQLEXTENDEDFETCH,     "SQLExtendedFetch"              },
+    /* 29 */ { SQL_API_SQLFETCH,             "SQLFetch"                      },
+    /* 30 */ { SQL_API_SQLFETCHSCROLL,       "SQLFetchScroll"                },
+    /* 31 */ { SQL_API_SQLFOREIGNKEYS,       "SQLForeignKeys",          TRUE },
+    /* 32 */ { SQL_API_SQLFREEENV,           "SQLFreeEnv"                    },
+    /* 33 */ { SQL_API_SQLFREEHANDLE,        "SQLFreeHandle"                 },
+    /* 34 */ { SQL_API_SQLFREESTMT,          "SQLFreeStmt"                   },
+    /* 35 */ { SQL_API_SQLFREECONNECT,       "SQLFreeConnect"                },
+    /* 36 */ { SQL_API_SQLGETCONNECTATTR,    "SQLGetConnectAttr",       TRUE },
+    /* 37 */ { SQL_API_SQLGETCONNECTOPTION,  "SQLGetConnectOption",     TRUE },
+    /* 38 */ { SQL_API_SQLGETCURSORNAME,     "SQLGetCursorName",        TRUE },
+    /* 39 */ { SQL_API_SQLGETDATA,           "SQLGetData"                    },
+    /* 40 */ { SQL_API_SQLGETDESCFIELD,      "SQLGetDescField",         TRUE },
+    /* 41 */ { SQL_API_SQLGETDESCREC,        "SQLGetDescRec",           TRUE },
+    /* 42 */ { SQL_API_SQLGETDIAGFIELD,      "SQLGetDiagField",         TRUE },
+    /* 43 */ { SQL_API_SQLGETENVATTR,        "SQLGetEnvAttr"                 },
+    /* 44 */ { SQL_API_SQLGETFUNCTIONS,      "SQLGetFunctions"               },
+    /* 45 */ { SQL_API_SQLGETINFO,           "SQLGetInfo",              TRUE },
+    /* 46 */ { SQL_API_SQLGETSTMTATTR,       "SQLGetStmtAttr",          TRUE },
+    /* 47 */ { SQL_API_SQLGETSTMTOPTION,     "SQLGetStmtOption"              },
+    /* 48 */ { SQL_API_SQLGETTYPEINFO,       "SQLGetTypeInfo",          TRUE },
+    /* 49 */ { SQL_API_SQLMORERESULTS,       "SQLMoreResults"                },
+    /* 50 */ { SQL_API_SQLNATIVESQL,         "SQLNativeSql",            TRUE },
+    /* 51 */ { SQL_API_SQLNUMPARAMS,         "SQLNumParams"                  },
+    /* 52 */ { SQL_API_SQLNUMRESULTCOLS,     "SQLNumResultCols"              },
+    /* 53 */ { SQL_API_SQLPARAMDATA,         "SQLParamData"                  },
+    /* 54 */ { SQL_API_SQLPARAMOPTIONS,      "SQLParamOptions"               },
+    /* 55 */ { SQL_API_SQLPREPARE,           "SQLPrepare",              TRUE },
+    /* 56 */ { SQL_API_SQLPRIMARYKEYS,       "SQLPrimaryKeys",          TRUE },
+    /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS,  "SQLProcedureColumns",     TRUE },
+    /* 58 */ { SQL_API_SQLPROCEDURES,        "SQLProcedures",           TRUE },
+    /* 59 */ { SQL_API_SQLPUTDATA,           "SQLPutData"                    },
+    /* 60 */ { SQL_API_SQLROWCOUNT,          "SQLRowCount"                   },
+    /* 61 */ { SQL_API_SQLSETCONNECTATTR,    "SQLSetConnectAttr",       TRUE },
+    /* 62 */ { SQL_API_SQLSETCONNECTOPTION,  "SQLSetConnectOption",     TRUE },
+    /* 63 */ { SQL_API_SQLSETCURSORNAME,     "SQLSetCursorName",        TRUE },
+    /* 64 */ { SQL_API_SQLSETDESCFIELD,      "SQLSetDescField",         TRUE },
+    /* 65 */ { SQL_API_SQLSETDESCREC,        "SQLSetDescRec"                 },
+    /* 66 */ { SQL_API_SQLSETENVATTR,        "SQLSetEnvAttr"                 },
+    /* 67 */ { SQL_API_SQLSETPARAM,          "SQLSetParam"                   },
+    /* 68 */ { SQL_API_SQLSETPOS,            "SQLSetPos"                     },
+    /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS,  "SQLSetScrollOptions"           },
+    /* 70 */ { SQL_API_SQLSETSTMTATTR,       "SQLSetStmtAttr",          TRUE },
+    /* 71 */ { SQL_API_SQLSETSTMTOPTION,     "SQLSetStmtOption"              },
+    /* 72 */ { SQL_API_SQLSPECIALCOLUMNS,    "SQLSpecialColumns",       TRUE },
+    /* 73 */ { SQL_API_SQLSTATISTICS,        "SQLStatistics",           TRUE },
+    /* 74 */ { SQL_API_SQLTABLEPRIVILEGES,   "SQLTablePrivileges",      TRUE },
+    /* 75 */ { SQL_API_SQLTABLES,            "SQLTables",               TRUE },
+    /* 76 */ { SQL_API_SQLTRANSACT,          "SQLTransact"                   },
+    /* 77 */ { SQL_API_SQLGETDIAGREC,        "SQLGetDiagRec",           TRUE },
+    /* 78 */ { SQL_API_SQLCANCELHANDLE,      "SQLCancelHandle"               },
 };
 
 /*
@@ -841,10 +804,18 @@ static void *odbc_dlopen( char *libname, char **err )
 
         if ( hand )
         {
+		if ( lt_dlsym( hand, "__UNIXODBC_PLUGIN_GUARD" ))
+		{
+			lt_dlclose( hand );
+			*err = "Plugin is linked back against libodbc.so";
+			mutex_lib_exit();
+			return NULL;
+		}
+
 	        /*
 	        * If only one, then use the static space
 	        */
-    
+
 	        if ( lib_list == NULL )
 	        {
 		        list = &single_lib_count;
@@ -1239,25 +1210,6 @@ int __connect_part_one( DMHDBC connection, char *driver_lib, char *driver_name,
                 connection -> functions[ i ].funcW = NULL;
         }
 
-        /*
-         * blank out ones that are in the DM to fix a big 
-         * with glib 2.0.6
-         */
-
-		if ( connection -> functions[ i ].func &&
-			(void*)connection -> functions[ i ].func == 
-            (void*)connection -> functions[ i ].dm_func )
-		{	
-			connection -> functions[ i ].func = NULL;
-		}
-
-		if ( connection -> functions[ i ].funcW &&
-			(void*)connection -> functions[ i ].funcW == 
-            (void*)connection -> functions[ i ].dm_funcW )
-		{	
-			connection -> functions[ i ].funcW = NULL;
-		}
-
         connection -> functions[ i ].can_supply =
             ( connection -> functions[ i ].func != NULL ) || 
               ( connection -> functions[ i ].funcW != NULL );
diff --git a/DriverManager/drivermanager.h b/DriverManager/drivermanager.h
index 8aa64f9..9ed8014 100644
--- a/DriverManager/drivermanager.h
+++ b/DriverManager/drivermanager.h
@@ -124,6 +124,16 @@
 #define STATE_D1e       2
 
 /*
+ * We wan't disallow linking moudules back against the libodbc.so.  When this
+ * symbol is found in driver (plugin) corresponding driver is back linked
+ * against libodbc.so;  and it is an mistake.  Back story:
+ *
+ * http://www.postgresql.org/message-id/[email protected]
+ */
+
+SQLINTEGER __UNIXODBC_PLUGIN_GUARD;
+
+/*
  * structure to contain the loaded lib entry points
  */
 
@@ -131,11 +141,7 @@ struct driver_func
 {
     int         ordinal;
     char        *name;
-    void        *dm_func;               /* this is to fix what seems a bug in */
-			                            /* some dlopen implemnations where dlsym */
-					                    /* will return the driver manager func */
-					                    /* not the driver one */
-    void        *dm_funcW;
+    int         dm_funcW;
     SQLRETURN   (*func)();
     SQLRETURN   (*funcW)();             /* function with a unicode W */
     SQLRETURN   (*funcA)();             /* function with a unicode A */
diff --git a/configure.in b/configure.in
index e1ce44f..24a02e4 100644
--- a/configure.in
+++ b/configure.in
@@ -498,6 +498,8 @@ AC_DEFINE([UNIXODBC_SOURCE],[],[We are building inside the unixODBC source tree]
 
 LIB_VERSION="2:0:0"
 AC_SUBST(LIB_VERSION)
+LIBINST_VERSION="3:0:0"
+AC_SUBST(LIBINST_VERSION)
 
 AC_CONFIG_HEADERS(config.h)
 AC_CONFIG_HEADERS(unixodbc_conf.h)
diff --git a/odbcinst/Makefile.am b/odbcinst/Makefile.am
index dde0ed5..fb5d9da 100644
--- a/odbcinst/Makefile.am
+++ b/odbcinst/Makefile.am
@@ -8,7 +8,7 @@ EXTRA_DIST = \
 
 libodbcinst_la_LDFLAGS = \
 	-no-undefined  \
-    -version-info @LIB_VERSION@ \
+    -version-info @LIBINST_VERSION@ \
     -export-dynamic \
     -export-symbols @srcdir@/odbcinst.exp
 
-- 
1.8.4.2


--nextPart1784014.CCzNHuL1ec
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0


-- 
Sent via pgsql-odbc mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-odbc

--nextPart1784014.CCzNHuL1ec--