Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: [email protected]
Control: affects -1 + src:unixodbc
User: [email protected]
Usertags: pu

[ Reason ]
odbcinst2 is leaking memory. After a dlclose(), libodbcinst2 still has a
dynamically allocated ini cache and memory allocation for the odbcinst logger.

[ Impact ]
The leak occurs on all systems with ini-caching enabled at build time, which is
all Debian systems.

Broadly, the bug is impacting MariaDB ODBC connector. MariaDB developers
reported the bug to the upstream unixODBC.

[ Tests ]
See, for example, https://jira.mariadb.org/browse/MDEV-38838.

[ Risks ]
Memory leaks remain and impact systems using MariaDB and other databases with
unixODBC.

[ Checklist ]
  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in (old)stable
  [x] the issue is verified as fixed in unstable

[ Changes ]
The upstream patch declares the relevant destructor at compile time, adds
inst_logClose() to close and clear ODBCINSTLog, and calls inst_logClose() and
__clear_ini_cache() on shared library closure.

This version also introduces a new symbol, inst_logClose, which is fine.

[ Other info ]
Upstream MariaDB is requesting an upload to Debian stable, which I support (see
#1141600).
diff -Nru unixodbc-2.3.12/debian/changelog unixodbc-2.3.12/debian/changelog
--- unixodbc-2.3.12/debian/changelog    2024-12-17 22:34:56.000000000 +1100
+++ unixodbc-2.3.12/debian/changelog    2026-07-07 22:00:05.000000000 +1000
@@ -1,3 +1,11 @@
+unixodbc (2.3.12-2+deb13u1) trixie; urgency=medium
+
+  * debian/libodbcinst2.symbols: Add inst_logClose@Base.
+  * debian/patches: Clear cached allocations on dlclose() in libodbcinst2
+    (Closes: #1136221).
+
+ -- Hugh McMaster <[email protected]>  Tue, 07 Jul 2026 22:00:05 +1000
+
 unixodbc (2.3.12-2) unstable; urgency=medium
 
   * debian/control:
diff -Nru unixodbc-2.3.12/debian/libodbcinst2.symbols 
unixodbc-2.3.12/debian/libodbcinst2.symbols
--- unixodbc-2.3.12/debian/libodbcinst2.symbols 2024-12-16 18:32:11.000000000 
+1100
+++ unixodbc-2.3.12/debian/libodbcinst2.symbols 2026-07-07 21:59:05.000000000 
+1000
@@ -81,6 +81,7 @@
  iniPropertyNext@Base 2.3.1
  iniToUpper@Base 2.3.1
  iniValue@Base 2.3.1
+ inst_logClose@Base 2.3.12
  inst_logPushMsg@Base 2.3.1
  odbcinst_system_file_name@Base 2.3.1
  odbcinst_system_file_path@Base 2.3.1
diff -Nru unixodbc-2.3.12/debian/patches/1136221.patch 
unixodbc-2.3.12/debian/patches/1136221.patch
--- unixodbc-2.3.12/debian/patches/1136221.patch        1970-01-01 
10:00:00.000000000 +1000
+++ unixodbc-2.3.12/debian/patches/1136221.patch        2026-07-07 
21:59:05.000000000 +1000
@@ -0,0 +1,76 @@
+Description: Clear cached allocations on dlclose() in libodbcinst2
+ * Declare destructors at configure time.
+ * New libodbcinst2 symbol inst_logClose.
+ * Add inst_logClose() to close and clear ODBCINSTLog.
+ * Call inst_logClose() and __clear_ini_cache() on shared library closure.
+ 
+ Patch derived from upstream commits:
+   * e545d3dd29c7290a70992c1b2b1de4f6219e1a6f
+   * a2cecd22d0509bf550053e8b7d654936af4c7540
+
+ See also: https://github.com/lurcher/unixODBC/pull/234
+Author: Daniel Black, Nick Gorham
+Bug: https://github.com/lurcher/unixODBC/issues/130
+Bug: https://github.com/lurcher/unixODBC/issues/207
+Bug-Debian: https://bugs.debian.org/1136221
+Last-Updated: 2026-05-14
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -590,6 +590,20 @@
+    done
+ ])
+ 
++dnl see if we can declare a destructor
++AC_MSG_CHECKING([if __attribute__((destructor)) works])
++AC_COMPILE_IFELSE(
++    [AC_LANG_PROGRAM([__attribute__((destructor))], [int x = 0;])],
++    [
++        AC_MSG_RESULT( yes )
++        
AC_DEFINE([PORTABLE_DESTRUCTOR],[__attribute__((destructor))],[Declare function 
as a destructor])
++    ],
++    [
++        AC_MSG_RESULT( no )
++        AC_DEFINE([PORTABLE_DESTRUCTOR],[],[Declare function as a destructor])
++    ]
++)
++
+ dnl AC_SUBST(all_includes)
+ dnl AC_SUBST(all_libraries)
+ 
+--- a/odbcinst/SQLGetPrivateProfileString.c
++++ b/odbcinst/SQLGetPrivateProfileString.c
+@@ -327,6 +327,7 @@
+       mutex_exit( &mutex_ini );
+ }
+ 
++PORTABLE_DESTRUCTOR
+ void __clear_ini_cache( void ) 
+ {
+       mutex_entry( &mutex_ini );
+--- a/odbcinst/_logging.c
++++ b/odbcinst/_logging.c
+@@ -201,3 +201,15 @@
+     return ret;
+ }
+ 
++PORTABLE_DESTRUCTOR
++void inst_logClose( void )
++{
++
++    local_mutex_entry();
++
++    if ( hODBCINSTLog ) {
++        logClose( hODBCINSTLog );
++    }
++
++    local_mutex_exit();
++}
+--- a/odbcinst/odbcinst.exp
++++ b/odbcinst/odbcinst.exp
+@@ -83,4 +83,5 @@
+ iniToUpper
+ iniValue
+ inst_logPushMsg
++inst_logClose
+ __clear_ini_cache
diff -Nru unixodbc-2.3.12/debian/patches/series 
unixodbc-2.3.12/debian/patches/series
--- unixodbc-2.3.12/debian/patches/series       2024-12-16 22:02:24.000000000 
+1100
+++ unixodbc-2.3.12/debian/patches/series       2026-07-07 21:59:05.000000000 
+1000
@@ -1 +1,2 @@
 0001-configure-ac-cursor-lib.patch
+1136221.patch

Reply via email to