[freetds] Data alignment issue on freetds-0.95.8x under HP-UX B.11.31 causes core dump

Frediano Ziglio freddy77 at gmail.com
Fri Mar 25 10:16:25 EDT 2016


2016-03-24 21:02 GMT+00:00 Mike Jetzer <mjetzer.cdc at gmail.com>:
> I had this issue when I first put up freetds-0.95.80 a couple of months
> ago, and the problem persists in 0.95.88.
>
> Compiled under HP-UX B.11.31 using the "cc: HP C/aC++ B3910B A.06.20 [May
> 13 2008]" compiler in 32-bit mode.  I initially compiled with "-O", but the
> problem persists when compiling with "-g".
>
> Relevant freetds.conf info; this refers to an SQL Server database:
>         [testconn]
>                 host           = mkenday
>                 port           = 1433
>                 client charset = UTF-8
>                 tds version    = 7.3
>
> Here's the table I'm using in my feasibility study:
>         create table item
>         (
>         itm_num       nvarchar(40)  not null default '',
>         itm_desc      nvarchar(33)  not null default '',
>         shelf_life    integer       not null default 0,
>         itm_wid       decimal (9,2) not null default 0.0,
>         last_cc_dt_tm datetime2(3)  not null default '1980-01-01 00:00:00'
>         )
>
> And the one row of data I'm using:
>         insert into item ( itm_num, shelf_life, itm_wid, last_cc_dt_tm )
>         values ( 'ITM_NUM 12345', 1, 2.3, '2016-01-02 03:04:05')
>
> FreeTDS cores when attempting to do a "select * from item", either using
> tsql or the isql from unixODBC-2.3.4.  If I select only certain fields, it
> may succeed, but if I "select *" or the wrong combination of fields, it
> dumps core (the problem appears to be with the datetime2 field).
>
> Running the tsql from 0.95.88 in gdb:
>         $ gdb -q tsql
>         (gdb) run -S testconn -U osb3prog1 -P osb3prog1
>         Starting program: /u1/sqlprog/freetds-0.95.88/src/apps/tsql -S
> testconn -U osb3prog1 -P osb3prog1
>         locale is "en_US.utf8 en_US.utf8 en_US.utf8 en_US.utf8 C en_US.utf8"
>         locale charset is "utf8"
>         using default charset "UTF-8"
>         [New process 2721]
>         warning: reading register 584: No such process
>         Detaching after fork from process 2721
>         1> select * from item
>         2> go
>         itm_num itm_desc        shelf_life      itm_wid last_cc_dt_tm
>
>         Program received signal SIGBUS, Bus error
>           si_code: 1 - BUS_ADRALN - Invalid address alignment. Please refer
> to the following link that helps in handling unaligned data:
> http://docs.hp.com/en/7730/newhelp0610/pragmas.htm#pragma-pack-ex3.
>         0x4096760:1 in tds_msdatetime_get (tds=0x4002b440, col=0x4005d890)
>             at data.c:1110
>         1110                    dt->time = u8;
>         (gdb) p dt
>         $1 = (struct {...} *) 0x40060ffc
>         (gdb) p *dt
>         $2 = {time = 0, date = 0, offset = 0, time_prec = 3, _res = 0,
> has_time = 0,
>           has_date = 0, has_offset = 0}
>         (gdb) p &dt->time
>         $3 = (unsigned long long *) 0x40060ffc
>         (gdb) where
>         #0  0x4096760:1 in tds_msdatetime_get (tds=0x4002b440,
> col=0x4005d890)
>             at data.c:1110
>         #1  0x403c830:0 in tds_process_row (tds=0x4002b440) at token.c:1954
>         #2  0x403fd00:0 in tds_process_tokens (tds=0x4002b440,
> result_type=0x7fff7cb0,
>             done_flags=0x0, flag=5384) at token.c:685
>         #3  0x4026c60:0 in do_query (tds=0x4002b440,
>             buf=0x4005a1d0 "select * from item\n", opt_flags=0) at
> tsql.c:233
>         #4  0x402c1d0:0 in main (argc=7, argv=0x7fff8380) at tsql.c:872
>
> The URL to which gdb refers is no longer valid and HP doesn't have a
> redirect for it, but refers to pragmas for aligning structures.  However,
> dt is a pointer into the column_data field of a variable of type TDSCOLUMN,
> which is just an "unsigned char *", so from my cursory reading of the
> pragmas, this wouldn't help.  Additionally, there's a possibility that I'll
> also need FreeTDS under Solaris, AIX, and Linux; as FreeTDS is OpenSource I
> assume it'll work under Linux but am worried that the same issue might crop
> up under Solaris and AIX.

This came quite surprisingly. Probably 64 bit and Intel machines do
not help to detect these issues.
Fixed in git (both master and 0.95), expect a new snapshot tomorrow.

Frediano


More information about the FreeTDS mailing list