Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Adam <dev@robert-adam.de>2021-07-05 20:21:02 +0300
committerRobert Adam <dev@robert-adam.de>2021-11-10 17:17:10 +0300
commitd33b4be9eca386036d97ea184fc01ec6b7d3bf2c (patch)
tree2590145767422732df338590e960ac11a0f5cbe9 /src/murmur
parent9e0ea404c3aed231f4baff0b4648e4510cd66cda (diff)
FIX(server, ice): Missing locks in ICE functions
Some of the ICE functions were writing data without holding the respective lock.
Diffstat (limited to 'src/murmur')
-rw-r--r--src/murmur/MurmurIce.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/murmur/MurmurIce.cpp b/src/murmur/MurmurIce.cpp
index 464f75efd..d4bd088fc 100644
--- a/src/murmur/MurmurIce.cpp
+++ b/src/murmur/MurmurIce.cpp
@@ -1002,8 +1002,10 @@ static void impl_Server_setConf(const ::Murmur::AMD_Server_setConfPtr cb, int se
QString k = u8(key);
QString v = u8(value);
ServerDB::setConf(server_id, k, v);
- if (server)
+ if (server) {
+ QWriteLocker wl(&server->qrwlVoiceThread);
server->setLiveConf(k, v);
+ }
cb->ice_response();
}
@@ -1135,6 +1137,7 @@ static void impl_Server_getBans(const ::Murmur::AMD_Server_getBansPtr cb, int se
static void impl_Server_setBans(const ::Murmur::AMD_Server_setBansPtr cb, int server_id,
const ::Murmur::BanList &bans) {
NEED_SERVER;
+ QWriteLocker wl(&server->qrwlVoiceThread);
server->qlBans.clear();
foreach (const ::Murmur::Ban &mb, bans) {
::Ban ban;
@@ -1358,8 +1361,11 @@ static void impl_Server_addChannel(const ::Murmur::AMD_Server_addChannelPtr cb,
QString qsName = u8(name);
- nc = server->addChannel(p, qsName);
- server->updateChannel(nc);
+ {
+ QWriteLocker wl(&server->qrwlVoiceThread);
+ nc = server->addChannel(p, qsName);
+ server->updateChannel(nc);
+ }
int newid = nc->iId;
MumbleProto::ChannelState mpcs;
@@ -1523,7 +1529,11 @@ static void impl_Server_registerUser(const ::Murmur::AMD_Server_registerUserPtr
QMap< int, QString > info;
infoToInfo(im, info);
- int userid = server->registerUser(info);
+ int userid;
+ {
+ QWriteLocker wl(&server->qrwlVoiceThread);
+ userid = server->registerUser(info);
+ }
if (userid < 0)
cb->ice_exception(InvalidUserException());
else
@@ -1533,6 +1543,9 @@ static void impl_Server_registerUser(const ::Murmur::AMD_Server_registerUserPtr
static void impl_Server_unregisterUser(const ::Murmur::AMD_Server_unregisterUserPtr cb, int server_id,
::Ice::Int userid) {
NEED_SERVER;
+
+ QWriteLocker wl(&server->qrwlVoiceThread);
+
if (!server->unregisterUser(userid))
cb->ice_exception(InvalidUserException());
else
@@ -1640,6 +1653,9 @@ static void impl_Server_setTexture(const ::Murmur::AMD_Server_setTexturePtr cb,
char *ptr = qba.data();
for (unsigned int i = 0; i < tex.size(); ++i)
ptr[i] = tex[i];
+
+ QWriteLocker wl(&server->qrwlVoiceThread);
+
if (!server->setTexture(userid, qba)) {
cb->ice_exception(InvalidTextureException());
} else {
@@ -1706,7 +1722,10 @@ static void impl_Server_updateCertificate(const ::Murmur::AMD_Server_updateCerti
server->setConf("certificate", u8(certificate));
server->setConf("key", u8(privateKey));
server->setConf("passphrase", u8(passphrase));
- server->initializeCert();
+ {
+ QWriteLocker wl(&server->qrwlVoiceThread);
+ server->initializeCert();
+ }
cb->ice_response();
}