Skip to content

Commit

Permalink
issue ossrs#2228: refine config directive token parse;
Browse files Browse the repository at this point in the history
make sure one directive token don't span more than two lines.
  • Loading branch information
suzp1984 committed Apr 24, 2024
1 parent 427104f commit 68cc649
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 31 deletions.
16 changes: 13 additions & 3 deletions trunk/src/app/srs_app_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1202,9 +1202,15 @@ srs_error_t SrsConfDirective::read_token(SrsConfigBuffer* buffer, vector<string>

char ch = *buffer->pos++;

if (ch == SRS_LF) {
buffer->line++;
if (ch == SRS_LF || ch == SRS_CR) {
if (ch == SRS_LF) {
buffer->line++;
}

sharp_comment = false;
if (args.size() > 0) {
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "line %d: unexpected end of line to parse token %s", buffer->line - 1, args[0].c_str());
}
}

if (sharp_comment) {
Expand Down Expand Up @@ -1305,7 +1311,7 @@ srs_error_t SrsConfDirective::read_token(SrsConfigBuffer* buffer, vector<string>
args.push_back(word_str);
}
srs_freepa(aword);

if (ch == ';') {
state = SrsDirectiveStateEntire;
return err;
Expand All @@ -1314,6 +1320,10 @@ srs_error_t SrsConfDirective::read_token(SrsConfigBuffer* buffer, vector<string>
state = SrsDirectiveStateBlockStart;
return err;
}

if ((ch == SRS_LF || ch == SRS_CR) && args.size() > 0) {
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "line %d: unexpected end of line to parse token %s", buffer->line - 1, args[0].c_str());
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/utest/srs_utest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ VOID TEST(SampleTest, ContextTest)
cache[0] = cid;
}

MockProtectedBuffer::MockProtectedBuffer() : size_(0), data_(NULL), raw_memory_(NULL)
MockProtectedBuffer::MockProtectedBuffer() : raw_memory_(NULL), size_(0), data_(NULL)
{
}

Expand Down
132 changes: 105 additions & 27 deletions trunk/src/utest/srs_utest_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,16 +400,31 @@ VOID TEST(ConfigDirectiveTest, ParseArgsSpace)
EXPECT_EQ(0, (int) conf.directives.size());
}
}

if (true) {
vector <string> usecases;
usecases.push_back("include\rtest;");
usecases.push_back("include\ntest;");
usecases.push_back("include \r \n \r\n \n\rtest;");

for (int i = 0; i < (int)usecases.size(); i++) {
string usecase = usecases.at(i);

MockSrsConfigBuffer buf(usecase);
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(0, (int) conf.directives.size());
}
}

if (true) {
vector <string> usecases;
usecases.push_back("include test;");
usecases.push_back("include test;");
usecases.push_back("include test;");
usecases.push_back("include test;");;
usecases.push_back("include\rtest;");
usecases.push_back("include\ntest;");
usecases.push_back("include \r \n \r\n \n\rtest;");

MockSrsConfig config;
config.mock_include("test", "listen 1935;");
Expand All @@ -433,6 +448,92 @@ VOID TEST(ConfigDirectiveTest, ParseArgsSpace)
}
}

VOID TEST(ConfigDirectiveTest, ParseInvalidEndOfLine)
{
srs_error_t err;

if (true) {
MockSrsConfigBuffer buf("dir0 \narg0;dir1 arg1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(0, (int) conf.directives.size());
}

if (true) {
MockSrsConfigBuffer buf("dir0\n arg0;dir1 arg1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(0, (int) conf.directives.size());
}

if (true) {
MockSrsConfigBuffer buf("dir0 arg0\n;dir1 arg1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(0, (int) conf.directives.size());
}

if (true) {
MockSrsConfigBuffer buf("dir0 \rarg0;dir1 arg1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(0, (int) conf.directives.size());
}

if (true) {
MockSrsConfigBuffer buf("dir0 arg0\r;dir1 arg1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(0, (int) conf.directives.size());
}

if (true) {
MockSrsConfigBuffer buf("dir0 arg0;dir1\n arg1;");
SrsConfDirective conf;
HELPER_ASSERT_FAILED(conf.parse(&buf));
EXPECT_EQ(0, (int) conf.name.length());
EXPECT_EQ(0, (int) conf.args.size());
EXPECT_EQ(1, (int) conf.directives.size());

SrsConfDirective& dir0 = *conf.directives.at(0);
EXPECT_STREQ("dir0", dir0.name.c_str());
EXPECT_EQ(1, (int)dir0.args.size());
EXPECT_STREQ("arg0", dir0.arg0().c_str());
EXPECT_EQ(0, (int)dir0.directives.size());
}

if (true) {
MockSrsConfigBuffer buf("dir0 arg0;dir1 arg1;");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name.length());
EXPECT_EQ(0, (int)conf.args.size());
EXPECT_EQ(2, (int)conf.directives.size());

SrsConfDirective& dir0 = *conf.directives.at(0);
EXPECT_STREQ("dir0", dir0.name.c_str());
EXPECT_EQ(1, (int)dir0.args.size());
EXPECT_STREQ("arg0", dir0.arg0().c_str());
EXPECT_EQ(0, (int)dir0.directives.size());

SrsConfDirective& dir1 = *conf.directives.at(1);
EXPECT_STREQ("dir1", dir1.name.c_str());
EXPECT_EQ(1, (int)dir1.args.size());
EXPECT_STREQ("arg1", dir1.arg0().c_str());
EXPECT_EQ(0, (int)dir1.directives.size());
}
}

VOID TEST(ConfigDirectiveTest, Parse2SingleDirs)
{
srs_error_t err;
Expand Down Expand Up @@ -829,30 +930,7 @@ VOID TEST(ConfigDirectiveTest, ParseLine4)

MockSrsConfigBuffer buf("dir0 {\n\ndir1 \n\narg0;dir2 arg1;}");
SrsConfDirective conf;
HELPER_ASSERT_SUCCESS(conf.parse(&buf));
EXPECT_EQ(0, (int)conf.name.length());
EXPECT_EQ(0, (int)conf.args.size());
EXPECT_EQ(1, (int)conf.directives.size());

SrsConfDirective& dir0 = *conf.directives.at(0);
EXPECT_STREQ("dir0", dir0.name.c_str());
EXPECT_EQ(0, (int)dir0.args.size());
EXPECT_EQ(2, (int)dir0.directives.size());
EXPECT_EQ(1, (int)dir0.conf_line);

SrsConfDirective& dir1 = *dir0.directives.at(0);
EXPECT_STREQ("dir1", dir1.name.c_str());
EXPECT_EQ(1, (int)dir1.args.size());
EXPECT_STREQ("arg0", dir1.arg0().c_str());
EXPECT_EQ(0, (int)dir1.directives.size());
EXPECT_EQ(3, (int)dir1.conf_line);

SrsConfDirective& dir2 = *dir0.directives.at(1);
EXPECT_STREQ("dir2", dir2.name.c_str());
EXPECT_EQ(1, (int)dir2.args.size());
EXPECT_STREQ("arg1", dir2.arg0().c_str());
EXPECT_EQ(0, (int)dir2.directives.size());
EXPECT_EQ(5, (int)dir2.conf_line);
HELPER_ASSERT_FAILED(conf.parse(&buf));
}

VOID TEST(ConfigDirectiveTest, ParseLineNormal)
Expand Down

0 comments on commit 68cc649

Please sign in to comment.