Bug#382178: gda2-freetds: FreeTDS segfaults if DSN contains
DATABASE=
Gert-jan Los
los at rz.uni-mannheim.de
Wed Aug 9 12:15:44 UTC 2006
Package: gda2-freetds
Version: 1.2.3-2
Severity: normal
Tags: patch
The presence of a DATABASE field in the DNS of a FreeTDS-Provider
causes an segmentation fault at time of connection.
Cause:
- gda_client_open_connection() wants to switch to the
given <DATABASE>
- gda_freetds_execute_cmd() will be called with an argument
of "USE <DATABASE>"
- tds_process_result_tokens() sets tds_cnc->tds->res_info
to NULL
- tds_cnc->tds->res_info->rows_exist refers to a NULL pointer
Solution:
- Test for tds_cnc->tds->res_info != NULL before access of
rows_exist
Two additional fixes showed necessary:
- tds_process_result_tokens() takes 3 instead of 2 arguments
- tds_free_connection() was misspelt as tds_free_connect()
Example configuration:
<libgda-config>
<section path="/apps/libgda/Datasources/EXAMPLE">
<entry name="Provider" type="string" value="FreeTDS"/>
<entry name="Description" type="string" value="Test"/>
<entry name="DSN" type="string" value="HOST=localhost;DATABASE=testdb"/>
</section>
</libgda-config>
Patch:
diff -ru libgda-1.2.3/providers/freetds/gda-freetds-provider.c libgda-1.2.3.mod/providers/freetds/gda-freetds-provider.c
--- libgda-1.2.3/providers/freetds/gda-freetds-provider.c 2004-12-28 14:26:11.000000000 +0100
+++ libgda-1.2.3.mod/providers/freetds/gda-freetds-provider.c 2006-08-09 13:39:56.000000000 +0200
@@ -358,7 +358,7 @@
}
if (tds_cnc->config) {
#ifdef HAVE_FREETDS_VER0_6X
- tds_free_connect (tds_cnc->config);
+ tds_free_connection (tds_cnc->config);
#else
tds_free_config(tds_cnc->config);
#endif
@@ -803,12 +803,12 @@
/* there should not be any result tokens */
#ifdef HAVE_FREETDS_VER0_6X
- while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds, &tds_cnc->result_type))
+ while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds, &tds_cnc->result_type, NULL))
#else
while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds))
#endif
== TDS_SUCCEED) {
- if (tds_cnc->tds->res_info->rows_exist) {
+ if (tds_cnc->tds->res_info && tds_cnc->tds->res_info->rows_exist) {
gda_log_error (_("Unexpected result tokens in execute_cmd()."));
error = gda_freetds_make_error (tds_cnc->tds,
_("Unexpected result tokens in execute_cmd()."));
diff -ru libgda-1.2.3/providers/freetds/gda-freetds-recordset.c libgda-1.2.3.mod/providers/freetds/gda-freetds-recordset.c
--- libgda-1.2.3/providers/freetds/gda-freetds-recordset.c 2004-12-28 14:26:11.000000000 +0100
+++ libgda-1.2.3.mod/providers/freetds/gda-freetds-recordset.c 2006-08-09 13:27:48.000000000 +0200
@@ -341,7 +341,7 @@
#ifdef HAVE_FREETDS_VER0_6X
while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds,
- &tds_cnc->result_type))
+ &tds_cnc->result_type, NULL))
== TDS_SUCCEED) {
if (tds_cnc->result_type == TDS_ROW_RESULT) {
gint row_type, compute_id;
-- System Information:
Debian Release: testing/unstable
APT prefers testing
APT policy: (990, 'testing'), (90, 'unstable'), (80, 'experimental')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.17-1-686
Locale: LANG=C, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Versions of packages gda2-freetds depends on:
ii libc6 2.3.6-15 GNU C Library: Shared libraries
ii libct3 0.63-3 libraries for connecting to MS SQL
ii libgda2-3 1.2.3-2 GNOME Data Access library for GNOM
ii libglib2.0-0 2.10.3-3 The GLib library of C routines
ii libxml2 2.6.26.dfsg-3 GNOME XML library
ii libxslt1.1 1.1.17-2 XSLT processing library - runtime
ii zlib1g 1:1.2.3-13 compression library - runtime
gda2-freetds recommends no packages.
-- no debconf information
More information about the Pkg-gnome-maintainers
mailing list