diff --git a/daemon/src/sip/sip_utils.cpp b/daemon/src/sip/sip_utils.cpp index 48df5f46759180770650918ee4e40d853e335624..650916d40d78a7b4f00e0146feddcf64826ff2eb 100644 --- a/daemon/src/sip/sip_utils.cpp +++ b/daemon/src/sip/sip_utils.cpp @@ -96,6 +96,14 @@ sip_utils::createRouteSet(const std::string &route, pj_pool_t *hdr_pool) return route_set; } +static bool +isValidUtf8(const std::string &str) +{ + std::wstring ws(str.size(), u' '); + const size_t wideSize = mbstowcs(&ws[0], str.c_str(), str.size()); + return wideSize != std::wstring::npos; +} + // FIXME: replace with regex std::string sip_utils::parseDisplayName(const char * buffer) @@ -124,6 +132,9 @@ sip_utils::parseDisplayName(const char * buffer) end_displayName = temp.find("<"); if (end_displayName != std::string::npos) { begin_displayName = temp.find_first_not_of(" ", temp.find(":")); + if (begin_displayName == std::string::npos) + return ""; + // omit trailing/leading spaces begin_displayName++; end_displayName--; @@ -137,6 +148,12 @@ sip_utils::parseDisplayName(const char * buffer) std::string displayName = temp.substr(begin_displayName + 1, end_displayName - begin_displayName - 1); + // Filter out invalid UTF-8 sequences to avoid getting kicked from D-Bus + if (not isValidUtf8(displayName)) { + ERROR("Invalid UTF-8 sequence detected: %s", displayName.c_str()); + return ""; + } + static const size_t MAX_DISPLAY_NAME_SIZE = 25; if (displayName.size() > MAX_DISPLAY_NAME_SIZE) return displayName.substr(0, MAX_DISPLAY_NAME_SIZE); diff --git a/daemon/test/siptest.cpp b/daemon/test/siptest.cpp index 3eb0c492d6147b199725d3b10e09d0ae483cc88e..07607b4eb88ffbbb79f1122fe60283782d9c1e42 100644 --- a/daemon/test/siptest.cpp +++ b/daemon/test/siptest.cpp @@ -383,6 +383,8 @@ void SIPTest::testParseDisplayName() {"\nFrom: <sip:6926666@4.4.4.4>;tag=4421-D9700", ""}, {"\nFrom: <sip:pinger@sipwise.local>;tag=01f516a4", ""}, {"\nFrom: sip:pinger@sipwise.local;tag=01f516a4", ""}, + {"\nFrom: ", ""}, + {"\nFrom: \"±\"", ""}, {"\nFrom: sip:+1212555@server.example.com;tag=887s", ""}}; for (const auto &t : test_set) {