Building with CFLAGS="-flto -Werror=odr -Werror=lto-type-mismatch
-Werror=strict-aliasing" CXXFLAGS="-flto -Werror=odr
-Werror=lto-type-mismatch -Werror=strict-aliasing" LDFLAGS=-flto fails
due to a violation of the one definition rule. There are two different
definitions of TOption that are both linked into the znc binary.
Fix this by putting them into anonymous namespaces.
Fixes: https://github.com/znc/znc/issues/1834
Signed-off-by: Uli Schlachter <psychon@znc.in>
The specification requires AUTHENTICATE information to be split into
chunks of size 400. This commit implements the necessary chunking.
Fixes: https://github.com/znc/znc/issues/942
Signed-off-by: Uli Schlachter <psychon@znc.in>
So far this is not integrated with ClientCommand.cpp or webadmin.cpp, so
the only way to actually use this is to hand-editing the config with a
<Listener> section like the following:
<Listener 42>
Path = /tmp/listen
SSL = false
</Listener>
So far this received only very basic testing. I did not even test SSL support.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This splits up CListener into a TCP-specific class and a general class.
The intention is to later add another class inheriting from CListener
that listens on unix sockets.
Signed-off-by: Uli Schlachter <psychon@znc.in>
The output style of tables was recently changed. This broke the
ControlpanelModule integration test. Adapt some of the patterns used so
that they work again.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Previously, "more or less unrelated" things would fail. After this
change, also a message is printing that gives a hint on what went wrong.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This fixes the following error (copied from config.log):
conftest.cpp:49:14: error: no previous declaration for 'void
test_template_alias_sfinae::test()' [-Werror=missing-declarations]
Signed-off-by: Uli Schlachter <psychon@znc.in>
(cherry picked from commit 2d1336dcf3)
These functions shouldn't be visible outside of this file. This was caught by
-Werror=missing-declarations.
Signed-off-by: Uli Schlachter <psychon@znc.in>
From pthread_cond_wait()'s man page:
When using condition variables there is always a boolean predicate involving
shared variables associated with each condition wait that is true if the
thread should proceed. Spurious wakeups from the pthread_cond_wait() or
pthread_cond_timedwait() functions may occur. Since the return from
pthread_cond_wait() or pthread_cond_timedwait() does not imply anything about
the value of this predicate, the predicate should be re-evaluated upon such
return.
Fix ~CThreadPool() to account for this possibility.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This fixes the following error (copied from config.log):
conftest.cpp:49:14: error: no previous declaration for 'void
test_template_alias_sfinae::test()' [-Werror=missing-declarations]
Signed-off-by: Uli Schlachter <psychon@znc.in>
When a job was cancelled after its runThread() method finished, but before the
main thread noticed this and reacted, we would just run runMain() before and
pretend the job finished normally.
However, with CModuleJob this means that runMain() might get called for a module
which is currently being destructed. This has bad effects with virtual functions
and thus causes problems. It's better to just really cancel the job instead.
Signed-off-by: Uli Schlachter <psychon@znc.in>
There was a race where threads were themselves responsible for increasing the
counter for the number of running threads. This left an open window where the
thread was already started, but our counter was not yet increased. The effect of
this race would be that we start more threads than we should.
Fix this by increasing the counter before actually starting new worker threads.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This adds CThreadPool::cancelJob() and cancelJobs() which can cancel a set of
jobs synchronously. These functions only return when the job was successfully
cancelled.
It tries to cancel the jobs as quickly as possible, skipping any callbacks on
CJob that were not yet called. A job that is already running can use
CJob::wasCancelled() to check if it should quit.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This is needed to "get rid" of the C++ default implementation. Yes, I know that
this can be done way nicer with C++11...
Signed-off-by: Uli Schlachter <psychon@znc.in>
Currently the connection timeout handling of znc uses three magic numbers, each
of which is at least repeated in two unrelated places. This commits defines the
numbers in CIRCNetwork and makes the other places just use this number.
This also renames PING_TIMEOUT to PING_FREQUENCY because I feel that describes
this constant better.
I am not really happy about the name NO_TRAFFIC_TIMEOUT that is used for the
real timeout, but I couldn't think of a better name. PING_TIMEOUT isn't good
because that sounds like the time between sending a PING and the resulting
timeout.
Signed-off-by: Uli Schlachter <psychon@znc.in>
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>
Somehow I ended up only testing the automatic detection and the error message
from --enable-charset. I totally forgot that --disable-charset should skip the
whole check.
Thanks to Robby for reporting this.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This override the auto detection. If --enable-charset is given, but icu can't be
found, configure will error out.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This adds a short reason to the summary at the end of configure (for options
where it makes sense, e.g. not debug or ipv6).
Example:
charset: no (icu-uc not found via pkg-config)
Signed-off-by: Uli Schlachter <psychon@znc.in>
Currently, znc has a limit of 5 web sessions per IP address. This limit exists
to defend against some obvious DoS attacks. When this limit is hit, some session
is discarded.
Previously, we would discard the session that std::multimap::find() would give
us. The multimap used mapped from IP addresses to sessions. Thus, we would
discard the oldest session.
This commit changes this into some least-recently-used logic. Whenever a session
is used, we record the timestamp of this. Then when a session has to be picked
for discarding, the one with the oldest timestamp is used.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This reverts commit 11e5f7636d.
Having this in the raw buffer multiple times is obviously wrong, because you can
use /oper more than once and would get a new 381 numeric each time. So this
would need to use UpdateRawBuffer() instead of AddRawBuffer() (=replace old
entries with the same text).
However, this is still wrong. If you -o yourself, you no longer have oper
status. ZNC wouldn't notice this and still deliver the 381 numeric to new
clients.
Clients which use raw 381 to detect oper status will have to switch to user mode
+o.
Thanks to Han` for reporting this problem.
Previously, "make clean" would happily delete swig's output files even though
configure did not find swig and thus these files could not be generated again.
This half-fixes issue 276. It would be great if the Makefiles never delete files
which are part of the tarball, but at least they now don't delete files which
cannot be regenerated.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Previously, every line that was forwarded to the IRCd was printed twice in debug
mode. Once when it got added to the send queue and a second time when it was
actually sent. However, most of the time this queue is empty and thus the two
events happened at approximately the same time.
Thus, this patch now changes the debug output. Lines are only printed extra if
they really have to wait in the queue for a while before they can be sent out.
This has the positive effect of making the debug output more readable, because
it is shorter and less repetitive and it makes it more obvious when znc actively
throttles the traffic that is sent out.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Previously, version.sh got the path to git as its first and only argument. Since
the previous commit, this is not the path to src/version.cpp and the second
argument is the path to git.
However, let's assume someone does "git pull && make". They still have the old
Makefile laying around, which will pass the path to git as the first argument to
version.sh. Thus, this will overwrite /usr/bin/git with some generated source
code. Whoops.
Thanks to KindOne for reporting this problem!
Signed-off-by: Uli Schlachter <psychon@znc.in>
Instead of doing magic with the result from version.sh so that we can add a
preprocessor macro, the script now just writes src/version.cpp with the expected
content. This should fix all the various issues that we have with quoting the
arguments and things that go wrong when not building znc from a git clone.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This just moves the pipe from the socket code to the thread pool. However, now
all CJobs can use this and there is a single place for them to get deleted.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This should make it easier to work with threads. It provides classes for mutexes
and condition variables. Additionally, there is a special CMutexGuard that
automatically unlocks the mutex on destruction and a CThreadPool class.
This thread pool is used to replace the thread pool in the sockets code.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Normally, when the Makefile calls swig, the resulting files end up in the build
directory. However, when the files are pre-generated (e.g. as in the znc 1.0
tarball) and an out of tree build is used, they are in the source directory and
installation fails.
Thanks to Kinji for reporting this.
Signed-off-by: Uli Schlachter <psychon@znc.in>
When you checkout the znc-1.0 tag and try to build znc, this will fail. The
reason is that "git describe" prints just "znc-1.0" and the sed-magic in the
Makefile fails to handle this correctly.
Fix this by moving this magic into a short shell script which doesn't try to
parse the output of "git describe" but instead gets its information from various
sources directly.
Signed-off-by: Uli Schlachter <psychon@znc.in>
When joining a channel, OnMode() (via SetModes()) was called with pOpNick ==
NULL. This bad pointer was turned into a reference and given to modules.
This bug exists since 2008 when the OnMode() module call was added. It wasn't
noticed before because apparently no module used this CNick argument before.
Signed-off-by: Uli Schlachter <psychon@znc.in>
The symptoms looked like this:
Packing man page znc-buildmod.1.gz...
Generating ZNC API for Perl...
Generating ZNC API for Perl...
Generating ZNC API for Perl...
Linking znc...
The reason was that the old rule was executed multiple times in parallel. See
the following commit for more information:
commit 84ec49780e
Author: Uli Schlachter <psychon@znc.in>
Date: Sun Sep 23 12:03:22 2012 +0200
Get rid of the modpythin jobhack
Signed-off-by: Uli Schlachter <psychon@znc.in>
This exists to fix a problem where the python swig API was generated multiple
times in parallel with "make -j3". This problems turns out to be due to the
multiple target rule that this commit removes. Such a rule doesn't mean "this
commands generate multiple files at once" but means "you can use this command
for each of these targets".
Fix this by including Makefile.gen instead of calling it in its own make
process. That way we don't need this "meta rule" which just calls another
Makefile but can use the "real" rules immediately.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Make was always rebuilding modperl/ZNC.so because the Makefile was actually
describing a file modperl/ZNC."so". Fix this by getting rid of the unnecessary
pair of quotes.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Commit b1593238d5 started using the module pointer before the NULL
check. This caused crashes whenever someone (even without a login!) accessed a
web page on znc for a module which didn't exist.
Thanks to J0rd4n` for reporting this to us.
Signed-off-by: Uli Schlachter <psychon@znc.in>
The IMAP RFC allows the server to announce its capabilities before replying to
the LOGIN command. imapauth would misinterpret that as a failed login.
The fix is to only handle lines which contain the tag ("AUTH") used for the
login command.
Thanks to rlpowell for reporting that imapauth doesn't work against
imap.google.com and for testing the fix.
Signed-off-by: Uli Schlachter <psychon@znc.in>
A malicious IRCd could send a WHO reply for a nick which consisted completely
out of prefix characters (thus an empty nick). In this case
std::string::find_first_of() would return std::string::npos. This argument would
make std::string::substr() throw an exception and kill the process.
Signed-off-by: Uli Schlachter <psychon@znc.in>
A DNS thread should never handle any kind of signal. The main thread is
responsible for handling signals and it does so without any kind of locking.
Signed-off-by: Uli Schlachter <psychon@znc.in>
When a DNS thread is done with its lookup, instead of existing immediately, it
now waits for another DNS lookup to do instead. This avoids the cost of
starting/stopping threads all the time.
To make sure that (for whatever reason) the number of waiting threads doesn't
get too high, threads exit if there are more than two DNS threads idling around
with nothing to do.
Fixes#132.
Signed-off-by: Uli Schlachter <psychon@znc.in>
If connecting to a server failed without needing any time for DNS, the connect
timer would busy loop over the networks, because a network re-inserted itself
into the queue and the timer would try the network again.
Fix this by moving the connection queue to a separate instance of std::list when
the timer fires. From then on, we just iterate through that list while networks
which want to try again add themselves to the "real" connection queue instead.
We only have to make sure that any networks that are left in the old connection
queue after the timer is done get prepended to the "real" connection queue.
Signed-off-by: Uli Schlachter <psychon@znc.in>
At first the test was failing with the following error due to my CXXFLAGS:
conftest.cpp:20:37: error: parameter 'a' set but not used
[-Werror=unused-but-set-parameter]
Then it figured out that -lpthread works, but I wondered why the test for
"-pthread" still fails. This is where I realized that it is testing with C++
compiler, but puts its stuff in $CFLAGS which is just ignored. So a little
search-and-replace later, this now uses $CXXFLAGS.
At this point the results of the tests looked good, but znc failed to link,
because it didn't use -pthread when linking. One little "PTHREAD_LIBS=" later,
that problem was also gone and I can finally commit this. Yay.
Signed-off-by: Uli Schlachter <psychon@znc.in>
A CIRCNetwork's destructor removes the network from its associated user's list
of networks. Now that you know this, stare at the diff until you figure out the
problem. Yeah, "ouch".
Signed-off-by: Uli Schlachter <psychon@znc.in>
Previously, a certificate generated with --makepem expired after a year which is
weird and pointless (come on, it's self-signed!).
Signed-off-by: Uli Schlachter <psychon@znc.in>
This fixes#96. When the last user in a partyline channel is deleted, the
channel is deleted, too. This invalidates the iterator used in OnDeleteUser().
This fix is to increase the iterator before the channel can be deleted.
After the above fix, znc still crashed due to another broken use of iterators.
When a network is deleted, it takes all its clients with it (why aren't they
just moved into the "no network"-state?"). However, deleting a CClient removes
it from the network's list of clients via CClient::Disconnect(). This resulted
in another invalid use of iterators.
Signed-off-by: Uli Schlachter <psychon@znc.in>
lahwran reported the following message from *route_replies and also figured out
which message we failed to handle, thanks!
<*route_replies> This module hit a timeout which is possibly a bug.
<*route_replies> To disable this message, do "/msg *route_replies silent yes"
<*route_replies> Last request: MODE #somesecretchannel I
Signed-off-by: Uli Schlachter <psychon@znc.in>
lahwran reported the following message from *route_replies and also figured out
which message we failed to handle, thanks!
<*route_replies> This module hit a timeout which is possibly a bug.
<*route_replies> To disable this message, do "/msg *route_replies silent yes"
<*route_replies> Last request: MODE #somesecretchannel I
Signed-off-by: Uli Schlachter <psychon@znc.in>
lahwran just showed up on irc and told us that he installed znc, but znc failed
to find any modules. The reason for this was his umask 077 which means that
"make install" installed stuff so that only root can access it.
The solution is do use "install -d" since that makes sure to ignore the
currently set umask.
However, google finds results which say that "install -d" might mess with stuff
of pre-existing directories when it shouldn't, so we must first test if the
directory already exists before calling install. Obviously, this makes our
Makefile a lot more readable. :-(
I didn't have time to test this properly, so stuff might break.
Signed-off-by: Uli Schlachter <psychon@znc.in>
I definitely fixed this problem already when I ported the macro, so I wonder why
the fix got lost...
config.log says:
conftest.cpp: In function 'void dummyfunc()':
conftest.cpp:13:15: error: no previous declaration for 'void dummyfunc()'
[-Werror=missing-declarations]
Signed-off-by: Uli Schlachter <psychon@znc.in>
This kind of reverts/fixes f1cb09bd9c.
Robby found a bug with evil ChanServ which goes like this:
- You join an empty, but registered channel and the IRCd applies its default
modes (+nt), but ZNC didn't ask for MODE, so doesn't know this.
- ChanServ applies whatever channel modes it wants to apply. This causes ZNC to
see a mode change (e.g. +s).
The result of this is that ZNC thinks that the channel has mode +s and it will
tell every client that connects to it about this.
The fix is to send a MODE request when JOINing. To make sure that we don't
confuse clients, we block the reply.
Signed-off-by: Uli Schlachter <psychon@znc.in>
This is required to make sure that zncconfig.h is the very first header that is
being included.
This problem was noticed by someone reporting some "macro redefined" warnings.
Signed-off-by: Uli Schlachter <psychon@znc.in>
That macro currently was broken. It added flags to $CFLAGS but then called the
C++ compiler. The result was that ZNC didn't compile with GCC 3, because it
tried to use -fvisibility=hidden which isn't supported in that GCC version.
A list of changes done to this macro is contained in a comment.
Signed-off-by: Uli Schlachter <psychon@znc.in>
ZNC is written in C++ and doesn't need a C compiler. This redefine let's us
catch code which accidentally uses the C compiler.
Currently this means that we break due to gl_VISIBILITY.
Signed-off-by: Uli Schlachter <psychon@znc.in>
It pretty much always returned an empty string (or rather: whatever was in the
return variable before, which is an empty string in 99% of cases).
Signed-off-by: Uli Schlachter <psychon@znc.in>