1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Covert Kernel File reader/writer. 3.0.52

This commit is contained in:
winlin 2019-05-14 08:13:27 +08:00
parent d5661dcc4e
commit 1605000817
6 changed files with 78 additions and 16 deletions

View file

@ -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) {