Author: Pavel Labath Date: 2020-01-22T10:14:47+01:00 New Revision: 0157a74bec3d2ef1fac5b874327b97d2ae8e95c8
URL: https://github.com/llvm/llvm-project/commit/0157a74bec3d2ef1fac5b874327b97d2ae8e95c8 DIFF: https://github.com/llvm/llvm-project/commit/0157a74bec3d2ef1fac5b874327b97d2ae8e95c8.diff LOG: [lldb] Fix an asan error from 27df2d9f556c This error is caused by a combination of a couple of factors: - the test accidentally creating a list with a single (empty) FileSpec instead of an empty list - lldb overzeleously converting empty strings into nullptrs - asan overzeleously validating symlink(2) arguments (the real symlink call would just fail with EFAULT) I fix this by using FileSpec::GetPath instead of GetCString. This avoids the nullptr and also avoids inserting the path into the global string pool. I also enhance the test case to test both empty paths and empty lists. Added: Modified: lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/comp_dir_symlink/TestCompDirSymLink.py lldb/source/Host/posix/FileSystemPosix.cpp Removed: ################################################################################ diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/comp_dir_symlink/TestCompDirSymLink.py b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/comp_dir_symlink/TestCompDirSymLink.py index 006c0bff0838..7735bdaf459c 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/comp_dir_symlink/TestCompDirSymLink.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/comp_dir_symlink/TestCompDirSymLink.py @@ -46,6 +46,18 @@ def test_symlink_paths_set_procselfcwd(self): @skipIf(hostoslist=["windows"]) def test_symlink_paths_unset(self): + pwd_symlink = self.create_src_symlink() + self.doBuild(pwd_symlink, None) + src_path = self.getBuildArtifact(_SRC_FILE) + self.assertRaises( + AssertionError, + lldbutil.run_break_set_by_file_and_line, + self, + src_path, + self.line) + + @skipIf(hostoslist=["windows"]) + def test_symlink_paths_empty(self): pwd_symlink = self.create_src_symlink() self.doBuild(pwd_symlink, "") src_path = self.getBuildArtifact(_SRC_FILE) @@ -67,9 +79,11 @@ def create_src_symlink(self): def doBuild(self, pwd_symlink, setting_value): self.build(None, None, {'PWD': pwd_symlink}) - self.runCmd( - "settings set %s '%s'" % - (_COMP_DIR_SYM_LINK_PROP, setting_value)) + if setting_value: + cmd = "settings set %s '%s'" % (_COMP_DIR_SYM_LINK_PROP, setting_value) + else: + cmd = "settings clear %s"%_COMP_DIR_SYM_LINK_PROP + self.runCmd(cmd) exe = self.getBuildArtifact(_EXE_NAME) self.runCmd('file ' + exe, CURRENT_EXECUTABLE_SET) diff --git a/lldb/source/Host/posix/FileSystemPosix.cpp b/lldb/source/Host/posix/FileSystemPosix.cpp index 32fae68abb4d..30bf9a51eb67 100644 --- a/lldb/source/Host/posix/FileSystemPosix.cpp +++ b/lldb/source/Host/posix/FileSystemPosix.cpp @@ -43,7 +43,7 @@ Status FileSystem::Symlink(const FileSpec &src, const FileSpec &dst) { Status FileSystem::Readlink(const FileSpec &src, FileSpec &dst) { Status error; char buf[PATH_MAX]; - ssize_t count = ::readlink(src.GetCString(), buf, sizeof(buf) - 1); + ssize_t count = ::readlink(src.GetPath().c_str(), buf, sizeof(buf) - 1); if (count < 0) error.SetErrorToErrno(); else { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits