summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2020-08-27 15:03:40 -0700
committergVisor bot <gvisor-bot@google.com>2020-08-27 15:03:40 -0700
commit29d528399cf93ea2f27afe245738ae13ed4deace (patch)
tree4dc95d448be62dafa9c80ca0458ae711bb8d19f1
parent26c588f06368c21130bb356c6088b76ea715d1ef (diff)
parent5c491164f90f0569de740be46984d36f25569bff (diff)
Merge pull request #3077 from jinmouil:beef-write-syscall
PiperOrigin-RevId: 328824023
-rw-r--r--test/syscalls/linux/symlink.cc30
-rw-r--r--test/syscalls/linux/write.cc85
2 files changed, 115 insertions, 0 deletions
diff --git a/test/syscalls/linux/symlink.cc b/test/syscalls/linux/symlink.cc
index a17ff62e9..f4f6ff490 100644
--- a/test/syscalls/linux/symlink.cc
+++ b/test/syscalls/linux/symlink.cc
@@ -218,6 +218,36 @@ TEST(SymlinkTest, PreadFromSymlink) {
EXPECT_THAT(unlink(linkname.c_str()), SyscallSucceeds());
}
+TEST(SymlinkTest, PwriteToSymlink) {
+ std::string name = NewTempAbsPath();
+ int fd;
+ ASSERT_THAT(fd = open(name.c_str(), O_CREAT, 0644), SyscallSucceeds());
+ ASSERT_THAT(close(fd), SyscallSucceeds());
+
+ std::string linkname = NewTempAbsPath();
+ ASSERT_THAT(symlink(name.c_str(), linkname.c_str()), SyscallSucceeds());
+
+ ASSERT_THAT(fd = open(linkname.c_str(), O_WRONLY), SyscallSucceeds());
+
+ const int data_size = 10;
+ const std::string data = std::string(data_size, 'a');
+ EXPECT_THAT(pwrite64(fd, data.c_str(), data.size(), 0),
+ SyscallSucceedsWithValue(data.size()));
+
+ ASSERT_THAT(close(fd), SyscallSucceeds());
+ ASSERT_THAT(fd = open(name.c_str(), O_RDONLY), SyscallSucceeds());
+
+ char buf[data_size + 1];
+ EXPECT_THAT(pread64(fd, buf, data.size(), 0), SyscallSucceeds());
+ buf[data.size()] = '\0';
+ EXPECT_STREQ(buf, data.c_str());
+
+ ASSERT_THAT(close(fd), SyscallSucceeds());
+
+ EXPECT_THAT(unlink(name.c_str()), SyscallSucceeds());
+ EXPECT_THAT(unlink(linkname.c_str()), SyscallSucceeds());
+}
+
TEST(SymlinkTest, SymlinkAtDegradedPermissions_NoRandomSave) {
// Drop capabilities that allow us to override file and directory permissions.
ASSERT_NO_ERRNO(SetCapability(CAP_DAC_OVERRIDE, false));
diff --git a/test/syscalls/linux/write.cc b/test/syscalls/linux/write.cc
index 39b5b2f56..77bcfbb8a 100644
--- a/test/syscalls/linux/write.cc
+++ b/test/syscalls/linux/write.cc
@@ -133,6 +133,91 @@ TEST_F(WriteTest, WriteExceedsRLimit) {
EXPECT_THAT(close(fd), SyscallSucceeds());
}
+TEST_F(WriteTest, WriteIncrementOffset) {
+ TempPath tmpfile = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFile());
+ FileDescriptor f =
+ ASSERT_NO_ERRNO_AND_VALUE(Open(tmpfile.path().c_str(), O_WRONLY));
+ int fd = f.get();
+
+ EXPECT_THAT(WriteBytes(fd, 0), SyscallSucceedsWithValue(0));
+ EXPECT_THAT(lseek(fd, 0, SEEK_CUR), SyscallSucceedsWithValue(0));
+
+ const int bytes_total = 1024;
+
+ EXPECT_THAT(WriteBytes(fd, bytes_total),
+ SyscallSucceedsWithValue(bytes_total));
+ EXPECT_THAT(lseek(fd, 0, SEEK_CUR), SyscallSucceedsWithValue(bytes_total));
+}
+
+TEST_F(WriteTest, WriteIncrementOffsetSeek) {
+ const std::string data = "hello world\n";
+ TempPath tmpfile = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFileWith(
+ GetAbsoluteTestTmpdir(), data, TempPath::kDefaultFileMode));
+ FileDescriptor f =
+ ASSERT_NO_ERRNO_AND_VALUE(Open(tmpfile.path().c_str(), O_WRONLY));
+ int fd = f.get();
+
+ const int seek_offset = data.size() / 2;
+ ASSERT_THAT(lseek(fd, seek_offset, SEEK_SET),
+ SyscallSucceedsWithValue(seek_offset));
+
+ const int write_bytes = 512;
+ EXPECT_THAT(WriteBytes(fd, write_bytes),
+ SyscallSucceedsWithValue(write_bytes));
+ EXPECT_THAT(lseek(fd, 0, SEEK_CUR),
+ SyscallSucceedsWithValue(seek_offset + write_bytes));
+}
+
+TEST_F(WriteTest, WriteIncrementOffsetAppend) {
+ const std::string data = "hello world\n";
+ TempPath tmpfile = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFileWith(
+ GetAbsoluteTestTmpdir(), data, TempPath::kDefaultFileMode));
+ FileDescriptor f = ASSERT_NO_ERRNO_AND_VALUE(
+ Open(tmpfile.path().c_str(), O_WRONLY | O_APPEND));
+ int fd = f.get();
+
+ EXPECT_THAT(WriteBytes(fd, 1024), SyscallSucceedsWithValue(1024));
+ EXPECT_THAT(lseek(fd, 0, SEEK_CUR),
+ SyscallSucceedsWithValue(data.size() + 1024));
+}
+
+TEST_F(WriteTest, WriteIncrementOffsetEOF) {
+ const std::string data = "hello world\n";
+ const TempPath tmpfile = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFileWith(
+ GetAbsoluteTestTmpdir(), data, TempPath::kDefaultFileMode));
+ FileDescriptor f =
+ ASSERT_NO_ERRNO_AND_VALUE(Open(tmpfile.path().c_str(), O_WRONLY));
+ int fd = f.get();
+
+ EXPECT_THAT(lseek(fd, 0, SEEK_END), SyscallSucceedsWithValue(data.size()));
+
+ EXPECT_THAT(WriteBytes(fd, 1024), SyscallSucceedsWithValue(1024));
+ EXPECT_THAT(lseek(fd, 0, SEEK_END),
+ SyscallSucceedsWithValue(data.size() + 1024));
+}
+
+TEST_F(WriteTest, PwriteNoChangeOffset) {
+ TempPath tmpfile = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFile());
+ FileDescriptor f =
+ ASSERT_NO_ERRNO_AND_VALUE(Open(tmpfile.path().c_str(), O_WRONLY));
+ int fd = f.get();
+
+ const std::string data = "hello world\n";
+
+ EXPECT_THAT(pwrite(fd, data.data(), data.size(), 0),
+ SyscallSucceedsWithValue(data.size()));
+ EXPECT_THAT(lseek(fd, 0, SEEK_CUR), SyscallSucceedsWithValue(0));
+
+ const int bytes_total = 1024;
+ ASSERT_THAT(WriteBytes(fd, bytes_total),
+ SyscallSucceedsWithValue(bytes_total));
+ ASSERT_THAT(lseek(fd, 0, SEEK_CUR), SyscallSucceedsWithValue(bytes_total));
+
+ EXPECT_THAT(pwrite(fd, data.data(), data.size(), bytes_total),
+ SyscallSucceedsWithValue(data.size()));
+ EXPECT_THAT(lseek(fd, 0, SEEK_CUR), SyscallSucceedsWithValue(bytes_total));
+}
+
} // namespace
} // namespace testing