[bug fix] ECPG app crashes due to SIGBUS on SPARC Solaris
От | MauMau |
---|---|
Тема | [bug fix] ECPG app crashes due to SIGBUS on SPARC Solaris |
Дата | |
Msg-id | 549B5DA0D5354DFE9787D73B07D5BFC1@maumau обсуждение исходный текст |
Ответы |
Re: [bug fix] ECPG app crashes due to SIGBUS on SPARC Solaris
Re: [bug fix] ECPG app crashes due to SIGBUS on SPARC Solaris |
Список | pgsql-hackers |
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 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
Вложения
В списке pgsql-hackers по дате отправления: