Sophie

Sophie

distrib > Mandriva > 2011.0 > i586 > by-pkgid > 452d4a4265055c84ee2241e5b681dbe4 > files > 1

libxslt-1.1.26-4.3.src.rpm


http://gitorious.org/libxslt/libxslt/commit/ecb6bcb8d1b7e44842edde3929f412d46b40c89f?format=patch

--- libxslt/functions.c	2012-10-08 12:49:09.000000000 +0000
+++ libxslt/functions.c.oden	2012-10-08 12:49:21.000000000 +0000
@@ -654,8 +654,9 @@ xsltFormatNumberFunction(xmlXPathParserC
 void
 xsltGenerateIdFunction(xmlXPathParserContextPtr ctxt, int nargs){
     xmlNodePtr cur = NULL;
-    unsigned long val;
-    xmlChar str[20];
+    long val;
+    xmlChar str[30];
+    xmlDocPtr doc;
 
     if (nargs == 0) {
 	cur = ctxt->context->node;
@@ -694,9 +695,24 @@ xsltGenerateIdFunction(xmlXPathParserCon
      * Okay this is ugly but should work, use the NodePtr address
      * to forge the ID
      */
-    val = (unsigned long)((char *)cur - (char *)0);
-    val /= sizeof(xmlNode);
-    sprintf((char *)str, "id%ld", val);
+    if (cur->type != XML_NAMESPACE_DECL)
+        doc = cur->doc;
+    else {
+        xmlNsPtr ns = (xmlNsPtr) cur;
+
+        if (ns->context != NULL)
+            doc = ns->context;
+        else
+            doc = ctxt->context->doc;
+
+    }
+
+    val = (long)((char *)cur - (char *)doc);
+    if (val >= 0) {
+      sprintf((char *)str, "idp%ld", val);
+    } else {
+      sprintf((char *)str, "idm%ld", -val);
+    }
     valuePush(ctxt, xmlXPathNewString(str));
 }