aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Prichard <rprichard@google.com>2022-07-22 16:20:47 -0700
committerRyan Prichard <rprichard@google.com>2022-07-22 16:20:47 -0700
commitb4722cc4c96e03cdad3f23b0ba558907e82d95db (patch)
treeffa032642a0390a9e729b1abe005657c70c426d2
parent[clang][dataflow] ArrayRef'ize debugString() (diff)
downloadllvm-project-b4722cc4c96e03cdad3f23b0ba558907e82d95db.tar.gz
llvm-project-b4722cc4c96e03cdad3f23b0ba558907e82d95db.tar.bz2
llvm-project-b4722cc4c96e03cdad3f23b0ba558907e82d95db.zip
[libc++][test] Fix infinite loop when mkstemp fails
mkstemp is guaranteed to make at least TMP_MAX attempts to create the random file, and if it can't, it fails with EEXIST. get_temp_file_name shouldn't call mkstemp again if it fails with anything other than EEXIST. A single mkstemp call seems sufficient. On Android, I've seen mkstemp fail with: - EROFS (because cwd wasn't set to a writable filesystem) - EACCES (because cwd pointed to a dir owned by root, but the test program was running as the shell user instead) Previously, get_temp_file_name would run forever in these situations. See D4962 and "llvm-svn: 229035" Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D130214
-rw-r--r--libcxx/test/support/platform_support.h16
1 files changed, 6 insertions, 10 deletions
diff --git a/libcxx/test/support/platform_support.h b/libcxx/test/support/platform_support.h
index 7429b03f4eea..a6fa5661dfbf 100644
--- a/libcxx/test/support/platform_support.h
+++ b/libcxx/test/support/platform_support.h
@@ -75,16 +75,12 @@ std::string get_temp_file_name()
abort();
}
#else
- std::string Name;
- int FD = -1;
- do {
- Name = "libcxx.XXXXXX";
- FD = mkstemp(&Name[0]);
- if (FD == -1 && errno == EINVAL) {
- perror("mkstemp");
- abort();
- }
- } while (FD == -1);
+ std::string Name = "libcxx.XXXXXX";
+ int FD = mkstemp(&Name[0]);
+ if (FD == -1) {
+ perror("mkstemp");
+ abort();
+ }
close(FD);
return Name;
#endif