From 84658d37e2eb1358c054ad41f3032f2b3684497f Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Thu, 8 Feb 2018 12:16:30 +0100 Subject: [PATCH] Remove createTempFile method and use the new and safer tempFileName() method instead for the creation of temporary directories --- src/support/filetools.cpp | 39 +++++++++++---------------------------- src/support/filetools.h | 2 +- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index bcfd1b6c9e..7bff99dcd1 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -40,7 +40,6 @@ #include "support/TempFile.h" #include -#include #include "support/lassert.h" #include "support/regex.h" @@ -460,7 +459,7 @@ string const commandPrep(string const & command_in) } -FileName const tempFileName(string const & mask) +FileName const tempFileName(string const & mask, bool const dir) { FileName tempfile = TempFile(mask).name(); // Since the QTemporaryFile object is destroyed at function return @@ -475,11 +474,16 @@ FileName const tempFileName(string const & mask) // OK, we need another name. Simply append digits. FileName tmp = tempfile; - tmp.changeExtension(""); + string ext; + if (!dir) { + // Store and remove extensions + ext = "." + tempfile.extension(); + tmp.changeExtension(""); + } for (int i = 1; i < INT_MAX ;++i) { // Append digit to filename and re-add extension - string const new_fn = tmp.absFileName() + convert(i) - + "." + tempfile.extension(); + string const new_fn = + tmp.absFileName() + convert(i) + ext; if (tmp_names_.find(new_fn) == tmp_names_.end()) { tmp_names_.insert(new_fn); tempfile.set(new_fn); @@ -505,35 +509,14 @@ void removeTempFile(FileName const & fn) } -static string createTempFile(QString const & mask) -{ - // FIXME: This is not safe. QTemporaryFile creates a file in open(), - // but the file is deleted when qt_tmp goes out of scope. - // Therefore the next call to createTempFile() may create the - // same file again. To make this safe the QTemporaryFile object - // needs to be kept for the whole life time of the temp file name. - // This could be achieved by creating a class TempDir (like - // TempFile, but using a currently non-existing - // QTemporaryDirectory object). - QTemporaryFile qt_tmp(mask + ".XXXXXXXXXXXX"); - if (qt_tmp.open()) { - string const temp_file = fromqstr(qt_tmp.fileName()); - LYXERR(Debug::FILES, "Temporary file `" << temp_file << "' created."); - return temp_file; - } - LYXERR(Debug::FILES, "Unable to create temporary file with following template: " - << qt_tmp.fileTemplate()); - return string(); -} - - static FileName createTmpDir(FileName const & tempdir, string const & mask) { LYXERR(Debug::FILES, "createTmpDir: tempdir=`" << tempdir << "'\n" << "createTmpDir: mask=`" << mask << '\''); QFileInfo tmp_fi(QDir(toqstr(tempdir.absFileName())), toqstr(mask)); - FileName const tmpfl(createTempFile(tmp_fi.absoluteFilePath())); + FileName const tmpfl = + tempFileName(fromqstr(tmp_fi.absoluteFilePath()) + ".XXXXXXXXXXXX", true); if (tmpfl.empty() || !tmpfl.createDirectory(0700)) { LYXERR0("LyX could not create temporary directory in " << tempdir diff --git a/src/support/filetools.h b/src/support/filetools.h index 3a4c2c566d..6a9abc1eeb 100644 --- a/src/support/filetools.h +++ b/src/support/filetools.h @@ -40,7 +40,7 @@ static std::set tmp_names_; * all used temp file names. * If you don't have to remove the temp file manually, use TempFile instead! */ -FileName const tempFileName(std::string const &); +FileName const tempFileName(std::string const &, bool const dir = false); /// Remove and unregister a temporary file. void removeTempFile(FileName const &); -- 2.39.2