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:
parent
d5661dcc4e
commit
1605000817
6 changed files with 78 additions and 16 deletions
|
@ -164,6 +164,7 @@ Please select according to languages:
|
||||||
|
|
||||||
### V3 changes
|
### 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-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-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
|
* v3.0, 2019-04-22, Refine in time unit. 3.0.49
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
// The version config.
|
// The version config.
|
||||||
#define VERSION_MAJOR 3
|
#define VERSION_MAJOR 3
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 51
|
#define VERSION_REVISION 52
|
||||||
|
|
||||||
// The macros generated by configure script.
|
// The macros generated by configure script.
|
||||||
#include <srs_auto_headers.hpp>
|
#include <srs_auto_headers.hpp>
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
#define ERROR_SYSTEM_PID_SET_FILE_INFO 1040
|
#define ERROR_SYSTEM_PID_SET_FILE_INFO 1040
|
||||||
#define ERROR_SYSTEM_FILE_ALREADY_OPENED 1041
|
#define ERROR_SYSTEM_FILE_ALREADY_OPENED 1041
|
||||||
#define ERROR_SYSTEM_FILE_OPENE 1042
|
#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_READ 1044
|
||||||
#define ERROR_SYSTEM_FILE_WRITE 1045
|
#define ERROR_SYSTEM_FILE_WRITE 1045
|
||||||
#define ERROR_SYSTEM_FILE_EOF 1046
|
#define ERROR_SYSTEM_FILE_EOF 1046
|
||||||
|
|
|
@ -39,6 +39,7 @@ using namespace std;
|
||||||
// For utest to mock it.
|
// For utest to mock it.
|
||||||
_srs_open_t _srs_open_fn = ::open;
|
_srs_open_t _srs_open_fn = ::open;
|
||||||
_srs_write_t _srs_write_fn = ::write;
|
_srs_write_t _srs_write_fn = ::write;
|
||||||
|
_srs_read_t _srs_read_fn = ::read;
|
||||||
_srs_lseek_t _srs_lseek_fn = ::lseek;
|
_srs_lseek_t _srs_lseek_fn = ::lseek;
|
||||||
|
|
||||||
SrsFileWriter::SrsFileWriter()
|
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());
|
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());
|
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) {
|
if (::close(fd) < 0) {
|
||||||
ret = ERROR_SYSTEM_FILE_CLOSE;
|
srs_warn("close file %s failed. ret=%d", path.c_str(), ret);
|
||||||
srs_error("close file %s failed. ret=%d", path.c_str(), ret);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
fd = -1;
|
fd = -1;
|
||||||
|
|
||||||
|
@ -225,26 +224,26 @@ bool SrsFileReader::is_open()
|
||||||
|
|
||||||
int64_t SrsFileReader::tellg()
|
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)
|
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);
|
srs_assert(r0 != -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t SrsFileReader::seek2(int64_t offset)
|
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 SrsFileReader::filesize()
|
||||||
{
|
{
|
||||||
int64_t cur = tellg();
|
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);
|
srs_assert(r0 != -1);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
|
@ -256,7 +255,7 @@ srs_error_t SrsFileReader::read(void* buf, size_t count, ssize_t* pnread)
|
||||||
|
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
// TODO: FIXME: use st_read.
|
// 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());
|
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)
|
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) {
|
if (sk < 0) {
|
||||||
return srs_error_new(ERROR_SYSTEM_FILE_SEEK, "seek %v failed", (int)sk);
|
return srs_error_new(ERROR_SYSTEM_FILE_SEEK, "seek %v failed", (int)sk);
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,6 +111,7 @@ public:
|
||||||
// For utest to mock it.
|
// For utest to mock it.
|
||||||
typedef int (*_srs_open_t)(const char* path, int oflag, ...);
|
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_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);
|
typedef off_t (*_srs_lseek_t)(int fildes, off_t offset, int whence);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2974,6 +2974,7 @@ VOID TEST(KernelFileTest, FileWriteReader)
|
||||||
// Mock the system call hooks.
|
// Mock the system call hooks.
|
||||||
extern _srs_open_t _srs_open_fn;
|
extern _srs_open_t _srs_open_fn;
|
||||||
extern _srs_write_t _srs_write_fn;
|
extern _srs_write_t _srs_write_fn;
|
||||||
|
extern _srs_read_t _srs_read_fn;
|
||||||
extern _srs_lseek_t _srs_lseek_fn;
|
extern _srs_lseek_t _srs_lseek_fn;
|
||||||
|
|
||||||
int mock_open(const char* /*path*/, int /*oflag*/, ...) {
|
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;
|
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*/) {
|
off_t mock_lseek(int /*fildes*/, off_t /*offset*/, int /*whence*/) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -2993,18 +2998,23 @@ class MockSystemIO
|
||||||
private:
|
private:
|
||||||
_srs_open_t oo;
|
_srs_open_t oo;
|
||||||
_srs_write_t ow;
|
_srs_write_t ow;
|
||||||
|
_srs_read_t _or;
|
||||||
_srs_lseek_t os;
|
_srs_lseek_t os;
|
||||||
public:
|
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;
|
oo = _srs_open_fn;
|
||||||
ow = _srs_write_fn;
|
ow = _srs_write_fn;
|
||||||
os = _srs_lseek_fn;
|
os = _srs_lseek_fn;
|
||||||
|
_or = _srs_read_fn;
|
||||||
if (o) {
|
if (o) {
|
||||||
_srs_open_fn = o;
|
_srs_open_fn = o;
|
||||||
}
|
}
|
||||||
if (w) {
|
if (w) {
|
||||||
_srs_write_fn = w;
|
_srs_write_fn = w;
|
||||||
}
|
}
|
||||||
|
if (r) {
|
||||||
|
_srs_read_fn = r;
|
||||||
|
}
|
||||||
if (s) {
|
if (s) {
|
||||||
_srs_lseek_fn = s;
|
_srs_lseek_fn = s;
|
||||||
}
|
}
|
||||||
|
@ -3016,13 +3026,16 @@ public:
|
||||||
if (ow) {
|
if (ow) {
|
||||||
_srs_write_fn = ow;
|
_srs_write_fn = ow;
|
||||||
}
|
}
|
||||||
|
if (_or) {
|
||||||
|
_srs_read_fn = _or;
|
||||||
|
}
|
||||||
if (os) {
|
if (os) {
|
||||||
_srs_lseek_fn = os;
|
_srs_lseek_fn = os;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
VOID TEST(KernelFileTest, WriteSpecialCase)
|
VOID TEST(KernelFileWriterTest, WriteSpecialCase)
|
||||||
{
|
{
|
||||||
srs_error_t err;
|
srs_error_t err;
|
||||||
|
|
||||||
|
@ -3098,7 +3111,7 @@ VOID TEST(KernelFileTest, WriteSpecialCase)
|
||||||
HELPER_EXPECT_FAILED(f.writev(iovs, 3, NULL));
|
HELPER_EXPECT_FAILED(f.writev(iovs, 3, NULL));
|
||||||
}
|
}
|
||||||
if (true) {
|
if (true) {
|
||||||
MockSystemIO _mockio(NULL, NULL, mock_lseek);
|
MockSystemIO _mockio(NULL, NULL, NULL, mock_lseek);
|
||||||
SrsFileWriter f;
|
SrsFileWriter f;
|
||||||
HELPER_EXPECT_SUCCESS(f.open("/dev/null"));
|
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)
|
VOID TEST(KernelFLVTest, CoverAll)
|
||||||
{
|
{
|
||||||
if (true) {
|
if (true) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue