Re: Interrupted by signal 11 SIGSEGV using a nested function to handle errors
silvioprog <[email protected]> Sat, 21 Jan 2017 11:15:42 -0300
| Newsgroups | gmane.text.xml.xmlsec |
|---|---|
| Message-ID | <CAKq_V2+TRWM07stfMwd4u1EFZn5oetCg7XC3ChWgUbc2o-ZOAw@mail.gmail.com> |
Oh, please sorry. ^^' I don't know why my e-mail client sometimes send the message to a particular e-mail instead of the mail-list. o.O On Fri, Jan 20, 2017 at 12:10 AM, Aleksey Sanin <[email protected]> wrote: > Great, you might want to re-post it to the [email protected] mailing > list so people can find this post in the future. > > Aleksey > > On 1/19/17 8:14 AM, silvioprog wrote: > > Finally fixed this problem using an object as error handler! If someone > > want to take a look at the final code, it was sent to: > https://git.io/vMDNR. > > > > Thanks! :-) > > > > On Thu, Jan 19, 2017 at 11:12 AM, silvioprog <[email protected] > > <mailto:[email protected]>> wrote: > > > > Attached example that reproduces the problem. Notice commenting the > > line "#define DAMN_SIGILL 1". > > > > To compile and run: > > > > $ cmake . && make && ./sigsegv > > > > On Thu, Jan 19, 2017 at 1:10 AM, silvioprog <[email protected] > > <mailto:[email protected]>> wrote: > > > > It seems the problem is related to nested function's life cycle: > > > > 1. my `extern mxml_xml_init()` set the `_error_callback()` > > nested reference function to `xmlSetGenericErrorFunc()`; > > 2. my `mxml_xml_validate_file()` calls the > > `xmlSchemaValidateFile()`, but the `_error_callback()` was freed > > by the `mxml_xml_init()` scope, raising the SIGSEGV. > > > > But I'm not absolutely sure about it anyway. > > > > Is there functions like `xmlSetGenericErrorFunc()`, however, > > using a `va_list` parameter instead off "..." `varargs`? > > > > On Wed, Jan 18, 2017 at 9:19 PM, silvioprog > > <[email protected] <mailto:[email protected]>> wrote: > > > > Indeed. I forgot to show my environment too: > > > > Xubuntu 16.04 64 bits > > gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 > > libxml-2.0 - 2.9.3 (installed via apt-get) > > xmlsec1 - 1.2.20 (installed via apt-get) > > > > Unfortunately the GBD log[1] doesn't show any precise info > > about the error. I notice that commenting the line > > "xmlSetGenericErrorFunc(error_cls, &_error_callback);" the > > sigsegv stops, however I need to call my own callback. I > > tested declaring the "_error_callback" outside function too, > > like: > > > > void _error_callback(void *cls, const char *fmt, ...) { > > char *error; > > char msg[MXML_ERROR_MAX_SIZE]; > > // if (NULL != error_cb) { > > va_list va; > > va_start(va, fmt); > > vasprintf(&error, fmt, va); > > strcpy(msg, error); > > free(error); > > va_end(va); > > // error_cb(error_cls, msg); > > // } > > } > > > > void mxml_xml_init(mxml_error_callback error_cb, void > > *error_cls) { > > xmlInitParser(); > > xmlSetGenericErrorFunc(error_cls, &_error_callback); > > } > > > > and the problem was solved, but notice commented lines, in > > that way I can't use my "error_cb" anymore. :-( > > > > And the sigsegv happen when my library call the function > > "xmlSchemaSetValidErrors(cfg->ctxt, &_error_callback, > > &_warn_callback, error_warn_cls);". > > > > [1] > > GNU gdb (GDB) 7.11.1 > > Copyright (C) 2016 Free Software Foundation, Inc. > > License GPLv3+: GNU GPL version 3 or later > > <http://gnu.org/licenses/gpl.html > > <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-pc-linux-gnu". > > Type "show configuration" for configuration details. > > For bug reporting instructions, please see: > > <http://www.gnu.org/software/gdb/bugs/ > > <http://www.gnu.org/software/gdb/bugs/>>. > > Find the GDB manual and other documentation resources online > at: > > <http://www.gnu.org/software/gdb/documentation/ > > <http://www.gnu.org/software/gdb/documentation/>>. > > For help, type "help". > > Type "apropos word" to search for commands related to "word". > > No source file named > > /home/silvioprog/dev/git/ws/libmicroxml/src/microxml.c. > > [Thread debugging using libthread_db enabled] > > Using host libthread_db library > > "/lib/x86_64-linux-gnu/libthread_db.so.1". > > > > Breakpoint 1, main (argc=3, argv=0x7fffffffe158) at > > /home/silvioprog/dev/git/ws/libmicroxml/examples/c/ > validate.c:19 > > 19 if (3 != argc) { > > > > Breakpoint 2, mxml_xml_init (error_cb=0x400a06 > > <error_callback>) at > > /home/silvioprog/dev/git/ws/libmicroxml/src/microxml.c:85 > > 85 xmlSetGenericErrorFunc(error_cls, &_error_callback); > > > > Program received signal SIGSEGV, Segmentation fault. > > 0x00007fffffffdf10 in ?? () > > > > On Wed, Jan 18, 2017 at 8:20 PM, Aleksey Sanin > > <[email protected] <mailto:[email protected]>> wrote: > > > > You probably want to get a precise location of sigsegv > > with gdb. > > > > Aleksey > > > > On 1/18/17 2:49 PM, silvioprog wrote: > > > Hello masters, > > > > > > I'm trying to use the following code in a library that > > extends > > > libxml2/xmlsec1: > > > > > > ... > > > > > > typedef void (*mxml_error_callback)(void *cls, const > > char *msg); > > > > > > ... > > > > > > void mxml_xml_init(mxml_error_callback error_cb, void > > *error_cls) { > > > > > > void _error_callback(void *cls, const char *fmt, > > ...) { > > > char *error; > > > char msg[MXML_ERROR_MAX_SIZE]; > > > if (NULL != error_cb) { > > > va_list va; > > > va_start(va, fmt); > > > vasprintf(&error, fmt, va); > > > strcpy(msg, error); > > > free(error); > > > va_end(va); > > > error_cb(error_cls, msg); > > > } > > > } > > > > > > xmlInitParser(); > > > xmlSetGenericErrorFunc(error_cls, > &_error_callback); > > > } > > > > > > ... > > > > > > However, when I run my project, I got a "interrupted > > by signal 11: > > > SIGSEGV", even commenting the entire local code, eg: > > > > > > ... > > > > > > void mxml_xml_init(mxml_error_callback error_cb, void > > *error_cls) { > > > void _error_callback(void *cls, const char *fmt, > > ...) { > > > } > > > xmlInitParser(); > > > xmlSetGenericErrorFunc(error_cls, > &_error_callback); > > > } > > > > > > ... > > > > > > Unfortunately, I need to publish something like > > `mxml_error_callback` > > > instead of default `xmlGenericErrorFunc` because some > > languages (eg: > > > Pascal) doesn't offer any feature to get the > > parameters of a `varargs` > > > function, so I want pass only a "const char *msg" to > them. > > > > > > I have other declarations like this that causes > > SIGSEGV too: > > > > > > ... > > > > > > struct mxml_xml_cfg *mxml_xml_cfg_new(const char > *xsd_uri, > > > > > mxml_error_callback error_cb, > > > > > mxml_error_callback warn_cb, void > > > *error_warn_cls) { > > > > > > void _error_callback(void *cls, const char *fmt, > > ...) { > > > ... code ... > > > } > > > > > > void _warn_callback(void *cls, const char *fmt, > ...) { > > > ... code ... > > > } > > > > > > ... code ... > > > ... code ... > > > ... code ... > > > xmlSchemaSetParserErrors(cfg->parser, > > &_error_callback, > > > &_warn_callback, error_warn_cls); > > > > > > ... > > > > > > I can't understand why it doesn't work. It seems my > > local function has > > > the same signature of `xmlGenericErrorFunc` function, > > but... :-( > > > > > > A snip of the main test: > > > > > > ... > > > > > > static void error_callback(void *cls, const char *msg) > { > > > fprintf(stderr, "%s", msg); > > > } > > > > > > int main() { > > > ... > > > mxml_xml_init(&error_callback, NULL); > > > > > > ... > > > > > > Thank you! > > > > > > -- > > > Silvio Clécio > > > > > > -- > > Silvio Clécio > > > > > > -- > > Silvio Clécio > > > > > > -- > > Silvio Clécio > > > > > > -- > > Silvio Clécio > -- Silvio Clécio _______________________________________________ xmlsec mailing list [email protected] http://www.aleksey.com/mailman/listinfo/xmlsec