<div dir="ltr"><div>Hello masters,</div><div><br></div><div>I'm trying to use the following code in a library that extends libxml2/xmlsec1:</div><div><br></div><div><font face="monospace, monospace" size="1">...</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">typedef void (*mxml_error_callback)(void *cls, const char *msg);<br></font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">...</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">void mxml_xml_init(mxml_error_callback error_cb, void *error_cls) {</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">    void _error_callback(void *cls, const char *fmt, ...) {</font></div><div><font face="monospace, monospace" size="1">        char *error;</font></div><div><font face="monospace, monospace" size="1">        char msg[MXML_ERROR_MAX_SIZE];</font></div><div><font face="monospace, monospace" size="1">        if (NULL != error_cb) {</font></div><div><font face="monospace, monospace" size="1">            va_list va;</font></div><div><font face="monospace, monospace" size="1">            va_start(va, fmt);</font></div><div><font face="monospace, monospace" size="1">            vasprintf(&error, fmt, va);</font></div><div><font face="monospace, monospace" size="1">            strcpy(msg, error);</font></div><div><font face="monospace, monospace" size="1">            free(error);</font></div><div><font face="monospace, monospace" size="1">            va_end(va);</font></div><div><font face="monospace, monospace" size="1">            error_cb(error_cls, msg);</font></div><div><font face="monospace, monospace" size="1">        }</font></div><div><font face="monospace, monospace" size="1">    }</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">    xmlInitParser();</font></div><div><font face="monospace, monospace" size="1">    xmlSetGenericErrorFunc(error_cls, &_error_callback);</font></div><div><font face="monospace, monospace" size="1">}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">...</font></div><div><br></div><div>However, when I run my project, I got a "<font size="1" face="monospace, monospace">interrupted by signal 11: SIGSEGV</font>", even commenting the entire local code, eg:</div><div><br></div><div><font size="1" face="monospace, monospace">...</font></div><div><font size="1" face="monospace, monospace"><br></font></div><div><div><font size="1" face="monospace, monospace">void mxml_xml_init(mxml_error_callback error_cb, void *error_cls) {</font></div><div><font size="1" face="monospace, monospace">    void _error_callback(void *cls, const char *fmt, ...) {</font></div><div><font size="1" face="monospace, monospace">    }<br></font></div><div><font size="1" face="monospace, monospace">    xmlInitParser();<br></font></div><div><font size="1" face="monospace, monospace">    xmlSetGenericErrorFunc(error_cls, &_error_callback);</font></div><div><font size="1" face="monospace, monospace">}</font></div></div><div><font size="1" face="monospace, monospace"><br></font></div><div><font size="1" face="monospace, monospace">...</font></div><div><br></div><div>Unfortunately, I need to publish something like `<font size="1" face="monospace, monospace">mxml_error_callback</font>` instead of default `<span style="font-family:monospace,monospace;font-size:x-small">xmlGenericErrorFunc</span>` because some languages (eg: Pascal) doesn't offer any feature to get the parameters of a `<font size="1" face="monospace, monospace">varargs</font>` function, so I want pass only a "<font face="monospace, monospace" size="1">const char *msg</font>" to them.</div><div><br></div><div>I have other declarations like this that causes SIGSEGV too:</div><div><br></div><div><font face="monospace, monospace" size="1">...</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><div><font face="monospace, monospace" size="1">struct mxml_xml_cfg *mxml_xml_cfg_new(const char *xsd_uri,</font></div><div><font face="monospace, monospace" size="1">                                      mxml_error_callback error_cb,</font></div><div><font face="monospace, monospace" size="1">                                      mxml_error_callback warn_cb, void *error_warn_cls) {</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">    void _error_callback(void *cls, const char *fmt, ...) {</font></div><div><font face="monospace, monospace" size="1">... code ...</font></div><div><font face="monospace, monospace" size="1">    }</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">    void _warn_callback(void *cls, const char *fmt, ...) {</font></div><div><font face="monospace, monospace" size="1">... code ...</font></div><div><font face="monospace, monospace" size="1">    }</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">... code ...</font></div><div><font face="monospace, monospace" size="1">... code ...</font></div><div><font face="monospace, monospace" size="1">... code ...</font></div><div><font face="monospace, monospace" size="1">    xmlSchemaSetParserErrors(cfg->parser, &_error_callback, &_warn_callback, error_warn_cls);</font></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">...</font></div><div><br></div><div>I can't understand why it doesn't work. It seems my local function has the same signature of `<font face="monospace, monospace" size="1">xmlGenericErrorFunc</font>` function, but... :-(</div><div><br></div><div>A snip of the main test:</div><div><br></div><div><font face="monospace, monospace" size="1">...<br></font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><div><font face="monospace, monospace" size="1">static void error_callback(void *cls, const char *msg) {</font></div><div><font face="monospace, monospace" size="1">    fprintf(stderr, "%s", msg);</font></div><div><font face="monospace, monospace" size="1">}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">int main() {</font></div><div><font face="monospace, monospace" size="1">...</font></div><div><font face="monospace, monospace" size="1">    mxml_xml_init(&error_callback, NULL);</font></div></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">...</font></div><div><br></div><div>Thank you!</div><div><br></div>--<br><div class="gmail_signature"><div dir="ltr"><div>Silvio Clécio</div></div></div>
</div>