As things are now, 'systemctl start murmur' hangs and eventually times
out.
The problem is that in the unit file, both Type=forking and
PIDFile=/run/murmur/murmur.pid are specified. In this scenario systemd
will wait for the PID file to appear. However, it will never appear
there, as murmur does setuid on its own before writing the pid file,
and thus lacks the rights to write to /run, and even if it had the rights,
it doesn't try to create a missing directory anyway.
Switch to Type=exec and foreground mode to fix this. systemd services
don't really need forking behaviour anyway, and in fact handling
forking servers requires some extra hoops to jump through on the
systemd side.
This change also makes murmur (when run with murmur.service) to log
to the systemd journal instead of log files.
Although the unit file has been broken for a long time, Debian-based
distros still use the /etc/init.d/mumble-server wrapped with
systemd-sysv-generator, and haven't noticed the problem.
Before this commit, the code on the server made sure that a
ChannelListener would always receive audio that was being shouted to a
channel. It didn't respect though if the shout was actually restricted
to be received by only a specific group.
This patch now makes sure that listeners are also checked for their
group so that a listener that doesn't belong to the target group (if one
is set) won't receive the audio either.
The race condition was that the channel of a user could be modified
and before it gets updated in the TalkingUI as well, the talking state
of that user changes. Then inside the talkingStateChanged function the
code would assume that the TalkingUIUser is in the container representing
the current channel of that user but in fact in the TalkingUI this user
is still in its own channel, causing the user-search to return nullptr
which then yields a SegFault as soon as the returned pointer gets
dereferenced.
The race condition was that the channel of a user could be modified
and before it gets updated in the TalkingUI as well, the talking state
of that user changes. Then inside the talkingStateChanged function the
code would assume that the TalkingUIUser is in the container representing
the current channel of that user but in fact in the TalkingUI this user
is still in its own channel, causing the user-search to return nullptr
which then yields a SegFault as soon as the returned pointer gets
dereferenced.
Before this commit, the code on the server made sure that a
ChannelListener would always receive audio that was being shouted to a
channel. It didn't respect though if the shout was actually restricted
to be received by only a specific group.
This patch now makes sure that listeners are also checked for their
group so that a listener that doesn't belong to the target group (if one
is set) won't receive the audio either.
We used EQUAL to compare the option's value to a String. This however does not work as according to
the cmake documentation on EQUAL says
"True if the given string or variable’s value is a valid number and equal to that on the right."
As we are not comparing numbers but "real Strings", we have to use STREQUAL instead.
When building on CentOS 8 with default flags which includes Wall flag,
build stops because array n[3] is not initialized. Initialize it to have all
values to be zero.
Now that Travis CI decided to stop offering their services for free, we
had to look for an alternative solution. GitHub Actions seems to fit the
picture really well and has the benefit of being tightly integrated into
GitHub (obviously).
For now only shared builds for Ubuntu 18.04 and 20.04 are included. The
scripts and the framework for also including static builds is part of
this commit as well but as it stands the static build always failed and
therefore it was given up upon for now.
Adding support for other OS will require a few tweaks and a couple of
new scripts but in general the framework was built with this kind of
extension in mind.
When building on CentOS 8 with default flags which includes Wall flag,
build stops because array n[3] is not initialized. Initialize it to have all
values to be zero.
Now that Travis CI decided to stop offering their services for free, we
had to look for an alternative solution. GitHub Actions seems to fit the
picture really well and has the benefit of being tightly integrated into
GitHub (obviously).
For now only shared builds for Ubuntu 18.04 and 20.04 are included. The
scripts and the framework for also including static builds is part of
this commit as well but as it stands the static build always failed and
therefore it was given up upon for now.
Adding support for other OS will require a few tweaks and a couple of
new scripts but in general the framework was built with this kind of
extension in mind.
Part 1
The Dockerfile contained instructions at the wrong position causing it
to not work properly (it didn't install the necessary dependencies).
Fixes#4600
Part 2
Don't install qtcreator via Dockerfile
The Qt Creator IDE should not be needed in the Docker image at all.
By default this library is needed as the option overlay-xcompile
defaults to ON. Therefore we should list g++-multilib as a dependency
directly and only mention how to get rid of this dependency, not the
other way around.
This will probably avoid some confusion on the reader's side.
By default this library is needed as the option overlay-xcompile
defaults to ON. Therefore we should list g++-multilib as a dependency
directly and only mention how to get rid of this dependency, not the
other way around.
This will probably avoid some confusion on the reader's side.
The issue of cmake finding an incompatible OpenSSL version was
encountered on macOS in #4486, which is why the problem is also
explicitly mentioned in the macOS instructions.
The issue of cmake finding an incompatible OpenSSL version was
encountered on macOS in #4486, which is why the problem is also
explicitly mentioned in the macOS instructions.
In cases where the TalkingUI was overlaying the MainWindow, it could
happen that a context menu triggered from the TalkingUI would actually
be created using another element (listener, channel, user) as the
context for that menu. This would happen because in these cases there is
an entry below the cursor (behind the TalkingUI) that would
automatically be recognized as the desired target.
The fix works by explicitly disabling the position-dependent target
search and using explicitly defined targets instead.
In cases where the TalkingUI was overlaying the MainWindow, it could
happen that a context menu triggered from the TalkingUI would actually
be created using another element (listener, channel, user) as the
context for that menu. This would happen because in these cases there is
an entry below the cursor (behind the TalkingUI) that would
automatically be recognized as the desired target.
The fix works by explicitly disabling the position-dependent target
search and using explicitly defined targets instead.
Tested with v2020.10.22s and v2020.09.22s.
Unless the pattern we're searching for becomes invalid or the structures we're using change, the plugin should keep working.
searchInBuffer() searches for the specified pattern in the specified buffer. "?" is used as wildcard.
findPattern(), given a start address and the size of the area, reads memory in chunks of 32 KiB.
It stops when a match is found, the end is reached or an error is encountered (peek() fails).
There's also an overload which iterates through the specified module's readable regions.
The code was retrieving the wrong offset (GetLocalClient).
As a result, peek() always returned 0 and the player ID was always 1.
The plugin appeared to be working fine because the player ID is always 1 when playing locally.
Previously, only module() was present: it retrieved the base address of the specified module.
It worked fine, but it iterated through the process' modules every time it was called.
This commit replaces it with modules(), which returns an std::unordered_map containing all modules.
The map uses the module name as key and Module as value.
Aside from the performance improvement, the new code also provides info for each module region:
- Start address.
- Size.
- Whether it's readable, writable and/or executable.