From afd20563ad2ddc1c227c19b48cfd189f1906fbff Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 20 Aug 2020 13:56:05 +0800 Subject: [PATCH] Refine string dump to hex --- trunk/src/app/srs_app_utility.cpp | 18 +++++++-- trunk/src/utest/srs_utest_rtc.cpp | 66 +++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index a6c72f722..5228da9cf 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -1298,13 +1298,14 @@ string srs_string_dumps_hex(const char* str, int length, int limit) string srs_string_dumps_hex(const char* str, int length, int limit, char seperator, int line_limit, char newline) { - const int LIMIT = 1024*16; + // 1 byte trailing '\0'. + const int LIMIT = 1024*16 + 1; static char buf[LIMIT]; int len = 0; - for (int i = 0; i < length && i < limit && i < LIMIT; ++i) { + for (int i = 0; i < length && i < limit && i < LIMIT && len < LIMIT; ++i) { int nb = snprintf(buf + len, LIMIT - len, "%02x", (uint8_t)str[i]); - if (nb < 0 || nb > LIMIT - len) { + if (nb < 0 || nb >= LIMIT - len) { break; } len += nb; @@ -1325,6 +1326,17 @@ string srs_string_dumps_hex(const char* str, int length, int limit, char seperat if (len <= 0) { return ""; } + + // If overflow, cut the trailing newline. + if (newline && len >= LIMIT - 2 && buf[len - 1] == newline) { + len--; + } + + // If overflow, cut the trailing seperator. + if (seperator && len >= LIMIT - 3 && buf[len - 1] == seperator) { + len--; + } + return string(buf, len); } diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index 0c8de5247..d7d850dba 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -34,6 +34,72 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include using namespace std; +VOID TEST(KernelRTCTest, StringDumpHexTest) +{ + // Typical normal case. + if (false) { + char data[8]; + data[0] = (char)0x3c; data[sizeof(data) - 2] = (char)0x67; data[sizeof(data) - 1] = (char)0xc3; + string r = srs_string_dumps_hex(data, sizeof(data), INT_MAX, 0, 0, 0); + EXPECT_EQ(16, (int)r.length()); + EXPECT_EQ('3', r.at(0)); EXPECT_EQ('c', r.at(1)); + EXPECT_EQ('c', r.at(r.length() - 2)); EXPECT_EQ('3', r.at(r.length() - 1)); + EXPECT_EQ('6', r.at(r.length() - 4)); EXPECT_EQ('7', r.at(r.length() - 3)); + } + + // Fill all buffer. + if (false) { + char data[8 * 1024]; + data[0] = (char)0x3c; data[sizeof(data) - 2] = (char)0x67; data[sizeof(data) - 1] = (char)0xc3; + string r = srs_string_dumps_hex(data, sizeof(data), INT_MAX, 0, 0, 0); + EXPECT_EQ(16 * 1024, (int)r.length()); + EXPECT_EQ('3', r.at(0)); EXPECT_EQ('c', r.at(1)); + EXPECT_EQ('c', r.at(r.length() - 2)); EXPECT_EQ('3', r.at(r.length() - 1)); + EXPECT_EQ('6', r.at(r.length() - 4)); EXPECT_EQ('7', r.at(r.length() - 3)); + } + + // Overflow 1 byte. + if (true) { + char data[8 * 1024 + 1]; + data[0] = (char)0x3c; data[sizeof(data) - 2] = (char)0x67; data[sizeof(data) - 1] = (char)0xc3; + string r = srs_string_dumps_hex(data, sizeof(data), INT_MAX, 0, 0, 0); + EXPECT_EQ(16 * 1024, (int)r.length()); + EXPECT_EQ('3', r.at(0)); EXPECT_EQ('c', r.at(1)); + EXPECT_EQ('6', r.at(r.length() - 2)); EXPECT_EQ('7', r.at(r.length() - 1)); + } + + // Fill all buffer, with seperator. + if (true) { + char data[5461]; + data[0] = (char)0x3c; data[sizeof(data) - 2] = (char)0x67; data[sizeof(data) - 1] = (char)0xc3; + string r = srs_string_dumps_hex(data, sizeof(data), INT_MAX, ',', 0, 0); + EXPECT_EQ(16383 - 1, (int)r.length()); + EXPECT_EQ('3', r.at(0)); EXPECT_EQ('c', r.at(1)); + EXPECT_EQ('c', r.at(r.length() - 2)); EXPECT_EQ('3', r.at(r.length() - 1)); + EXPECT_EQ('6', r.at(r.length() - 5)); EXPECT_EQ('7', r.at(r.length() - 4)); + } + + // Overflow 1 byte, with seperator. + if (true) { + char data[5461 + 1]; + data[0] = (char)0x3c; data[sizeof(data) - 2] = (char)0x67; data[sizeof(data) - 1] = (char)0xc3; + string r = srs_string_dumps_hex(data, sizeof(data), INT_MAX, ',', 0, 0); + EXPECT_EQ(16383 - 1, (int)r.length()); + EXPECT_EQ('3', r.at(0)); EXPECT_EQ('c', r.at(1)); + EXPECT_EQ('6', r.at(r.length() - 2)); EXPECT_EQ('7', r.at(r.length() - 1)); + } + + // Overflow 1 byte, with seperator and newline. + if (true) { + char data[5461 + 1]; + data[0] = (char)0x3c; data[sizeof(data) - 2] = (char)0x67; data[sizeof(data) - 1] = (char)0xc3; + string r = srs_string_dumps_hex(data, sizeof(data), INT_MAX, ',', 5461, '\n'); + EXPECT_EQ(16383 - 1, (int)r.length()); + EXPECT_EQ('3', r.at(0)); EXPECT_EQ('c', r.at(1)); + EXPECT_EQ('6', r.at(r.length() - 2)); EXPECT_EQ('7', r.at(r.length() - 1)); + } +} + extern SSL_CTX* srs_build_dtls_ctx(SrsDtlsVersion version); class MockDtls