summaryrefslogtreecommitdiff
path: root/community/znc/01-sec-correctly-handle-channel-names.patch
blob: cc48d13c9286c65f36ae17c9969f1af820780f28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
From 8756be513ab6663dcd64087006b257ff34e8e487 Mon Sep 17 00:00:00 2001
From: Uli Schlachter <psychon@znc.in>
Date: Sun, 13 Apr 2014 20:36:55 +0200
Subject: [PATCH] webadmin/add channel: Correctly handle channel names

The CChan constructor makes sure that the channel name begins with a valid
channel prefix. Thus, this could change the name of the resulting channel.

When you edited an irc network which already had a channel "#foo", were
connected to IRC (so ZNC knows which prefixes are valid) and added a channel
"foo", this would lead to a problem:

Webadmin checks and sees that there is no channel "foo" yet. Webadmin creates a
new CChan instance for "foo". The CChan constructor notices that "f" is not a
valid channel prefix and instead calls itself "#foo". Then,
CIRCNetwork::AddChan() would see that this channel already exists, delete the
given channel and return false.

However, webadmin didn't check this result and would continue changing settings
on an already destroyed CChan instance.

Fix this by checking if the channel exists after CChan had its chance to mess
with the channel name. Also handle failures from CIRCNetwork::AddChan().

Fixes #528.

Signed-off-by: Uli Schlachter <psychon@znc.in>
(cherry picked from commit 5e6e3be32acfeadeaf1fb3bb17bada08aec6432f)
---
 modules/webadmin.cpp | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp
index ec67508..2a03367 100644
--- a/modules/webadmin.cpp
+++ b/modules/webadmin.cpp
@@ -667,13 +667,19 @@ class CWebAdminMod : public CModule {
 				return true;
 			}
 
-			if (pNetwork->FindChan(sChanName.Token(0))) {
-				WebSock.PrintErrorPage("Channel [" + sChanName.Token(0) + "] already exists");
+			// This could change the channel name and e.g. add a "#" prefix
+			pChan = new CChan(sChanName, pNetwork, true);
+
+			if (pNetwork->FindChan(pChan->GetName())) {
+				WebSock.PrintErrorPage("Channel [" + pChan->GetName() + "] already exists");
+				delete pChan;
 				return true;
 			}
 
-			pChan = new CChan(sChanName, pNetwork, true);
-			pNetwork->AddChan(pChan);
+			if (!pNetwork->AddChan(pChan)) {
+				WebSock.PrintErrorPage("Could not add channel [" + pChan->GetName() + "]");
+				return true;
+			}
 		}
 
 		pChan->SetBufferCount(WebSock.GetParam("buffercount").ToUInt(), spSession->IsAdmin());
@@ -699,7 +705,7 @@ class CWebAdminMod : public CModule {
 
 		CTemplate TmplMod;
 		TmplMod["User"] = pUser->GetUserName();
-		TmplMod["ChanName"] = sChanName;
+		TmplMod["ChanName"] = pChan->GetName();
 		TmplMod["WebadminAction"] = "change";
 		FOR_EACH_MODULE(it, pNetwork) {
 			(*it)->OnEmbeddedWebRequest(WebSock, "webadmin/channel", TmplMod);
-- 
1.9.1