[xml/sgml-pkgs] Bug#902051: libxslt: generate-id() not returning unique IDs

ma.jiang at zte.com.cn ma.jiang at zte.com.cn
Tue Dec 3 03:21:27 GMT 2019

Dear Maintainer,
We have managed to get a unique IDs (without multi-thread). Hope this could help to get a reproducible build.

Now the ID is generated by a ptr diff. 
val = (long)((char *)cur - (char *)&base_address);
cur is the address of a xmlNsPtr node stored in a hash table(of course, eventually it's in the heap), base_address is a static variable(in a data section);

After some debug, we found there are two major disturbances that prevent a reproducible build.
First, hash functions use a random seed get from time(). So the address of nodes in hash tables(related to cur) is not stable across multi-builds.
Second, ASLR (Address Space Layout Randomization) changes the base addresses of data section and heap  every time we start a new process.

To fix the first problem, we could fake a fixed time. We currently use libfaketime, and of course eventually  something like https://gitlab.gnome.org/GNOME/libxslt/commit/e57df303eca25a2a3f9e0625c29f4b20177858cc   should be applied.

To fix the second problem, we could change the ptr diff algorithm to 
val = (long)((char *)cur -  heapStartAddr);
After this change, ALSR could not disturb ID generation anymore, because we have eliminated the base address of heap.
We have use the following patch to make the xlstproc produce stable IDs.
--- libxslt-master/libxslt/functions.c  2010-12-24 20:30:00.000000000 +0800
+++ libxslt-master-new/libxslt/functions.c      2010-12-24 20:30:00.000000000 +0800
@@ -14,7 +14,7 @@
 #include "libxslt.h"

 #include <string.h>
+#include <unistd.h>
 #include <sys/types.h>
@@ -671,6 +671,13 @@ xsltFormatNumberFunction(xmlXPathParserC

+static char *__heapStartAddr;
+static __attribute__((constructor)) void initHeapStart()
+       __heapStartAddr = sbrk(0);
  * xsltGenerateIdFunction:
  * @ctxt:  the XPath Parser context
@@ -681,7 +688,6 @@ xsltFormatNumberFunction(xmlXPathParserC
 xsltGenerateIdFunction(xmlXPathParserContextPtr ctxt, int nargs){
-    static char base_address;
     xmlNodePtr cur = NULL;
     xmlXPathObjectPtr obj = NULL;
     long val;
@@ -722,7 +728,8 @@ xsltGenerateIdFunction(xmlXPathParserCon
     if (obj)

-    val = (long)((char *)cur - (char *)&base_address);
+    val = (long)((char *)cur - __heapStartAddr);
     if (val >= 0) {
       snprintf((char *)str, sizeof(str), "idp%ld", val);
     } else {

More information about the debian-xml-sgml-pkgs mailing list