summaryrefslogtreecommitdiff
authorerik <erik>2007-01-26 21:43:58 (UTC)
committer erik <erik>2007-01-26 21:43:58 (UTC)
commit3cd37427b5c5f26f62cff583fbde914467ddafe3 (patch) (side-by-side diff)
tree664a2c1cf2198b69f94e9aa683133a3d92c98511
parentf77da1ae08512b02a3c50a124f823ed77e53dd64 (diff)
downloadopie-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.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/applets/vmemo/vmemo.cpp73
-rw-r--r--noncore/apps/opie-console/TEHistory.cpp27
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()
{