[Lldb-commits] [lldb] [lldb] Fix write only file action to truncate the file (PR #112657)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 17 16:32:32 PDT 2024
https://github.com/kusmour updated https://github.com/llvm/llvm-project/pull/112657
>From 48831c67f07e1199145dbb5538c02f502d3f02bf Mon Sep 17 00:00:00 2001
From: Wanyi Ye <wanyi at meta.com>
Date: Mon, 14 Oct 2024 22:37:50 -0700
Subject: [PATCH] [lldb] Fix write only file action to truncate the file
---
lldb/source/Host/common/FileAction.cpp | 2 +-
.../python_api/process/io/TestProcessIO.py | 30 +++++++++++++++++++
lldb/unittests/Host/FileActionTest.cpp | 25 ++++++++++++++++
3 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/lldb/source/Host/common/FileAction.cpp b/lldb/source/Host/common/FileAction.cpp
index f980d3224640e0..e1c3e14a165ea9 100644
--- a/lldb/source/Host/common/FileAction.cpp
+++ b/lldb/source/Host/common/FileAction.cpp
@@ -41,7 +41,7 @@ bool FileAction::Open(int fd, const FileSpec &file_spec, bool read,
else if (read)
m_arg = O_NOCTTY | O_RDONLY;
else
- m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
+ m_arg = O_NOCTTY | O_CREAT | O_WRONLY | O_TRUNC;
m_file_spec = file_spec;
return true;
} else {
diff --git a/lldb/test/API/python_api/process/io/TestProcessIO.py b/lldb/test/API/python_api/process/io/TestProcessIO.py
index 5bb91d2758312d..3b5c7c48c51f4d 100644
--- a/lldb/test/API/python_api/process/io/TestProcessIO.py
+++ b/lldb/test/API/python_api/process/io/TestProcessIO.py
@@ -95,6 +95,36 @@ def test_stdout_stderr_redirection(self):
error = self.read_error_file_and_delete()
self.check_process_output(output, error)
+ @skipIfWindows # stdio manipulation unsupported on Windows
+ @expectedFlakeyLinux(bugnumber="llvm.org/pr26437")
+ @skipIfDarwinEmbedded # debugserver can't create/write files on the device
+ def test_stdout_stderr_redirection_to_existing_files(self):
+ """Exercise SBLaunchInfo::AddOpenFileAction() for STDOUT and STDERR without redirecting STDIN to output files already exist."""
+ self.setup_test()
+ self.build()
+ self.create_target()
+ self.write_file_with_placeholder(self.output_file)
+ self.write_file_with_placeholder(self.error_file)
+ self.redirect_stdout()
+ self.redirect_stderr()
+ self.run_process(True)
+ output = self.read_output_file_and_delete()
+ error = self.read_error_file_and_delete()
+ self.check_process_output(output, error)
+
+ def write_file_with_placeholder(self, target_file):
+ placeholder = "This content should be overwritten."
+ if lldb.remote_platform:
+ self.runCmd(
+ 'platform file write "{target}" -d "{data}"'.format(
+ target=target_file, data=placeholder
+ )
+ )
+ else:
+ f = open(target_file, "w")
+ f.write(placeholder)
+ f.close()
+
# target_file - path on local file system or remote file system if running remote
# local_file - path on local system
def read_file_and_delete(self, target_file, local_file):
diff --git a/lldb/unittests/Host/FileActionTest.cpp b/lldb/unittests/Host/FileActionTest.cpp
index b208169aac20e6..3d2c722552c9c2 100644
--- a/lldb/unittests/Host/FileActionTest.cpp
+++ b/lldb/unittests/Host/FileActionTest.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+#include <fcntl.h>
+
#include "lldb/Host/FileAction.h"
#include "gtest/gtest.h"
@@ -17,3 +19,26 @@ TEST(FileActionTest, Open) {
EXPECT_EQ(Action.GetAction(), FileAction::eFileActionOpen);
EXPECT_EQ(Action.GetFileSpec(), FileSpec("/tmp"));
}
+
+TEST(FileActionTest, OpenReadWrite) {
+ FileAction Action;
+ Action.Open(48, FileSpec("/tmp_0"), /*read*/ true, /*write*/ true);
+ EXPECT_TRUE(Action.GetActionArgument() & (O_NOCTTY | O_CREAT | O_RDWR));
+ EXPECT_FALSE(Action.GetActionArgument() & O_RDONLY);
+ EXPECT_FALSE(Action.GetActionArgument() & O_WRONLY);
+}
+
+TEST(FileActionTest, OpenReadOnly) {
+ FileAction Action;
+ Action.Open(49, FileSpec("/tmp_1"), /*read*/ true, /*write*/ false);
+ EXPECT_TRUE(Action.GetActionArgument() & (O_NOCTTY | O_RDONLY));
+ EXPECT_FALSE(Action.GetActionArgument() & O_WRONLY);
+}
+
+TEST(FileActionTest, OpenWriteOnly) {
+ FileAction Action;
+ Action.Open(50, FileSpec("/tmp_2"), /*read*/ false, /*write*/ true);
+ EXPECT_TRUE(Action.GetActionArgument() &
+ (O_NOCTTY | O_CREAT | O_WRONLY | O_TRUNC));
+ EXPECT_FALSE(Action.GetActionArgument() & O_RDONLY);
+}
More information about the lldb-commits
mailing list