Use mkstemp() in apt-extracttemplaes (closes: #741627)
authorMichael Vogt <mvo@debian.org>
Thu, 27 Mar 2014 09:14:30 +0000 (10:14 +0100)
committerMichael Vogt <mvo@debian.org>
Thu, 27 Mar 2014 09:14:30 +0000 (10:14 +0100)
Use mkstemp() in apt-extractemplates and add a integrationtest
for apt-extracttemplates too. Thanks to Steve Kemp for the report.

cmdline/apt-extracttemplates.cc
doc/apt-extracttemplates.1.xml
test/integration/framework
test/integration/test-apt-extracttemplates [new file with mode: 0755]

index a826234..e4428e0 100644 (file)
@@ -37,6 +37,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdlib.h>
 
 #include "apt-extracttemplates.h"
 
@@ -239,23 +240,25 @@ static int ShowHelp(void)
 static string WriteFile(const char *package, const char *prefix, const char *data)
 {
        char fn[512];
-       static int i;
 
         std::string tempdir = GetTempDir();
-       snprintf(fn, sizeof(fn), "%s/%s.%s.%u%d",
+       snprintf(fn, sizeof(fn), "%s/%s.%s.XXXXXX",
                  _config->Find("APT::ExtractTemplates::TempDir", 
                                tempdir.c_str()).c_str(),
-                 package, prefix, getpid(), i++);
+                 package, prefix);
        FileFd f;
        if (data == NULL)
                data = "";
-
-       if (!f.Open(fn, FileFd::WriteTemp, 0600))
+        int fd = mkstemp(fn);
+        if (fd < 0) {
+               _error->Errno("ofstream::ofstream",_("Unable to mkstemp %s"),fn);
+                return string();
+        }
+       if (!f.OpenDescriptor(fd, FileFd::WriteOnly, FileFd::None, true))
        {
                _error->Errno("ofstream::ofstream",_("Unable to write to %s"),fn);
                return string();
        }
-
        f.Write(data, strlen(data));
        f.Close();
        return fn;
index d27e050..9f98880 100644 (file)
@@ -47,8 +47,8 @@
    <para>template-file and config-script are written to the temporary directory
    specified by the <option>-t</option> or <option>--tempdir</option>
    (<literal>APT::ExtractTemplates::TempDir</literal>) directory,
-   with filenames of the form <filename>package.template.XXXX</filename> and
-   <filename>package.config.XXXX</filename></para>
+   with filenames of the form <filename>package.template.XXXXXX</filename> and
+   <filename>package.config.XXXXXX</filename></para>
  </refsect1>
  
  <refsect1><title>options</title>
index 8e401cb..1c6f041 100644 (file)
@@ -118,6 +118,7 @@ apt() { runapt apt "$@"; }
 apthelper() { runapt "${APTHELPERBINDIR}/apt-helper" "$@"; }
 aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; }
 aptitude() { runapt aptitude "$@"; }
+aptextracttemplates() { runapt apt-extracttemplates "$@"; }
 
 dpkg() {
        command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
diff --git a/test/integration/test-apt-extracttemplates b/test/integration/test-apt-extracttemplates
new file mode 100755 (executable)
index 0000000..ae2cc8b
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+# apt-extracttemplates needs this
+insertinstalledpackage 'debconf' 'amd64' '1.5'
+insertinstalledpackage 'pkg-with-template' 'amd64' '1.0'
+
+# build a simple package that contains a config and a tempalte
+mkdir -p DEBIAN
+TEMPLATE_STR="Template: foo/bar
+Type: string
+Description: Some bar var
+"
+echo "$TEMPLATE_STR" > DEBIAN/templates
+
+CONFIG_STR="#!/bin/sh
+random shell stuff
+"
+echo "$CONFIG_STR" > DEBIAN/config
+
+buildsimplenativepackage 'pkg-with-template' 'amd64' '0.8.15' 'stable' '' 'pkg with template' '' '' './DEBIAN' 
+
+# ensure we get the right stuff out of the file
+mkdir extracttemplates-out
+OUT="$(aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template*.deb)"
+
+PKG=$(printf "$OUT" | cut -f1 -d' ')
+INSTALLED_VER=$(printf "$OUT" | cut -f2 -d' ')
+TEMPLATE=$(printf "$OUT" | cut -f3 -d' ')
+CONFIG=$(printf "$OUT" | cut -f4 -d' ')
+
+testequal "$CONFIG_STR" cat $CONFIG
+testequal "$TEMPLATE_STR" cat $TEMPLATE
+
+# ensure that the format of the output string has the right number of dots
+for s in "$CONFIG" "$TEMPLATE"; do
+    NR_DOTS=$(basename "$s" | tr -c -d .)
+    testequal ".." echo $NR_DOTS
+done