From 16050008172832d8dbe847940457e74e4f5669e4 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 14 May 2019 08:13:27 +0800 Subject: [PATCH] Covert Kernel File reader/writer. 3.0.52 --- README.md | 1 + trunk/src/core/srs_core.hpp | 2 +- trunk/src/kernel/srs_kernel_error.hpp | 2 +- trunk/src/kernel/srs_kernel_file.cpp | 21 ++++----- trunk/src/kernel/srs_kernel_file.hpp | 1 + trunk/src/utest/srs_utest_kernel.cpp | 67 +++++++++++++++++++++++++-- 6 files changed, 78 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 5e0242fe8..5113eb005 100755 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ Please select according to languages: ### V3 changes +* v3.0, 2019-05-14, Covert Kernel File reader/writer. 3.0.52 * v3.0, 2019-04-30, Refine typo in files. 3.0.51 * v3.0, 2019-04-25, Upgrade http-parser from 2.1 to 2.9.2 and cover it. 3.0.50 * v3.0, 2019-04-22, Refine in time unit. 3.0.49 diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index a59348f40..5f7e22218 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -27,7 +27,7 @@ // The version config. #define VERSION_MAJOR 3 #define VERSION_MINOR 0 -#define VERSION_REVISION 51 +#define VERSION_REVISION 52 // The macros generated by configure script. #include diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 1875ed033..3427dc4a0 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -79,7 +79,7 @@ #define ERROR_SYSTEM_PID_SET_FILE_INFO 1040 #define ERROR_SYSTEM_FILE_ALREADY_OPENED 1041 #define ERROR_SYSTEM_FILE_OPENE 1042 -#define ERROR_SYSTEM_FILE_CLOSE 1043 +//#define ERROR_SYSTEM_FILE_CLOSE 1043 #define ERROR_SYSTEM_FILE_READ 1044 #define ERROR_SYSTEM_FILE_WRITE 1045 #define ERROR_SYSTEM_FILE_EOF 1046 diff --git a/trunk/src/kernel/srs_kernel_file.cpp b/trunk/src/kernel/srs_kernel_file.cpp index 0f7625bd9..7857c72ae 100644 --- a/trunk/src/kernel/srs_kernel_file.cpp +++ b/trunk/src/kernel/srs_kernel_file.cpp @@ -39,6 +39,7 @@ using namespace std; // For utest to mock it. _srs_open_t _srs_open_fn = ::open; _srs_write_t _srs_write_fn = ::write; +_srs_read_t _srs_read_fn = ::read; _srs_lseek_t _srs_lseek_fn = ::lseek; SrsFileWriter::SrsFileWriter() @@ -191,7 +192,7 @@ srs_error_t SrsFileReader::open(string p) return srs_error_new(ERROR_SYSTEM_FILE_ALREADY_OPENED, "file %s already opened", path.c_str()); } - if ((fd = ::open(p.c_str(), O_RDONLY)) < 0) { + if ((fd = _srs_open_fn(p.c_str(), O_RDONLY)) < 0) { return srs_error_new(ERROR_SYSTEM_FILE_OPENE, "open file %s failed", p.c_str()); } @@ -209,9 +210,7 @@ void SrsFileReader::close() } if (::close(fd) < 0) { - ret = ERROR_SYSTEM_FILE_CLOSE; - srs_error("close file %s failed. ret=%d", path.c_str(), ret); - return; + srs_warn("close file %s failed. ret=%d", path.c_str(), ret); } fd = -1; @@ -225,26 +224,26 @@ bool SrsFileReader::is_open() int64_t SrsFileReader::tellg() { - return (int64_t)::lseek(fd, 0, SEEK_CUR); + return (int64_t)_srs_lseek_fn(fd, 0, SEEK_CUR); } void SrsFileReader::skip(int64_t size) { - off_t r0 = ::lseek(fd, (off_t)size, SEEK_CUR); + off_t r0 = _srs_lseek_fn(fd, (off_t)size, SEEK_CUR); srs_assert(r0 != -1); } int64_t SrsFileReader::seek2(int64_t offset) { - return (int64_t)::lseek(fd, (off_t)offset, SEEK_SET); + return (int64_t)_srs_lseek_fn(fd, (off_t)offset, SEEK_SET); } int64_t SrsFileReader::filesize() { int64_t cur = tellg(); - int64_t size = (int64_t)::lseek(fd, 0, SEEK_END); + int64_t size = (int64_t)_srs_lseek_fn(fd, 0, SEEK_END); - off_t r0 = ::lseek(fd, (off_t)cur, SEEK_SET); + off_t r0 = _srs_lseek_fn(fd, (off_t)cur, SEEK_SET); srs_assert(r0 != -1); return size; @@ -256,7 +255,7 @@ srs_error_t SrsFileReader::read(void* buf, size_t count, ssize_t* pnread) ssize_t nread; // TODO: FIXME: use st_read. - if ((nread = ::read(fd, buf, count)) < 0) { + if ((nread = _srs_read_fn(fd, buf, count)) < 0) { return srs_error_new(ERROR_SYSTEM_FILE_READ, "read from file %s failed", path.c_str()); } @@ -273,7 +272,7 @@ srs_error_t SrsFileReader::read(void* buf, size_t count, ssize_t* pnread) srs_error_t SrsFileReader::lseek(off_t offset, int whence, off_t* seeked) { - off_t sk = ::lseek(fd, offset, whence); + off_t sk = _srs_lseek_fn(fd, offset, whence); if (sk < 0) { return srs_error_new(ERROR_SYSTEM_FILE_SEEK, "seek %v failed", (int)sk); } diff --git a/trunk/src/kernel/srs_kernel_file.hpp b/trunk/src/kernel/srs_kernel_file.hpp index acf2d5d0e..2a2d2842e 100644 --- a/trunk/src/kernel/srs_kernel_file.hpp +++ b/trunk/src/kernel/srs_kernel_file.hpp @@ -111,6 +111,7 @@ public: // For utest to mock it. typedef int (*_srs_open_t)(const char* path, int oflag, ...); typedef ssize_t (*_srs_write_t)(int fildes, const void* buf, size_t nbyte); +typedef ssize_t (*_srs_read_t)(int fildes, void* buf, size_t nbyte); typedef off_t (*_srs_lseek_t)(int fildes, off_t offset, int whence); #endif diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 3c61e58c3..fbb2438dd 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -2974,6 +2974,7 @@ VOID TEST(KernelFileTest, FileWriteReader) // Mock the system call hooks. extern _srs_open_t _srs_open_fn; extern _srs_write_t _srs_write_fn; +extern _srs_read_t _srs_read_fn; extern _srs_lseek_t _srs_lseek_fn; int mock_open(const char* /*path*/, int /*oflag*/, ...) { @@ -2984,6 +2985,10 @@ ssize_t mock_write(int /*fildes*/, const void* /*buf*/, size_t /*nbyte*/) { return -1; } +ssize_t mock_read(int /*fildes*/, void* /*buf*/, size_t /*nbyte*/) { + return -1; +} + off_t mock_lseek(int /*fildes*/, off_t /*offset*/, int /*whence*/) { return -1; } @@ -2993,18 +2998,23 @@ class MockSystemIO private: _srs_open_t oo; _srs_write_t ow; + _srs_read_t _or; _srs_lseek_t os; public: - MockSystemIO(_srs_open_t o = NULL, _srs_write_t w = NULL, _srs_lseek_t s = NULL) { + MockSystemIO(_srs_open_t o = NULL, _srs_write_t w = NULL, _srs_read_t r = NULL, _srs_lseek_t s = NULL) { oo = _srs_open_fn; ow = _srs_write_fn; os = _srs_lseek_fn; + _or = _srs_read_fn; if (o) { _srs_open_fn = o; } if (w) { _srs_write_fn = w; } + if (r) { + _srs_read_fn = r; + } if (s) { _srs_lseek_fn = s; } @@ -3016,13 +3026,16 @@ public: if (ow) { _srs_write_fn = ow; } + if (_or) { + _srs_read_fn = _or; + } if (os) { _srs_lseek_fn = os; } } }; -VOID TEST(KernelFileTest, WriteSpecialCase) +VOID TEST(KernelFileWriterTest, WriteSpecialCase) { srs_error_t err; @@ -3098,7 +3111,7 @@ VOID TEST(KernelFileTest, WriteSpecialCase) HELPER_EXPECT_FAILED(f.writev(iovs, 3, NULL)); } if (true) { - MockSystemIO _mockio(NULL, NULL, mock_lseek); + MockSystemIO _mockio(NULL, NULL, NULL, mock_lseek); SrsFileWriter f; HELPER_EXPECT_SUCCESS(f.open("/dev/null")); @@ -3106,6 +3119,54 @@ VOID TEST(KernelFileTest, WriteSpecialCase) } } +VOID TEST(KernelFileReaderTest, WriteSpecialCase) +{ + srs_error_t err; + + // Should fail when open multiple times. + if (true) { + SrsFileReader f; + HELPER_EXPECT_SUCCESS(f.open("/dev/null")); + HELPER_EXPECT_FAILED(f.open("/dev/null")); + } + + // Always fail. + if (true) { + MockSystemIO _mockio(mock_open); + SrsFileReader f; + HELPER_EXPECT_FAILED(f.open("/dev/null")); + HELPER_EXPECT_FAILED(f.open("/dev/null")); + } + + // Should ok for lseek. + if (true) { + SrsFileWriter f; + HELPER_EXPECT_SUCCESS(f.open("/dev/null")); + + off_t seeked = 0; + HELPER_EXPECT_SUCCESS(f.lseek(0, SEEK_CUR, &seeked)); + EXPECT_EQ(0, seeked); + } + + // Always fail. + if (true) { + MockSystemIO _mockio(NULL, NULL, mock_read); + SrsFileReader f; + HELPER_EXPECT_SUCCESS(f.open("/dev/null")); + + ssize_t nn = 0; + char buf[16]; + HELPER_EXPECT_FAILED(f.read(buf, sizeof(buf), &nn)); + } + if (true) { + MockSystemIO _mockio(NULL, NULL, NULL, mock_lseek); + SrsFileReader f; + HELPER_EXPECT_SUCCESS(f.open("/dev/null")); + + HELPER_EXPECT_FAILED(f.lseek(0, 0, NULL)); + } +} + VOID TEST(KernelFLVTest, CoverAll) { if (true) {