arch-arm: Replace call to tmpnam() by a deterministic one
According to the documentation, the use of tmpnam() should be avoided. This commit generates a temporary filename by concat-ing the object name with an index that is internally tracked, the index is increased until a filename that is not being used is found. JIRA: https://gem5.atlassian.net/browse/GEM5-206 Change-Id: Ibfe604d741b6b7d7b02fc051add217f95f81d05e Signed-off-by: Hoa Nguyen <hoanguyen@ucdavis.edu> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/35195 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -37,10 +37,14 @@
|
||||
|
||||
#include "arch/arm/semihosting.hh"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include <cerrno>
|
||||
#include <cstdio>
|
||||
|
||||
#include "arch/arm/utility.hh"
|
||||
#include "base/logging.hh"
|
||||
#include "base/output.hh"
|
||||
#include "base/time.hh"
|
||||
#include "debug/Semihosting.hh"
|
||||
#include "dev/serial/serial.hh"
|
||||
@@ -449,16 +453,21 @@ ArmSemihosting::RetErrno
|
||||
ArmSemihosting::callTmpNam(ThreadContext *tc, Addr addr, uint64_t id,
|
||||
size_t size)
|
||||
{
|
||||
std::vector<char> buf(L_tmpnam);
|
||||
char *path = tmpnam(buf.data());
|
||||
if (!path)
|
||||
return retError(EINVAL);
|
||||
std::string path = "";
|
||||
int64_t unlink_call_ret = 0;
|
||||
|
||||
const size_t path_len = strlen(path);
|
||||
do {
|
||||
path = simout.resolve(csprintf("%s.tmp%05i", name(), tmpNameIndex++));
|
||||
// remove the (potentially existing) file of the given path
|
||||
unlink_call_ret = unlink(path.c_str());
|
||||
// if the file is busy, find another name
|
||||
} while ((unlink_call_ret < 0) && (errno == EBUSY));
|
||||
|
||||
const size_t path_len = path.length();
|
||||
if (path_len >= size)
|
||||
return retError(ENOSPC);
|
||||
|
||||
portProxy(tc).writeBlob(addr, path, path_len + 1);
|
||||
portProxy(tc).writeBlob(addr, path.c_str(), path_len + 1);
|
||||
return retOK(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -581,6 +581,10 @@ class ArmSemihosting : public SimObject
|
||||
static const std::map<uint64_t, const char *> exitCodes;
|
||||
static const std::vector<uint8_t> features;
|
||||
static const std::map<const std::string, FILE *> stdioMap;
|
||||
|
||||
// used in callTmpNam() to deterministically generate a temp filename
|
||||
uint16_t tmpNameIndex = 0;
|
||||
|
||||
};
|
||||
|
||||
std::ostream &operator << (
|
||||
|
||||
Reference in New Issue
Block a user