author | erik <erik> | 2007-01-26 21:43:58 (UTC) |
---|---|---|
committer | erik <erik> | 2007-01-26 21:43:58 (UTC) |
commit | 3cd37427b5c5f26f62cff583fbde914467ddafe3 (patch) (side-by-side diff) | |
tree | 664a2c1cf2198b69f94e9aa683133a3d92c98511 | |
parent | f77da1ae08512b02a3c50a124f823ed77e53dd64 (diff) | |
download | opie-3cd37427b5c5f26f62cff583fbde914467ddafe3.zip opie-3cd37427b5c5f26f62cff583fbde914467ddafe3.tar.gz opie-3cd37427b5c5f26f62cff583fbde914467ddafe3.tar.bz2 |
Both files in this commit exhibit the wrong way to use temporary files.
For TEHistory.cpp, it uses tmpfile() which produces a file which has a
name that can be guessed.
For vmemo.cpp, it uses tmpname() which only creates a predictable string.
Both uses have been switched to using mkstemp() wrapped around umask(). This
produces a much less predictable file that also has guaranteed restrictive
permissions.
I went a little farther in vmemo because it calls out to the shell using
system to 'mv' the new file. That is kinda wasteful so I switched it to use
rename instead.
-rw-r--r-- | core/applets/vmemo/vmemo.cpp | 73 | ||||
-rw-r--r-- | noncore/apps/opie-console/TEHistory.cpp | 27 |
2 files changed, 72 insertions, 28 deletions
diff --git a/core/applets/vmemo/vmemo.cpp b/core/applets/vmemo/vmemo.cpp index 8ba1eb7..1a8f154 100644 --- a/core/applets/vmemo/vmemo.cpp +++ b/core/applets/vmemo/vmemo.cpp @@ -320,60 +320,83 @@ bool VMemo::startRecording() { fName = "vm_"+ date + ".wav"; fileName += fName; odebug << "filename is " + fileName << oendl; useAlerts = config.readBoolEntry("Alert",1); if(useAlerts) { msgLabel = new QLabel( 0, "alertLabel" ); msgLabel->setText( tr("<B><P><font size=+2>VMemo-Recording</font></B><p>%1</p>").arg("vm_"+ date)); msgLabel->show(); } -// open tmp file here - char *pointer; - pointer=tmpnam(NULL); - odebug << "Opening tmp file " << pointer << "" << oendl; + // open tmp file here + char *tmpFilePath = 0; + char *tmpDir = getenv("TMPDIR"); + if (tmpDir && *tmpDir != '\0') { + tmpFilePath = new char[strlen(tmpDir) + strlen("/vmemo-wav-XXXXXX") + 1]; + strcpy(tmpFilePath, tmpDir); + free(tmpDir); + } else { + tmpFilePath = new char[strlen("/tmp/vmemo-wav-XXXXXX") + 1]; + strcpy(tmpFilePath, "/tmp"); + } + strcat(tmpFilePath, "/vmemo-wav-XXXXXX"); + mode_t currUmask = umask(S_IRWXO | S_IRWXG); + int tmpFd = mkstemp(tmpFilePath); + umask(currUmask); + if (tmpFd == -1) { + owarn << "Could not open temp file with template " << tmpFilePath + << oendl; + delete [] tmpFilePath; + return false; + } else + odebug << "Opened temp file " << tmpFilePath << "" << oendl; + + close(tmpFd); - if(openWAV(pointer ) == -1) { + if(openWAV(tmpFilePath ) == -1) { QString err("Could not open the temp file\n"); err += fileName; QMessageBox::critical(0, "vmemo", err, "Abort"); ::close(dsp); return false; } if( record() ) { - QString cmd; - if( fileName.find(".wav",0,true) == -1) - fileName += ".wav"; + if( fileName.find(".wav",0,true) == -1) + fileName += ".wav"; - cmd.sprintf("mv %s "+fileName, pointer); -// move tmp file to regular file here - - system(cmd.latin1()); - - QArray<int> cats(1); - cats[0] = config.readNumEntry("Category", 0); - - QString dlName("vm_"); - dlName += date; - DocLnk l; - l.setFile(fileName); - l.setName(dlName); - l.setType("audio/x-wav"); - l.setCategories(cats); - l.writeLink(); - return true; + int retVal = rename(tmpFilePath, fileName.local8Bit()); + if (retVal == -1) { + owarn << "Could not move " << tmpFilePath << " to " << fileName + << oendl; + delete [] tmpFilePath; + return false; + } + delete [] tmpFilePath; + + QArray<int> cats(1); + cats[0] = config.readNumEntry("Category", 0); + + QString dlName("vm_"); + dlName += date; + DocLnk l; + l.setFile(fileName); + l.setName(dlName); + l.setType("audio/x-wav"); + l.setCategories(cats); + l.writeLink(); + return true; } else return false; } void VMemo::stopRecording() { // show(); odebug << "Stopped recording" << oendl; recording = false; if(useAlerts) { msgLabel->close(); msgLabel=0; diff --git a/noncore/apps/opie-console/TEHistory.cpp b/noncore/apps/opie-console/TEHistory.cpp index 317ce57..e2be42a 100644 --- a/noncore/apps/opie-console/TEHistory.cpp +++ b/noncore/apps/opie-console/TEHistory.cpp @@ -12,24 +12,25 @@ /* */ /* Ported Konsole to Qt/Embedded */ /* */ /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ /* */ /* -------------------------------------------------------------------------- */ #include "TEHistory.h" #include <stdlib.h> #include <assert.h> #include <stdio.h> #include <sys/types.h> +#include <sys/stat.h> #include <unistd.h> #include <errno.h> #define HERE printf("%s(%d): here\n",__FILE__,__LINE__) /* An arbitrary long scroll. One can modify the scroll only by adding either cells or newlines, but access it randomly. The model is that of an arbitrary wide typewriter scroll @@ -87,27 +88,47 @@ HistoryBuffer::~HistoryBuffer() { setScroll(FALSE); } void HistoryBuffer::setScroll(bool on) { if (on == hasScroll()) return; if (on) { assert( ion < 0 ); assert( length == 0); - FILE* tmp = tmpfile(); if (!tmp) { perror("konsole: cannot open temp file.\n"); return; } - ion = dup(fileno(tmp)); if (ion<0) perror("konsole: cannot dup temp file.\n"); - fclose(tmp); + char* tmpDir = getenv("TMPDIR"); + char* tmpFilePath = 0; + if (tmpDir && *tmpDir != '\0') { + tmpFilePath = new char[strlen(tmpDir) + strlen("/opie-console-HistoryBuffer-XXXXXX") + 1]; + strcpy(tmpFilePath, tmpDir); + free(tmpDir); + } else { + tmpFilePath = new char[strlen("/tmp/opie-console-HistoryBuffer-XXXXXX") + 1]; + strcpy(tmpFilePath, "/tmp"); + } + strcat(tmpFilePath, "/opie-console-HistoryBuffer-XXXXXX"); + mode_t currUmask = umask(S_IRWXO | S_IRWXG); + int tmpfd = mkstemp(tmpFilePath); + delete [] tmpFilePath; + umask(currUmask); + if (tmpfd == -1) { + perror("konsole: cannot open temp file.\n"); + return; + } + ion = dup(tmpfd); + if (ion<0) + perror("konsole: cannot dup temp file.\n"); + close(tmpfd); } else { assert( ion >= 0 ); close(ion); ion = -1; length = 0; } } bool HistoryBuffer::hasScroll() { |