Scenario:
1. SQLSetEnvAttr (SQL_NULL_HENV,
SQL_ATTR_CONNECTION_POOLING,
(void*) SQL_CP_ONE_PER_HENV,
SQL_IS_INTEGER);
2. Each thread create its own connections synchronously.
3. Lot of SqlConnect/SqlDisconnect in each thread cause crash:
_iodbcdm_pool_get_conn (hdbc=0x99d28b8, dsn=0x80a5355 "***", uid=0x80a52d9 "***", pwd=0x0, connstr=0x0) at connect.c:793
#2 0x002070f7 in SQLConnect_Internal (hdbc=0x99d28b8, szDSN=0x80a5355, cbDSN=-3, szUID=0x80a52d9, cbUID=-3, szAuthStr=0x0, cbAuthStr=0, waMode=65 'A')
at connect.c:1935
#3 0x00207a40 in SQLConnect (hdbc=0x99d28b8, szDSN=0x80a5355 "***", cbDSN=-3, szUID=0x80a52d9 "***", cbUID=-3, szAuthStr=0x0, cbAuthStr=0)
at connect.c:2208
The problem is:
if in cycle (connect.c:785), for example first connection in list was expired and removed by _iodbcdm_pool_drop_conn,
cp_pdbc will point to the just removed connection i.e. just freed memory.
Solution:
add after call _iodbcdm_pool_drop_conn (connect.c:807)
cp_pdbc = cp_pdbc_prev;
patch