[Gambas-user] Issue 226 in gambas: SIGSEGV handler overwritten (for too long)
gambas at ...2524...
gambas at ...2524...
Thu Mar 29 17:31:15 CEST 2012
Status: New
Owner: ----
Labels: Version Type-Bug Priority-Medium OpSys-Any Dist-Any Arch-Any
Desktop-Any GUI-Any
New issue 226 by x1F3O3X7x at ...626...: SIGSEGV handler overwritten (for too
long)
http://code.google.com/p/gambas/issues/detail?id=226
1) Describe the problem.
"main/gbx/gbx_stream_memory.c"
In "static int stream_read(STREAM *stream, char *buffer, int len)" the
current SIGSEGV signal handler is replaced by CHECK_enter(). This is
probably done to catch errors during memory access.
However, a problem arises when using a library which also uses a SIGSEGV
handler, and at the same time uses a background thread which depends on
that particular handler.
I was not yet able to test this further, but when the background thread
crashes the gambas signal handler seems to receive the error, it will
therefore crash. You get a signal #11 error from gambas.
The same problem also applies to the "type@()" functions.
2) GIVE THE FOLLOWING INFORMATIONS (if they are appropriate):
Version: TRUNK
Revision: All, at the time of writing r4384
Operating system: All, tested on Linux
Distribution: All, tested on ArchLinux
Architecture: All, tested on x86_64
GUI component: All
Desktop used: All
3) Provide a little project that reproduces the bug or the crash.
4) If your project needs a database, try to provide it, or part of it.
Not necessary yet
5) Explain clearly how to reproduce the bug or the crash.
1. Create a thread in an "extern" function and set up a SIGSEGV handler
a2. In the thread, do something to trigger the SIGSEGV handler
a3. In the SIGSEGV handler handle the error and continue execution
b2. Try to access memory using a pointer from your gambas application
4. *Crash*
A possible solution would be to add an "unsafe" mode which would disable
the CHECK_* signal handlers. An alternative would be to warn the user if an
error handler was already installed before, then continue without error
handling.
As a temporary solution I wrote my own set of memory access functions in
another library which simply work like the "type@" functions. However, this
requires unnecessary support code. It also means that you have to carry a
module or classname around.
However, this probably affects other functions using the CHECK_*()
functions too.
More information about the User
mailing list