Re: [bug fix] ECPG app crashes due to SIGBUS on SPARC Solaris

From: Boszormenyi Zoltan <zb(at)cybertec(dot)at>
To: MauMau <maumau307(at)gmail(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: [bug fix] ECPG app crashes due to SIGBUS on SPARC Solaris
Date: 2013-12-24 20:48:00
Message-ID: 52B9F300.50904@cybertec.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

2013-12-24 13:55 kelteze'ssel, MauMau i'rta:
> Hello,
>
> I encountered a bug of ECPG with PG 9.2.4, which probably exists in all releases. The
> attached patch is for 9.4. Could you review and backport this to at least 9.2 and later?
>
>
> [Problem]
> The attached ECPG app

The app wasn't attached, only the patch.
If this is a small test app, it can also be a part of the patch in the form of a
regression test.

> crashes and dumps core with SIGBUS on Solaris for SPARC. I used Solaris 10, and Oracle
> Studio to compile the app for 64-bit build. The same app completes successfully on Linux
> and Windows for x86/x564.
>
> The steps to reproduce the problem is:
> 1. ecpg sigbus.pgc
> 2. cc -xtarget=generic64 -I<pgsql_dir>/include sigbus.c -L<pgsql_dir>/lib -lecpg
> 3. a.out
>
> When execting FETCH statement using an SQL descriptor, the app crashes at the following
> line in ECPGdo(), which is in src/interfaces/ecpg/ecpglib/execute.c:
>
> var->value = *((char **) (var->pointer));
>
>
> [Cause]
> ecpg outputs the following line in the preprocessed source file:
>
> { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0",
> ECPGt_char,(cur),(long)4,(long)1,(4)*sizeof(char),
> ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
> ECPGt_descriptor, (desc1), 0L, 0L, 0L,
> ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
>
> So, the above line is executed in ECPGdo(). On the other hand, desc1 is not aligned on
> 8-byte boundary. This unaligned access causes SIGBUS.
>
>
> [Fix]
> Because desc1 is a char array, else block should be executed instead of the above path.
>
> var->value = var->pointer;
>
> Therefore, make ecpg pass SQL descriptor host variables to ECPGdo() with non-zero lengths.
>
>
> Regards
> MauMau
>
>

--
----------------------------------
Zolta'n Bo"szo"rme'nyi
Cybertec Scho"nig & Scho"nig GmbH
Gro"hrmu"hlgasse 26
A-2700 Wiener Neustadt, Austria
Web: http://www.postgresql-support.de
http://www.postgresql.at/

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Geoghegan 2013-12-24 21:18:36 Re: INSERT...ON DUPLICATE KEY LOCK FOR UPDATE
Previous Message Kohei KaiGai 2013-12-24 20:34:39 Re: sepgsql: label regression test failed