[xml/sgml-pkgs] Bug#518907: xmlto litters /tmp with xmlto-xsl.* files

Jonathan Nieder jrnieder at gmail.com
Mon Mar 9 06:21:53 UTC 2009


Package: xmlto
Version: 0.0.21-4
Tags: patch

Building git-core results in around 150 xmlto-xsl.* files in /tmp with
content like
       <?xml version='1.0'?>
       <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                       version='1.0'>
       <xsl:param name="page.height">279.4mm</xsl:param>
       <xsl:param name="page.width">215.9mm</xsl:param>
       ...

Probably this is because of xmlto.in, line 108:
       papersizemod=$(${MKTEMP} ${TMPDIR:-/tmp}/@PACKAGE at -xsl.XXXXXX)
which creates a file that, once xmlto_libpaper_173090.dpatch has been
applied, will never be added to CLEANFILES.

A patch analogous to xmlto_libpaper_173090.dpatch should work.

On the other hand, it seems that if mktemp fails, xmlto will not
handle it very gracefully. In some cases (as with the libpaper patch),
the program will plunge on unaware, eventually producing an error due
to the missing filename. In others cases, xmlto will exit immediately
without explaining why. So I would prefer something like the attached
patch. It also has the advantage of making it harder to regress to
this bug's behavior again.

Tested by rebuilding git-core. The mktemp failure handling can be
tested by setting TMPDIR to some ridiculous value.

Thanks,
Jonathan
-------------- next part --------------
diff --git a/xmlto.in b/xmlto.in
index 24ba478..067f127 100755
--- a/xmlto.in
+++ b/xmlto.in
@@ -68,6 +68,31 @@ EOF
   fi
 }
 
+# make_temp [-d] filenametag varname [message upon failure]
+#
+# Wrapper for 'varname=$(mktemp /tmp/xmlto-$filenametag.XXXXXX)'.
+#  * Remembers the temporary file's name so it can be deleted on exit
+#  * If the failure message is empty or missing, exits on failure
+make_temp () {
+  local dirflag="" prefix="@PACKAGE@"
+  [ "$1" = "-d" ] && { dirflag="-d"; shift; }
+  [ -n "$1" ] && prefix="@PACKAGE at -$1"
+
+  if eval $2='$(${MKTEMP} $dirflag "${TMPDIR:-/tmp}/${prefix}.XXXXXX")'
+  then
+    eval 'CLEANFILES[$CLEANFILE_COUNT]="${'$2'}"'
+    CLEANFILE_COUNT=$(($CLEANFILE_COUNT + 1))
+    return 0
+  elif [ -z "$3" ]
+  then
+    echo >&2 "mktemp failed!"
+    exit 1
+  else
+    echo >&2 "mktemp failed. $3"
+    return 1
+  fi
+}
+
 # Allow FORMAT_DIR to be over-ridden, so that we can be
 # run from the build directory.
 prefix=@prefix@
@@ -105,7 +130,7 @@ then
 
   if [ -n "$paperheight" -a -n "$paperwidth" ]
   then
-    papersizemod=$(${MKTEMP} ${TMPDIR:-/tmp}/@PACKAGE at -xsl.XXXXXX)
+    make_temp xsl papersizemod "Using default paper type." &&
     cat << EOF > "$papersizemod"
 <?xml version='1.0'?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -139,7 +164,7 @@ then
 
   if [ -n "$papertype" ]
   then
-    papersizemod=$(${MKTEMP} ${TMPDIR:-/tmp}/@PACKAGE at -xsl.XXXXXX)
+    make_temp xsl papersizemod "Using default paper type." &&
     cat << EOF > "$papersizemod"
 <?xml version='1.0'?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -157,10 +182,9 @@ then
 
   if [ -n "$charmap" ]
   then
-    encodingmod=$(${MKTEMP} ${TMPDIR:-/tmp}/@PACKAGE at -xsl.XXXXXX)
-    CLEANFILES[$CLEANFILE_COUNT]="$encodingmod"
-    CLEANFILE_COUNT=$(($CLEANFILE_COUNT + 1))
-    cat << EOF > "$encodingmod"
+    if make_temp xsl encodingmod "Using default output encoding."
+    then
+      cat << EOF > "$encodingmod"
 <?xml version='1.0'?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		 version='1.0'>
@@ -168,8 +192,9 @@ then
 <xsl:param name="man.charmap.use.subset" select="'0'"/>
 </xsl:stylesheet>
 EOF
-    XSL_MODS[$XSL_MOD_COUNT]="$encodingmod"
-    XSL_MOD_COUNT=$(($XSL_MOD_COUNT + 1))
+      XSL_MODS[$XSL_MOD_COUNT]="$encodingmod"
+      XSL_MOD_COUNT=$(($XSL_MOD_COUNT + 1))
+    fi
   fi
 fi
 
@@ -216,9 +241,7 @@ while [ "$#" -gt "0" ]; do
	;;
   -x)
	case "$2" in
-	-)  TMP_STYLESHEET="$(${MKTEMP} ${TMPDIR:-/tmp}/@PACKAGE at -stdin-xsl.XXXXXX)" || exit 1
-	    CLEANFILES[$CLEANFILE_COUNT]="$TMP_STYLESHEET"
-	    CLEANFILE_COUNT=$(($CLEANFILE_COUNT + 1))
+	-)  make_temp stdin-xsl TMP_STYLESHEET
	    cat /dev/stdin > ${TMP_STYLESHEET}
	    STYLESHEET=${TMP_STYLESHEET} ;;
	/*) STYLESHEET="$2" ;;
@@ -337,8 +360,6 @@ case "$DEST_FORMAT" in
   fo | pdf | ps | dvi)
     if [ -n "$papersizemod" ]
     then
-      CLEANFILES[$CLEANFILE_COUNT]="$papersizemod"
-      CLEANFILE_COUNT=$(($CLEANFILE_COUNT + 1))
       XSL_MODS[$XSL_MOD_COUNT]="$papersizemod"
       XSL_MOD_COUNT=$(($XSL_MOD_COUNT + 1))
     fi
@@ -393,9 +414,7 @@ if [ "$XSL_MOD_COUNT" -gt "0" -a -n "$STYLESHEET" ]
 then
   REAL_STYLESHEET="$STYLESHEET"
   [ "$VERBOSE" -ge 1 ] && echo >&2 "Real stylesheet: ${REAL_STYLESHEET}"
-  STYLESHEET="$(${MKTEMP} ${TMPDIR:-/tmp}/@PACKAGE at -xsl.XXXXXX)" || exit 1
-  CLEANFILES[$CLEANFILE_COUNT]="$STYLESHEET"
-  CLEANFILE_COUNT=$(($CLEANFILE_COUNT + 1))
+  make_temp xsl STYLESHEET
   cat << EOF > "$STYLESHEET"
 <?xml version='1.0'?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -417,9 +436,7 @@ EOF
 EOF
 fi
 
-XSLT_PROCESSED_DIR="$(${MKTEMP} -d ${TMPDIR:-/tmp}/@PACKAGE at .XXXXXX)" || exit 1
-CLEANFILES[$CLEANFILE_COUNT]="$XSLT_PROCESSED_DIR"
-CLEANFILE_COUNT=$(($CLEANFILE_COUNT + 1))
+make_temp -d "" XSLT_PROCESSED_DIR
 cd "$XSLT_PROCESSED_DIR"
 
 # Validate the input


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