diff --git a/overlay_gl/overlay.c b/overlay_gl/overlay.c index 0e8beb697..34d9ae680 100644 --- a/overlay_gl/overlay.c +++ b/overlay_gl/overlay.c @@ -342,6 +342,10 @@ void glXSwapBuffers(Display * dpy, GLXDrawable draw) { if ((nelem == 1) && (myctx)) { c = (Context *) malloc(sizeof(Context)); + if (!c) { + ods("malloc failure"); + return; + } c->next = contexts; c->glctx = myctx; diff --git a/src/mumble/GlobalShortcut_unix.cpp b/src/mumble/GlobalShortcut_unix.cpp index 5c12fddfc..716d7a456 100644 --- a/src/mumble/GlobalShortcut_unix.cpp +++ b/src/mumble/GlobalShortcut_unix.cpp @@ -391,6 +391,8 @@ void GlobalShortcutX::inputReadyRead(int) { remap(); QFile *f=qobject_cast(sender()->parent()); + if (!f) + return; while (f->read(reinterpret_cast(&ev), sizeof(ev)) == sizeof(ev)) { if (ev.type != EV_KEY) continue; diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp index 861ec91c9..09a9a5d38 100644 --- a/src/mumble/MainWindow.cpp +++ b/src/mumble/MainWindow.cpp @@ -478,9 +478,7 @@ void MainWindow::on_qmChannel_aboutToShow() { } if (! c) c = Channel::get(0); - unlinkall = (home->qhLinks.count() > 0); - if (home != c) { if (c->allLinks().contains(home)) unlink = true; @@ -805,6 +803,8 @@ void MainWindow::pushLink(bool down) { return; GlobalShortcut *gs = qobject_cast(sender()); + if (! gs) + return; int idx = gs->data().toInt(); Channel *home = ClientPlayer::get(g.uiSession)->cChannel; diff --git a/src/mumble/Messages.cpp b/src/mumble/Messages.cpp index 1521c2d81..1d1420aaa 100644 --- a/src/mumble/Messages.cpp +++ b/src/mumble/Messages.cpp @@ -220,18 +220,27 @@ void MainWindow::msgPlayerRename(Connection *, MessagePlayerRename *msg) { } void MainWindow::msgChannelAdd(Connection *, MessageChannelAdd *msg) { + if (msg->iId == 0) + return; + Channel *p = Channel::get(msg->iParent); if (p) pmModel->addChannel(msg->iId, p, msg->qsName); } void MainWindow::msgChannelRemove(Connection *, MessageChannelRemove *msg) { + if (msg->iId == 0) + return; + Channel *c = Channel::get(msg->iId); if (c) pmModel->removeChannel(c); } void MainWindow::msgChannelMove(Connection *, MessageChannelMove *msg) { + if (msg->iId == 0) + return; + Channel *c = Channel::get(msg->iId); Channel *p = Channel::get(msg->iParent); if (c && p) @@ -239,6 +248,9 @@ void MainWindow::msgChannelMove(Connection *, MessageChannelMove *msg) { } void MainWindow::msgChannelRename(Connection *, MessageChannelRename *msg) { + if (msg->iId == 0) + return; + Channel *c = Channel::get(msg->iId); if (c && c->cParent) pmModel->renameChannel(c, msg->qsName); diff --git a/src/mumble/PlayerModel.cpp b/src/mumble/PlayerModel.cpp index 21f598be8..565a7029a 100644 --- a/src/mumble/PlayerModel.cpp +++ b/src/mumble/PlayerModel.cpp @@ -129,6 +129,9 @@ int ModelItem::rowOfSelf() const { ModelItem *p = parent(); Q_ASSERT(p); + + if (!p) + return 0; if (pPlayer) return p->rowOf(pPlayer); @@ -231,6 +234,8 @@ QModelIndex PlayerModel::index(ClientPlayer *p, int column) const { ModelItem *item = ModelItem::c_qhPlayers.value(p); Q_ASSERT(p); Q_ASSERT(item); + if (!p || ! item) + return QModelIndex(); QModelIndex idx=createIndex(item->rowOfSelf(), column, item); return idx; } @@ -239,7 +244,7 @@ QModelIndex PlayerModel::index(Channel *c) const { ModelItem *item = ModelItem::c_qhChannels.value(c); Q_ASSERT(c); Q_ASSERT(item); - if (!c || ! c->parent()) + if (!item || !c || ! c->parent()) return QModelIndex(); QModelIndex idx=createIndex(item->rowOfSelf(), 0, item); return idx; @@ -446,6 +451,9 @@ void PlayerModel::unbugHide(const QModelIndex &idx) { void PlayerModel::hidePlayer(ClientPlayer *p) { Channel *c = p->cChannel; ModelItem *item = ModelItem::c_qhChannels.value(c); + + if (! item) + return; int row = item->rowOf(p); @@ -469,6 +477,9 @@ void PlayerModel::showPlayer(ClientPlayer *p, Channel *c) { Q_ASSERT(c); Q_ASSERT(item); + if (!c || !p || ! item) + return; + int row = item->insertIndex(p); beginInsertRows(index(c), row, row); @@ -576,6 +587,9 @@ void PlayerModel::showChannel(Channel *c, Channel *p) { Q_ASSERT(c); Q_ASSERT(item); + if (!c || !p || ! item) + return; + int row = item->insertIndex(c); beginInsertRows(index(p), row, row); @@ -593,6 +607,9 @@ void PlayerModel::hideChannel(Channel *c) { Channel *p = c->cParent; ModelItem *item = ModelItem::c_qhChannels.value(p); + if (! item) + return; + int row = item->rowOf(c); unbugHide(index(c)); @@ -621,6 +638,8 @@ void PlayerModel::removeChannel(Channel *c) { Channel *subc; item=ModelItem::c_qhChannels.value(c); + if (! item) + return; foreach(subc, item->qlChannels) removeChannel(subc); @@ -696,6 +715,9 @@ Channel *PlayerModel::getChannel(const QModelIndex &idx) const { Channel *PlayerModel::getSubChannel(Channel *p, int idx) const { ModelItem *item=ModelItem::c_qhChannels.value(p); + if (! item) + return NULL; + if (idx < 0 || idx >= item->qlChannels.count()) return NULL; return item->qlChannels.at(idx); @@ -772,6 +794,9 @@ bool PlayerModel::dropMimeData(const QMimeData *md, Qt::DropAction, int, int, co c = getChannel(p); } + if (! c) + return false; + if (! isChannel) { MessagePlayerMove mpm; mpm.uiVictim = uiSession; diff --git a/src/murmur/DBus.cpp b/src/murmur/DBus.cpp index 041917a61..30b072a90 100644 --- a/src/murmur/DBus.cpp +++ b/src/murmur/DBus.cpp @@ -494,14 +494,21 @@ void MurmurDBus::getACL(int id, const QDBusMessage &msg, QList &acls, Q foreach(name, allnames) { Group *g = cChannel->qhGroups.value(name); Group *pg = p ? Group::getGroup(p, name) : NULL; - GroupInfo gi(g); + if (!g && ! pg) + continue; + GroupInfo gi(g ? g : pg); QSet members; - if (pg) { + if (pg) members = pg->members(); - gi.inherited = pg->bInheritable; + if (g) { + gi.add = g->qsAdd.toList(); + gi.remove = g->qsRemove.toList(); + gi.inherited = false; + members+=g->qsAdd; + members-=g->qsRemove; + } else { + gi.inherited = true; } - members+=g->qsAdd; - members-=g->qsRemove; gi.members = members.toList(); groups << gi; } @@ -659,8 +666,6 @@ GroupInfo::GroupInfo(Group *g) { name = g->qsName; inherit = g->bInherit; inheritable = g->bInheritable; - add = g->qsAdd.toList(); - remove = g->qsRemove.toList(); members.clear(); } diff --git a/src/murmur/Messages.cpp b/src/murmur/Messages.cpp index 3d586ef26..d2f95d0d3 100644 --- a/src/murmur/Messages.cpp +++ b/src/murmur/Messages.cpp @@ -569,6 +569,8 @@ void Server::msgChannelLink(Connection *cCon, MessageChannelLink *msg) { Channel *l = (msg->qlTargets.count() == 1) ? qhChannels.value(msg->qlTargets[0]) : NULL; + QSet oldset = c->qhLinks.keys().toSet(); + switch (msg->ltType) { case MessageChannelLink::Link: if (!l) @@ -577,43 +579,31 @@ void Server::msgChannelLink(Connection *cCon, MessageChannelLink *msg) { PERM_DENIED(uSource, l, ChanACL::LinkChannel); return; } - break; - case MessageChannelLink::Unlink: - if (!l) - return; - break; - case MessageChannelLink::UnlinkAll: - if (msg->qlTargets.count() > 0) - return; - break; - default: - if (msg->qlTargets.count() <= 0) - return; - } - - QSet oldset = c->qhLinks.keys().toSet(); - - switch (msg->ltType) { - case MessageChannelLink::UnlinkAll: - c->unlink(NULL); - removeLink(c, NULL); - dbus->channelStateChanged(c); - log(uSource, "Unlinked all from channel %s", qPrintable(c->qsName)); - sendAll(msg); - return; - case MessageChannelLink::Link: c->link(l); addLink(c, l); dbus->channelStateChanged(c); log(uSource, "Linked channel %s to %s", qPrintable(c->qsName),qPrintable(l->qsName)); break; case MessageChannelLink::Unlink: + if (!l) + return; c->unlink(l); removeLink(c, l); dbus->channelStateChanged(c); log(uSource, "Unlinked channel %s from %s", qPrintable(c->qsName), qPrintable(l->qsName)); break; + case MessageChannelLink::UnlinkAll: + if (msg->qlTargets.count() > 0) + return; + c->unlink(NULL); + removeLink(c, NULL); + dbus->channelStateChanged(c); + log(uSource, "Unlinked all from channel %s", qPrintable(c->qsName)); + sendAll(msg); + return; case MessageChannelLink::PushLink: + if (msg->qlTargets.count() <= 0) + return; foreach(int tid, msg->qlTargets) { l=qhChannels.value(tid); if (l && hasPermission(uSource, l, ChanACL::LinkChannel)) @@ -621,12 +611,17 @@ void Server::msgChannelLink(Connection *cCon, MessageChannelLink *msg) { } break; case MessageChannelLink::PushUnlink: + if (msg->qlTargets.count() <= 0) + return; foreach(int tid, msg->qlTargets) { l=qhChannels.value(tid); if (l) c->playerUnlink(l, uSource); } break; + default: + if (msg->qlTargets.count() <= 0) + return; } QSet newset = c->qhLinks.keys().toSet(); diff --git a/src/murmur/Server.cpp b/src/murmur/Server.cpp index 1a81bf4fb..5bb3f9e7a 100644 --- a/src/murmur/Server.cpp +++ b/src/murmur/Server.cpp @@ -489,13 +489,16 @@ void Server::sslError(const QList &errors) { } } if (ok) { - Connection *c = dynamic_cast(sender()); - c->proceedAnyway(); + Connection *c = qobject_cast(sender()); + if (c) + c->proceedAnyway(); } } void Server::connectionClosed(QString reason) { - Connection *c = dynamic_cast(sender()); + Connection *c = qobject_cast(sender()); + if (! c) + return; User *u = static_cast(c); log(u, "Connection closed: %s", qPrintable(reason)); @@ -582,11 +585,6 @@ void Server::doSync(unsigned int id) { } } -void Server::sendMessage(unsigned int id, Message *mMsg) { - Connection *c = qhUsers.value(id); - sendMessage(c, mMsg); -} - void Server::sendMessage(Connection *c, Message *mMsg) { c->sendMessage(mMsg); } diff --git a/src/murmur/Server.h b/src/murmur/Server.h index d9e6a534b..622b989d0 100644 --- a/src/murmur/Server.h +++ b/src/murmur/Server.h @@ -180,10 +180,8 @@ class Server : public QThread, public MessageHandler { void sendAll(Message *); void sendExcept(Message *, Connection *); - void sendMessage(unsigned int, Message *); void sendMessage(Connection *, Message *); -// void log(QString s, Connection *c = NULL); __attribute__((format(printf, 2, 3))) void log(const char *format, ...); __attribute__((format(printf, 3, 4))) void log(User *u, const char *format, ...);