Re: [xslt] small patch for xsltFreeStylePreComps()
- From: Daniel Veillard <veillard redhat com>
- To: The Gnome XSLT library mailing-list <xslt gnome org>
- Subject: Re: [xslt] small patch for xsltFreeStylePreComps()
- Date: Wed, 3 May 2006 04:18:06 -0400
On Tue, May 02, 2006 at 07:54:14PM -0700, Aleksey Sanin wrote:
> Hello, All!
>
> I run into a small problem with re-using XSLT stylesheet document
> in the following scenario (the same xmlDocPtr is used for more
> than one stylesheet):
>
> xmlDocPtr xslt_doc;
> xsltStylesheetPtr stylesheet;
>
> xslt_doc = ... ; /* Get xslt doc somehow */
> ...
>
> /* use doc stylesheet first time */
> stylesheet = xsltParseStylesheetDoc(xslt_doc);
> out1 = xsltApplyStylesheet(stylesheet, in1);
> ... /* consume out1 */
> xsltFreeStylesheet(stylesheet);
>
> ...
>
> /* use doc stylesheet first time */
> stylesheet = xsltParseStylesheetDoc(xslt_doc);
> out2 = xsltApplyStylesheet(stylesheet, in2); <--- crash
> ... /* consume out2 */
> xsltFreeStylesheet(stylesheet);
>
>
> I understand that this is probably a corner case scenario since
> it is much better to do not re-create xsltStylesheetPtr second
> time. But at the moment it is not possible to do in my case.
>
> It turns out that the crash is caused by invalid pointer in
> "psvi" member of xmlNodePtr. The actual data structure was freed
> by the first xsltFreeStylesheet() call but the "psvi" pointer
> was still pointed to it. The attached patch fixes the problem by
> making sure that we cleanup this "psvi" pointer when we destroy
> the data structure.
>
> I would appreciate if someone can take a look at the patch and
> check that it is not doing something stupid :)
stylesheet compilation modifies the input doc, a lot ...
The patch may make sense, but you should really reparse the input.
Or find a way to reuse the compiled stylesheet.
> diff -ur libxslt/preproc.c libxslt/preproc.c
> --- libxslt/preproc.c 2005-03-29 05:12:59.000000000 -0800
> +++ libxslt/preproc.c 2006-05-02 19:09:33.682620800 -0700
> @@ -1321,6 +1321,8 @@
> cur = style->preComps;
> while (cur != NULL) {
> next = cur->next;
> + if(cur->inst != NULL)
> + cur->inst->psvi = NULL;
> if (cur->type == XSLT_FUNC_EXTENSION)
> cur->free(cur);
> else
I defer to Kasimier for this since he's playing with this at the moment.
Daniel
--
Daniel Veillard | Red Hat http://redhat.com/
veillard redhat com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]