Skip to content
Permalink
Browse files Browse the repository at this point in the history
Don't crash if user specified invalid encoding.
  • Loading branch information
DarthGandalf committed Mar 22, 2019
1 parent 46544d9 commit 64613bc
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 9 deletions.
2 changes: 1 addition & 1 deletion modules/controlpanel.cpp
Expand Up @@ -495,7 +495,7 @@ class CAdminMod : public CModule {
#ifdef HAVE_ICU
else if (sVar == "clientencoding") {
pUser->SetClientEncoding(sValue);
PutModule("ClientEncoding = " + sValue);
PutModule("ClientEncoding = " + pUser->GetClientEncoding());
}
#endif
else
Expand Down
4 changes: 2 additions & 2 deletions src/IRCNetwork.cpp
Expand Up @@ -1482,9 +1482,9 @@ void CIRCNetwork::SetBindHost(const CString& s) {
}

void CIRCNetwork::SetEncoding(const CString& s) {
m_sEncoding = s;
m_sEncoding = CZNC::Get().FixupEncoding(s);
if (GetIRCSock()) {
GetIRCSock()->SetEncoding(s);
GetIRCSock()->SetEncoding(m_sEncoding);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/User.cpp
Expand Up @@ -1253,9 +1253,9 @@ void CUser::SetAdmin(bool b) { m_bAdmin = b; }
void CUser::SetDenySetBindHost(bool b) { m_bDenySetBindHost = b; }
void CUser::SetDefaultChanModes(const CString& s) { m_sDefaultChanModes = s; }
void CUser::SetClientEncoding(const CString& s) {
m_sClientEncoding = s;
m_sClientEncoding = CZNC::Get().FixupEncoding(s);
for (CClient* pClient : GetAllClients()) {
pClient->SetEncoding(s);
pClient->SetEncoding(m_sClientEncoding);
}
}
void CUser::SetQuitMsg(const CString& s) { m_sQuitMsg = s; }
Expand Down
26 changes: 22 additions & 4 deletions src/znc.cpp
Expand Up @@ -2092,18 +2092,36 @@ void CZNC::ForceEncoding() {
m_uiForceEncoding++;
#ifdef HAVE_ICU
for (Csock* pSock : GetManager()) {
if (pSock->GetEncoding().empty()) {
pSock->SetEncoding("UTF-8");
}
pSock->SetEncoding(FixupEncoding(pSock->GetEncoding()));
}
#endif
}
void CZNC::UnforceEncoding() { m_uiForceEncoding--; }
bool CZNC::IsForcingEncoding() const { return m_uiForceEncoding; }
CString CZNC::FixupEncoding(const CString& sEncoding) const {
if (sEncoding.empty() && m_uiForceEncoding) {
if (!m_uiForceEncoding) {
return sEncoding;
}
if (sEncoding.empty()) {
return "UTF-8";
}
const char* sRealEncoding = sEncoding.c_str();
if (sEncoding[0] == '*' || sEncoding[0] == '^') {
sRealEncoding++;
}
if (!*sRealEncoding) {
return "UTF-8";
}
#ifdef HAVE_ICU
UErrorCode e = U_ZERO_ERROR;
UConverter* cnv = ucnv_open(sRealEncoding, &e);
if (cnv) {
ucnv_close(cnv);
}
if (U_FAILURE(e)) {
return "UTF-8";
}
#endif
return sEncoding;
}

Expand Down
7 changes: 7 additions & 0 deletions test/integration/tests/scripting.cpp
Expand Up @@ -55,6 +55,13 @@ TEST_F(ZNCTest, Modpython) {
ircd.Write(":n!u@h PRIVMSG nick :Hi\xF0, github issue #1229");
// "replacement character"
client.ReadUntil("Hi\xEF\xBF\xBD, github issue");

// Non-existing encoding
client.Write("PRIVMSG *controlpanel :Set ClientEncoding $me Western");
client.Write("JOIN #a\342");
client.ReadUntil(
":*controlpanel!znc@znc.in PRIVMSG nick :ClientEncoding = UTF-8");
ircd.ReadUntil("JOIN #a\xEF\xBF\xBD");
}

TEST_F(ZNCTest, ModpythonSocket) {
Expand Down

0 comments on commit 64613bc

Please sign in to comment.