diff options
author | Greg Clayton <gclayton@apple.com> | 2014-05-30 21:06:57 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2014-05-30 21:06:57 +0000 |
commit | 6bc8739e57ed7ac57466836fa8fd4db8f0e5ddeb (patch) | |
tree | b89351f2ec188339c6c5c3dc0c870596ee74624e /lldb | |
parent | 82560a91a5d5290af58a7a3fc0f8d9ec53ad9f10 (diff) | |
download | bcm5719-llvm-6bc8739e57ed7ac57466836fa8fd4db8f0e5ddeb.tar.gz bcm5719-llvm-6bc8739e57ed7ac57466836fa8fd4db8f0e5ddeb.zip |
Don't use libc's "char *basename(char *)" or "char *dirname(char *)" as they are not thread safe.
I switched the lldb_private::FileSpec code over to use "llvm::StringRef llvm::sys::path::filename(llvm::StringRef)" for basename() and "llvm::StringRef llvm::sys::path::parent_path(llvm::StringRef)" for dirname().
<rdar://problem/16870083>
llvm-svn: 209917
Diffstat (limited to 'lldb')
-rw-r--r-- | lldb/source/Host/common/FileSpec.cpp | 43 |
1 files changed, 8 insertions, 35 deletions
diff --git a/lldb/source/Host/common/FileSpec.cpp b/lldb/source/Host/common/FileSpec.cpp index d4634ece83f..9df9bf3a843 100644 --- a/lldb/source/Host/common/FileSpec.cpp +++ b/lldb/source/Host/common/FileSpec.cpp @@ -324,40 +324,14 @@ FileSpec::SetFile (const char *pathname, bool resolve) if (path_fit) { - char *filename = ::basename (resolved_path); - if (filename) + llvm::StringRef resolve_path_ref(resolved_path); + llvm::StringRef filename_ref = llvm::sys::path::filename(resolve_path_ref); + if (!filename_ref.empty()) { - m_filename.SetCString (filename); - // Truncate the basename off the end of the resolved path - - // Only attempt to get the dirname if it looks like we have a path - if (strchr(resolved_path, '/') -#ifdef _WIN32 - || strchr(resolved_path, '\\') -#endif - ) - { - char *directory = ::dirname (resolved_path); - - // Make sure we didn't get our directory resolved to "." without having - // specified - if (directory) - m_directory.SetCString(directory); - else - { - char *last_resolved_path_slash = strrchr(resolved_path, '/'); -#ifdef _WIN32 - char* last_resolved_path_slash_windows = strrchr(resolved_path, '\\'); - if (last_resolved_path_slash_windows > last_resolved_path_slash) - last_resolved_path_slash = last_resolved_path_slash_windows; -#endif - if (last_resolved_path_slash) - { - *last_resolved_path_slash = '\0'; - m_directory.SetCString(resolved_path); - } - } - } + m_filename.SetString (filename_ref); + llvm::StringRef directory_ref = llvm::sys::path::parent_path(resolve_path_ref); + if (!directory_ref.empty()) + m_directory.SetString(directory_ref); } else m_directory.SetCString(resolved_path); @@ -572,8 +546,7 @@ FileSpec::ResolveExecutableLocation () const std::string file_str (file_cstr); std::string path = llvm::sys::FindProgramByName (file_str); llvm::StringRef dir_ref = llvm::sys::path::parent_path(path); - //llvm::StringRef dir_ref = path.getDirname(); - if (! dir_ref.empty()) + if (!dir_ref.empty()) { // FindProgramByName returns "." if it can't find the file. if (strcmp (".", dir_ref.data()) == 0) |