[freetds] Segmentation fault when trying to connect to a listening TCP port for another service

Frediano Ziglio freddy77 at gmail.com
Wed Aug 21 16:55:47 EDT 2013


Patch at
http://gitorious.org/freetds/freetds/commit/748aa264f71aeca777b026f62ff3ce015c7aa682

Tests at http://freetds.sourceforge.net/ show no regressions.

We should probably send some mail to get change included in packages.

Frediano



2013/8/21 Ramiro Morales <cramm0 at gmail.com>

> Hi all,
>
> As reported on pymssql issue 108
> (https://code.google.com/p/pymssql/issues/detail?id=108)
>
> The original reported experienced it under Windows. IT also kills the
> Python interpreter process under Linux.
>
> Taking pymssql/Python and Windows out of the picture. With tsql:
>
> $ tsql -H <MySQL server IP address> -p 3306
> Segmentation fault
>
> Running tsql under gdb to get the location:
>
> $ TDVER=7.1 gdb --args tsql -H <MySQL server IP address> -p 3306
> GNU gdb (GDB) 7.4.1-debian
> Copyright (C) 2012 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <
> http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-linux-gnu".
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>...
> Reading symbols from tsql...done.
> (gdb) run
> Starting program: tsql -H 172.17.2.15 -p 3306
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
> locale is "en_US.UTF-8"
> locale charset is "UTF-8"
> using default charset "UTF-8"
>
> Program received signal SIGSEGV, Segmentation fault.
> tds_read_packet (tds=tds at entry=0x63e3e0) at net.c:584
> 584             memcpy(tds->in_buf, header, 8);
>
> (gdb) bt
> #0  tds_read_packet (tds=tds at entry=0x63e3e0) at net.c:584
> #1  0x000000000040f651 in tds8_do_login (connection=0x63e860,
> tds=0x63e3e0) at login.c:1024
> #2  tds_connect (tds=tds at entry=0x63e3e0,
> connection=connection at entry=0x63e860,
> p_oserr=p_oserr at entry=0x7fffffffddec) at login.c:456
> #3  0x000000000040ffa6 in tds_connect_and_login
> (tds=tds at entry=0x63e3e0, connection=connection at entry=0x63e860) at
> login.c:506
> #4  0x0000000000403858 in main (argc=<optimized out>, argv=<optimized
> out>) at tsql.c:771
>
> (gdb) print tds->in_buf
> $1 = (unsigned char *) 0x0
>
> (gdb) print header
> $1 = "?\000\000\000\n5.0"
>
> It doesn't happen with every remote service (e.g. with SSH it simply times
> out).
>
> A patch (for the 0.91 branch):
>
> diff --git a/src/tds/net.c b/src/tds/net.c
> index 48426bb..1281613 100644
> --- a/src/tds/net.c
> +++ b/src/tds/net.c
> @@ -579,9 +579,11 @@ tds_read_packet(TDSSOCKET * tds)
>                 tds->in_buf_max = len;
>         }
>
> -       /* Clean out the in_buf so we don't use old stuff by mistake */
> -       memset(tds->in_buf, 0, tds->in_buf_max);
> -       memcpy(tds->in_buf, header, 8);
> +       if (tds->in_buf) {
> +               /* Clean out the in_buf so we don't use old stuff by
> mistake */
> +               memset(tds->in_buf, 0, tds->in_buf_max);
> +               memcpy(tds->in_buf, header, 8);
> +       }
>
>         /* Now get exactly how many bytes the server told us to get */
>         have = 8;
>
>
> With it I now get:
>
> $ tsql -H <MySQL server IP address> -p 3306
> locale is "en_US.UTF-8"
> locale charset is "UTF-8"
> using default charset "UTF-8"
> Error 20002 (severity 9):
>         Adaptive Server connection failed
> There was a problem connecting to the server
> $
>
> Regards,
>
> --
> Ramiro Morales
> @ramiromorales
> _______________________________________________
> FreeTDS mailing list
> FreeTDS at lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/freetds
>


More information about the FreeTDS mailing list