From e504ce6bc65aa3a4ab06eca1b2c8ec9e435b6561 Mon Sep 17 00:00:00 2001 From: Hoa Nguyen Date: Fri, 25 Sep 2020 15:26:40 -0700 Subject: [PATCH] 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 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/35195 Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg Tested-by: kokoro --- src/arch/arm/semihosting.cc | 21 +++++++++++++++------ src/arch/arm/semihosting.hh | 4 ++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/arch/arm/semihosting.cc b/src/arch/arm/semihosting.cc index bd7b617cf..901fdd17b 100644 --- a/src/arch/arm/semihosting.cc +++ b/src/arch/arm/semihosting.cc @@ -37,10 +37,14 @@ #include "arch/arm/semihosting.hh" +#include + +#include #include #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 buf(L_tmpnam); - char *path = tmpnam(buf.data()); - if (!path) - return retError(EINVAL); + std::string path = ""; + int64_t unlink_call_ret = 0; + + 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 = strlen(path); + 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); } diff --git a/src/arch/arm/semihosting.hh b/src/arch/arm/semihosting.hh index e9dc984e2..da0644fd8 100644 --- a/src/arch/arm/semihosting.hh +++ b/src/arch/arm/semihosting.hh @@ -581,6 +581,10 @@ class ArmSemihosting : public SimObject static const std::map exitCodes; static const std::vector features; static const std::map stdioMap; + + // used in callTmpNam() to deterministically generate a temp filename + uint16_t tmpNameIndex = 0; + }; std::ostream &operator << ( -- 2.30.2