summaryrefslogtreecommitdiff
path: root/lib/System/Unix
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-07-12 00:09:55 +0000
committerChris Lattner <sabre@nondot.org>2010-07-12 00:09:55 +0000
commit1f01109254039f392c559ddc74349b51ec76d4a9 (patch)
tree8604dfe21623e57f5b9b8eff13a534da2f6c3303 /lib/System/Unix
parent7791080151a5a8bbda073551289469301d006fcb (diff)
downloadllvm-1f01109254039f392c559ddc74349b51ec76d4a9.tar.gz
llvm-1f01109254039f392c559ddc74349b51ec76d4a9.tar.bz2
llvm-1f01109254039f392c559ddc74349b51ec76d4a9.tar.xz
improve Path::makeUnique when mkstemp/mktemp are not available
patch by Lasse Kärkkäinen in PR7404. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108110 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix')
-rw-r--r--lib/System/Unix/Path.inc19
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc
index 185f7fd66b..bc104a32a3 100644
--- a/lib/System/Unix/Path.inc
+++ b/lib/System/Unix/Path.inc
@@ -888,14 +888,19 @@ Path::makeUnique(bool reuse_current, std::string* ErrMsg) {
#else
// Okay, looks like we have to do it all by our lonesome.
static unsigned FCounter = 0;
- unsigned offset = path.size() + 1;
- while ( FCounter < 999999 && exists()) {
- sprintf(FNBuffer+offset,"%06u",++FCounter);
+ // Try to initialize with unique value.
+ if (FCounter == 0) FCounter = ((unsigned)getpid() & 0xFFFF) << 8;
+ char* pos = strstr(FNBuffer, "XXXXXX");
+ do {
+ if (++FCounter > 0xFFFFFF) {
+ return MakeErrMsg(ErrMsg,
+ path + ": can't make unique filename: too many files");
+ }
+ sprintf(pos, "%06X", FCounter);
path = FNBuffer;
- }
- if (FCounter > 999999)
- return MakeErrMsg(ErrMsg,
- path + ": can't make unique filename: too many files");
+ } while (exists());
+ // POSSIBLE SECURITY BUG: An attacker can easily guess the name and exploit
+ // LLVM.
#endif
return false;
}