summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeonardo Boshell <leonardop@gentoo.org>2006-03-31 00:43:32 +0000
committerLeonardo Boshell <leonardop@gentoo.org>2006-03-31 00:43:32 +0000
commit505fedc9f4e9e13a5417d8a20ca3e6622e0d7d56 (patch)
tree99bb877e91acc0418d9e7ee7b9451552272b550f /dev-libs/libxslt/files
parentAdd ~x86-fbsd keyword. (diff)
downloadgentoo-2-505fedc9f4e9e13a5417d8a20ca3e6622e0d7d56.tar.gz
gentoo-2-505fedc9f4e9e13a5417d8a20ca3e6622e0d7d56.tar.bz2
gentoo-2-505fedc9f4e9e13a5417d8a20ca3e6622e0d7d56.zip
Added patch to fix a segfault under certain scenarios (bug #106992). Dropped static USE flag.
(Portage version: 2.1_pre7-r2)
Diffstat (limited to 'dev-libs/libxslt/files')
-rw-r--r--dev-libs/libxslt/files/digest-libxslt-1.1.15-r13
-rw-r--r--dev-libs/libxslt/files/libxslt-1.1.15-pattern_fix.patch448
2 files changed, 451 insertions, 0 deletions
diff --git a/dev-libs/libxslt/files/digest-libxslt-1.1.15-r1 b/dev-libs/libxslt/files/digest-libxslt-1.1.15-r1
new file mode 100644
index 000000000000..ed0997e82420
--- /dev/null
+++ b/dev-libs/libxslt/files/digest-libxslt-1.1.15-r1
@@ -0,0 +1,3 @@
+MD5 0a48d1a723d5338b246702ab1769e7bf libxslt-1.1.15.tar.bz2 1822862
+RMD160 8a560fdc635a2ab8d74ba95f9a98236a52204573 libxslt-1.1.15.tar.bz2 1822862
+SHA256 6322124f471d6ed4908833cddaba512b247aa169cb8d1ebd87219afe051c6e03 libxslt-1.1.15.tar.bz2 1822862
diff --git a/dev-libs/libxslt/files/libxslt-1.1.15-pattern_fix.patch b/dev-libs/libxslt/files/libxslt-1.1.15-pattern_fix.patch
new file mode 100644
index 000000000000..ed1433ce0d34
--- /dev/null
+++ b/dev-libs/libxslt/files/libxslt-1.1.15-pattern_fix.patch
@@ -0,0 +1,448 @@
+diff -NurdB libxslt-1.1.15/libxslt/pattern.c libxslt-1.1.15-patched/libxslt/pattern.c
+--- libxslt-1.1.15/libxslt/pattern.c 2005-09-04 17:41:43.000000000 -0500
++++ libxslt-1.1.15-patched/libxslt/pattern.c 2006-03-30 19:23:03.000000000 -0500
+@@ -268,6 +268,7 @@
+ * @op: an op
+ * @value: the first value
+ * @value2: the second value
++ * @novar: flag to set XML_XPATH_NOVAR
+ *
+ * Add an step to an XSLT Compiled Match
+ *
+@@ -275,7 +276,7 @@
+ */
+ static int
+ xsltCompMatchAdd(xsltParserContextPtr ctxt, xsltCompMatchPtr comp,
+- xsltOp op, xmlChar * value, xmlChar * value2)
++ xsltOp op, xmlChar * value, xmlChar * value2, int novar)
+ {
+ if (comp->nbStep >= 40) {
+ xsltTransformError(NULL, NULL, NULL,
+@@ -308,7 +309,8 @@
+ else
+ xctxt = xmlXPathNewContext(NULL);
+ #ifdef XML_XPATH_NOVAR
+- xctxt->flags = XML_XPATH_NOVAR;
++ if (novar != 0)
++ xctxt->flags = XML_XPATH_NOVAR;
+ #endif
+ if (ctxt->style != NULL)
+ xctxt->dict = ctxt->style->dict;
+@@ -317,7 +319,8 @@
+ if (comp->steps[comp->nbStep].comp == NULL) {
+ xsltTransformError(NULL, ctxt->style, ctxt->elem,
+ "Failed to compile predicate\n");
+- ctxt->style->errors++;
++ if (ctxt->style != NULL)
++ ctxt->style->errors++;
+ }
+ }
+ comp->nbStep++;
+@@ -1181,8 +1184,8 @@
+ #define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur)
+
+
+-#define PUSH(op, val, val2) \
+- if (xsltCompMatchAdd(ctxt, ctxt->comp, (op), (val), (val2))) goto error;
++#define PUSH(op, val, val2, novar) \
++ if (xsltCompMatchAdd(ctxt, ctxt->comp, (op), (val), (val2), (novar))) goto error;
+
+ #define SWAP() \
+ xsltSwapTopCompMatch(ctxt->comp);
+@@ -1358,6 +1361,7 @@
+ * @ctxt: the compilation context
+ * @name: a preparsed name
+ * @aid: whether id/key are allowed there
++ * @novar: flag to prohibit xslt var
+ *
+ * Compile the XSLT LocationIdKeyPattern
+ * [3] IdKeyPattern ::= 'id' '(' Literal ')'
+@@ -1370,7 +1374,8 @@
+ * | 'processing-instruction' '(' Literal ')'
+ */
+ static void
+-xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name, int aid) {
++xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
++ int aid, int novar) {
+ xmlChar *lit = NULL;
+ xmlChar *lit2 = NULL;
+
+@@ -1394,7 +1399,7 @@
+ return;
+ }
+ NEXT;
+- PUSH(XSLT_OP_ID, lit, NULL);
++ PUSH(XSLT_OP_ID, lit, NULL, novar);
+ } else if ((aid) && (xmlStrEqual(name, (const xmlChar *)"key"))) {
+ NEXT;
+ SKIP_BLANKS;
+@@ -1422,7 +1427,7 @@
+ }
+ NEXT;
+ /* TODO: support namespace in keys */
+- PUSH(XSLT_OP_KEY, lit, lit2);
++ PUSH(XSLT_OP_KEY, lit, lit2, novar);
+ } else if (xmlStrEqual(name, (const xmlChar *)"processing-instruction")) {
+ NEXT;
+ SKIP_BLANKS;
+@@ -1439,7 +1444,7 @@
+ }
+ }
+ NEXT;
+- PUSH(XSLT_OP_PI, lit, NULL);
++ PUSH(XSLT_OP_PI, lit, NULL, novar);
+ } else if (xmlStrEqual(name, (const xmlChar *)"text")) {
+ NEXT;
+ SKIP_BLANKS;
+@@ -1450,7 +1455,7 @@
+ return;
+ }
+ NEXT;
+- PUSH(XSLT_OP_TEXT, NULL, NULL);
++ PUSH(XSLT_OP_TEXT, NULL, NULL, novar);
+ } else if (xmlStrEqual(name, (const xmlChar *)"comment")) {
+ NEXT;
+ SKIP_BLANKS;
+@@ -1461,7 +1466,7 @@
+ return;
+ }
+ NEXT;
+- PUSH(XSLT_OP_COMMENT, NULL, NULL);
++ PUSH(XSLT_OP_COMMENT, NULL, NULL, novar);
+ } else if (xmlStrEqual(name, (const xmlChar *)"node")) {
+ NEXT;
+ SKIP_BLANKS;
+@@ -1472,7 +1477,7 @@
+ return;
+ }
+ NEXT;
+- PUSH(XSLT_OP_NODE, NULL, NULL);
++ PUSH(XSLT_OP_NODE, NULL, NULL, novar);
+ } else if (aid) {
+ xsltTransformError(NULL, NULL, NULL,
+ "xsltCompileIdKeyPattern : expecting 'key' or 'id' or node type\n");
+@@ -1493,6 +1498,7 @@
+ * xsltCompileStepPattern:
+ * @ctxt: the compilation context
+ * @token: a posible precompiled name
++ * @novar: flag to prohibit xslt variables from pattern
+ *
+ * Compile the XSLT StepPattern and generates a precompiled
+ * form suitable for fast matching.
+@@ -1511,7 +1517,7 @@
+ */
+
+ static void
+-xsltCompileStepPattern(xsltParserContextPtr ctxt, xmlChar *token) {
++xsltCompileStepPattern(xsltParserContextPtr ctxt, xmlChar *token, int novar) {
+ xmlChar *name = NULL;
+ const xmlChar *URI = NULL;
+ xmlChar *URL = NULL;
+@@ -1524,7 +1530,7 @@
+ NEXT;
+ if (CUR == '*') {
+ NEXT;
+- PUSH(XSLT_OP_ATTR, NULL, NULL);
++ PUSH(XSLT_OP_ATTR, NULL, NULL, novar);
+ goto parse_predicate;
+ }
+ token = xsltScanQName(ctxt, &prefix);
+@@ -1544,7 +1550,7 @@
+ if (token == NULL) {
+ if (CUR == '*') {
+ NEXT;
+- PUSH(XSLT_OP_ATTR, NULL, URL);
++ PUSH(XSLT_OP_ATTR, NULL, URL, novar);
+ return;
+ }
+ xsltTransformError(NULL, NULL, NULL,
+@@ -1552,7 +1558,7 @@
+ ctxt->error = 1;
+ goto error;
+ }
+- PUSH(XSLT_OP_ATTR, token, URL);
++ PUSH(XSLT_OP_ATTR, token, URL, novar);
+ goto parse_predicate;
+ }
+ if (token == NULL)
+@@ -1560,7 +1566,7 @@
+ if (token == NULL) {
+ if (CUR == '*') {
+ NEXT;
+- PUSH(XSLT_OP_ALL, token, NULL);
++ PUSH(XSLT_OP_ALL, token, NULL, novar);
+ goto parse_predicate;
+ } else {
+ xsltTransformError(NULL, NULL, NULL,
+@@ -1573,7 +1579,7 @@
+
+ SKIP_BLANKS;
+ if (CUR == '(') {
+- xsltCompileIdKeyPattern(ctxt, token, 0);
++ xsltCompileIdKeyPattern(ctxt, token, 0, novar);
+ if (ctxt->error)
+ goto error;
+ } else if (CUR == ':') {
+@@ -1600,7 +1606,7 @@
+ if (token == NULL) {
+ if (CUR == '*') {
+ NEXT;
+- PUSH(XSLT_OP_NS, URL, NULL);
++ PUSH(XSLT_OP_NS, URL, NULL, novar);
+ } else {
+ xsltTransformError(NULL, NULL, NULL,
+ "xsltCompileStepPattern : Name expected\n");
+@@ -1608,7 +1614,7 @@
+ goto error;
+ }
+ } else {
+- PUSH(XSLT_OP_ELEM, token, URL);
++ PUSH(XSLT_OP_ELEM, token, URL, novar);
+ }
+ } else {
+ NEXT;
+@@ -1618,7 +1624,7 @@
+ if (token == NULL) {
+ if (CUR == '*') {
+ NEXT;
+- PUSH(XSLT_OP_ALL, token, NULL);
++ PUSH(XSLT_OP_ALL, token, NULL, novar);
+ goto parse_predicate;
+ } else {
+ xsltTransformError(NULL, NULL, NULL,
+@@ -1636,7 +1642,7 @@
+ if (URI != NULL)
+ URL = xmlStrdup(URI);
+ }
+- PUSH(XSLT_OP_CHILD, name, URL);
++ PUSH(XSLT_OP_CHILD, name, URL, novar);
+ } else if (xmlStrEqual(token, (const xmlChar *) "attribute")) {
+ xmlFree(token);
+ token = xsltScanName(ctxt);
+@@ -1655,7 +1661,7 @@
+ if (URI != NULL)
+ URL = xmlStrdup(URI);
+ }
+- PUSH(XSLT_OP_ATTR, name, URL);
++ PUSH(XSLT_OP_ATTR, name, URL, novar);
+ } else {
+ xsltTransformError(NULL, NULL, NULL,
+ "xsltCompileStepPattern : 'child' or 'attribute' expected\n");
+@@ -1666,7 +1672,7 @@
+ }
+ } else if (CUR == '*') {
+ NEXT;
+- PUSH(XSLT_OP_ALL, token, NULL);
++ PUSH(XSLT_OP_ALL, token, NULL, novar);
+ } else {
+ URI = xsltGetQNameURI(ctxt->elem, &token);
+ if (token == NULL) {
+@@ -1675,7 +1681,7 @@
+ }
+ if (URI != NULL)
+ URL = xmlStrdup(URI);
+- PUSH(XSLT_OP_ELEM, token, URL);
++ PUSH(XSLT_OP_ELEM, token, URL, novar);
+ }
+ parse_predicate:
+ SKIP_BLANKS;
+@@ -1713,7 +1719,7 @@
+ return;
+ }
+ ret = xmlStrndup(q, CUR_PTR - q);
+- PUSH(XSLT_OP_PREDICATE, ret, NULL);
++ PUSH(XSLT_OP_PREDICATE, ret, NULL, novar);
+ /* push the predicate lower than local test */
+ SWAP();
+ NEXT;
+@@ -1731,6 +1737,7 @@
+ * xsltCompileRelativePathPattern:
+ * @comp: the compilation context
+ * @token: a posible precompiled name
++ * @novar: flag to prohibit xslt variables
+ *
+ * Compile the XSLT RelativePathPattern and generates a precompiled
+ * form suitable for fast matching.
+@@ -1740,24 +1747,24 @@
+ * | RelativePathPattern '//' StepPattern
+ */
+ static void
+-xsltCompileRelativePathPattern(xsltParserContextPtr ctxt, xmlChar *token) {
+- xsltCompileStepPattern(ctxt, token);
++xsltCompileRelativePathPattern(xsltParserContextPtr ctxt, xmlChar *token, int novar) {
++ xsltCompileStepPattern(ctxt, token, novar);
+ if (ctxt->error)
+ goto error;
+ SKIP_BLANKS;
+ while ((CUR != 0) && (CUR != '|')) {
+ if ((CUR == '/') && (NXT(1) == '/')) {
+- PUSH(XSLT_OP_ANCESTOR, NULL, NULL);
++ PUSH(XSLT_OP_ANCESTOR, NULL, NULL, novar);
+ NEXT;
+ NEXT;
+ SKIP_BLANKS;
+- xsltCompileStepPattern(ctxt, NULL);
++ xsltCompileStepPattern(ctxt, NULL, novar);
+ } else if (CUR == '/') {
+- PUSH(XSLT_OP_PARENT, NULL, NULL);
++ PUSH(XSLT_OP_PARENT, NULL, NULL, novar);
+ NEXT;
+ SKIP_BLANKS;
+ if ((CUR != 0) && (CUR != '|')) {
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ }
+ } else {
+ ctxt->error = 1;
+@@ -1773,6 +1780,7 @@
+ /**
+ * xsltCompileLocationPathPattern:
+ * @ctxt: the compilation context
++ * @novar: flag to prohibit xslt variables
+ *
+ * Compile the XSLT LocationPathPattern and generates a precompiled
+ * form suitable for fast matching.
+@@ -1782,7 +1790,7 @@
+ * | '//'? RelativePathPattern
+ */
+ static void
+-xsltCompileLocationPathPattern(xsltParserContextPtr ctxt) {
++xsltCompileLocationPathPattern(xsltParserContextPtr ctxt, int novar) {
+ SKIP_BLANKS;
+ if ((CUR == '/') && (NXT(1) == '/')) {
+ /*
+@@ -1792,22 +1800,22 @@
+ NEXT;
+ NEXT;
+ ctxt->comp->priority = 0.5; /* '//' means not 0 priority */
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ } else if (CUR == '/') {
+ /*
+ * We need to find root as the parent
+ */
+ NEXT;
+ SKIP_BLANKS;
+- PUSH(XSLT_OP_ROOT, NULL, NULL);
++ PUSH(XSLT_OP_ROOT, NULL, NULL, novar);
+ if ((CUR != 0) && (CUR != '|')) {
+- PUSH(XSLT_OP_PARENT, NULL, NULL);
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ PUSH(XSLT_OP_PARENT, NULL, NULL, novar);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ }
+ } else if (CUR == '*') {
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ } else if (CUR == '@') {
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ } else {
+ xmlChar *name;
+ name = xsltScanName(ctxt);
+@@ -1819,34 +1827,35 @@
+ }
+ SKIP_BLANKS;
+ if ((CUR == '(') && !xmlXPathIsNodeType(name)) {
+- xsltCompileIdKeyPattern(ctxt, name, 1);
++ xsltCompileIdKeyPattern(ctxt, name, 1, novar);
+ if ((CUR == '/') && (NXT(1) == '/')) {
+- PUSH(XSLT_OP_ANCESTOR, NULL, NULL);
++ PUSH(XSLT_OP_ANCESTOR, NULL, NULL, novar);
+ NEXT;
+ NEXT;
+ SKIP_BLANKS;
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ } else if (CUR == '/') {
+- PUSH(XSLT_OP_PARENT, NULL, NULL);
++ PUSH(XSLT_OP_PARENT, NULL, NULL, novar);
+ NEXT;
+ SKIP_BLANKS;
+- xsltCompileRelativePathPattern(ctxt, NULL);
++ xsltCompileRelativePathPattern(ctxt, NULL, novar);
+ }
+ return;
+ }
+- xsltCompileRelativePathPattern(ctxt, name);
++ xsltCompileRelativePathPattern(ctxt, name, novar);
+ }
+ error:
+ return;
+ }
+
+ /**
+- * xsltCompilePattern:
++ * xsltCompilePatternInternal:
+ * @pattern: an XSLT pattern
+ * @doc: the containing document
+ * @node: the containing element
+ * @style: the stylesheet
+ * @runtime: the transformation context, if done at run-time
++ * @novar: flag to prohibit xslt variables
+ *
+ * Compile the XSLT pattern and generates a list of precompiled form suitable
+ * for fast matching.
+@@ -1856,10 +1865,10 @@
+ * Returns the generated pattern list or NULL in case of failure
+ */
+
+-xsltCompMatchPtr
+-xsltCompilePattern(const xmlChar *pattern, xmlDocPtr doc,
++static xsltCompMatchPtr
++xsltCompilePatternInternal(const xmlChar *pattern, xmlDocPtr doc,
+ xmlNodePtr node, xsltStylesheetPtr style,
+- xsltTransformContextPtr runtime) {
++ xsltTransformContextPtr runtime, int novar) {
+ xsltParserContextPtr ctxt = NULL;
+ xsltCompMatchPtr element, first = NULL, previous = NULL;
+ int current, start, end, level, j;
+@@ -1938,7 +1947,7 @@
+ This may be changed by xsltCompileLocationPathPattern.
+ */
+ element->priority = 0;
+- xsltCompileLocationPathPattern(ctxt);
++ xsltCompileLocationPathPattern(ctxt, novar);
+ if (ctxt->error) {
+ xsltTransformError(NULL, style, node,
+ "xsltCompilePattern : failed to compile '%s'\n",
+@@ -2013,6 +2022,29 @@
+ return(NULL);
+ }
+
++/**
++ * xsltCompilePattern:
++ * @pattern: an XSLT pattern
++ * @doc: the containing document
++ * @node: the containing element
++ * @style: the stylesheet
++ * @runtime: the transformation context, if done at run-time
++ *
++ * Compile the XSLT pattern and generates a list of precompiled form suitable
++ * for fast matching.
++ *
++ * [1] Pattern ::= LocationPathPattern | Pattern '|' LocationPathPattern
++ *
++ * Returns the generated pattern list or NULL in case of failure
++ */
++
++xsltCompMatchPtr
++xsltCompilePattern(const xmlChar *pattern, xmlDocPtr doc,
++ xmlNodePtr node, xsltStylesheetPtr style,
++ xsltTransformContextPtr runtime) {
++ return (xsltCompilePatternInternal(pattern, doc, node, style, runtime, 0));
++}
++
+ /************************************************************************
+ * *
+ * Module interfaces *
+@@ -2041,7 +2073,8 @@
+ return(-1);
+
+ priority = cur->priority;
+- pat = xsltCompilePattern(cur->match, style->doc, cur->elem, style, NULL);
++ pat = xsltCompilePatternInternal(cur->match, style->doc, cur->elem,
++ style, NULL, 1);
+ while (pat) {
+ next = pat->next;
+ pat->next = NULL;