Anonymous | Login | Signup for a new account | 2024-04-23 09:42 UTC |
My View | View Issues | Change Log | Roadmap | Doomseeker Issue Support Ranking | Rules | My Account |
View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0003395 | Doomseeker | [All Projects] Bug | public | 2018-03-03 19:47 | 2020-01-30 12:58 | ||||
Reporter | WubTheCaptain | ||||||||
Assigned To | Zalewa | ||||||||
Priority | low | Severity | crash | Reproducibility | random | ||||
Status | closed | Resolution | fixed | ||||||
Platform | x86_64 | OS | Debian GNU/Linux | OS Version | buster/sid | ||||
Product Version | 1.1 | ||||||||
Target Version | 1.3.1 | Fixed in Version | 1.3.1 | ||||||
Summary | 0003395: Possible crash at start after the configuration directory was removed | ||||||||
Description | Starting a second process of Doomseeker crashed on start (quit immediately) and on next start displayed an empty server list. The first process survived after the crash. I couldn't reproduce this bug yet, but I'll try my best to explain what happened in case it can be reproduced again. In my window manager workspace 5 (out of cursor focus), I had Doomseeker 1.1 running for a long time. Because there was no cursor focus, the server list was also showing as empty. This would of course list all the servers immediately on cursor focus. While this was open and in this state or right before it, I removed the configuration folder $HOME/.doomseeker. (Note, I have $HOME/.config/doomseeker too and didn't touch it, however Doomseeker 1.1 has no awareness of it since it's a Doomseeker 1.2 thing.) Then, I executed Doomseeker 1.1 again in workspace 6. The main window displayed for a brief moment without any servers and then crashed. No dialog for "first time run" was displayed. The first process in workspace 5 was still out of focus, but working and got the servers again after focus. Starting the second process in workspace 6 again would display the empty server list, and again have no "first time run" dialog. | ||||||||
Additional Information | Whether any of these steps to reproduce are correct is unknown. I didn't have stdout or stderr open, unfortunately. It could also be the "empty server list" is the master server throttling response. | ||||||||
Attached Files | 2018-09-22-crash.log [^] (2,458 bytes) 2018-09-22 01:48 2018-09-22-02-05-14-crash.log [^] (2,134 bytes) 2018-09-22 02:12 2020-01-19-125651_maim.png [^] (29,579 bytes) 2020-01-19 12:57 2020-01-19-125725_maim.png [^] (29,222 bytes) 2020-01-19 12:57 | ||||||||
Relationships | ||||||
|
Notes | |
(0019351) WubTheCaptain (reporter) 2018-08-20 20:43 |
Reproduced this today while launching 1.1. I think I launched 1.2 with a first launch, closed it and launched 1.1 with a first launch. Not sure anymore. Now my Doomseeker 1.1 doesn't list servers due to this fault or something else, heh. (Recreating the .doomseeker directory will probably fix this.) |
(0019352) WubTheCaptain (reporter) 2018-08-20 20:45 |
Doomseeker 1.1 output from console:$ doomseeker [20:44:27] Starting Doomseeker. Hello World! :) [20:44:27] Setting up data directories. [20:44:27] Attempting to load plugins from directory: /home/wub/.doomseeker/engines [20:44:27] Attempting to load plugins from directory: /usr/bin/engines [20:44:27] Attempting to load plugins from directory: engines [20:44:27] Attempting to load plugins from directory: /usr/share/doomseeker/engines [20:44:27] Loaded plugin: "Zandronum"! [20:44:27] Listening to Zandronum's LAN servers broadcasts on port 15101. [20:44:27] Initializing configuration file. [20:44:27] Setting INI file: /home/wub/.doomseeker/doomseeker.ini [20:44:27] Loading translations definitions [20:44:27] Loading translation "en_US". [20:44:27] Translation 'qt_en_US' not found. [20:44:27] Translation 'en_US' not found. [20:44:27] Failed to load translation. [20:44:27] Initializing IP2C database. [20:44:27] Initializing passwords configuration file. [20:44:27] Initializing configuration for plugins. [20:44:27] Initializing IRC configuration file. [20:44:27] Setting IRC INI file: /home/wub/.doomseeker/doomseeker-irc.ini [20:44:27] Starting refreshing thread. [20:44:27] Preparing GUI. [20:44:27] Please wait. IP2C database is being read. This may take some time. [20:44:27] Parsing IP2C database: :/IpToCountry.dat [20:44:27] IP2C database read in 63 ms. Entries read: 119365 [20:44:27] Init finished. ================================ [20:44:27] IP2C parsing thread has finished. [20:44:27] IP2C parsing finished. Zandronum plugin is definitely loaded, reports servers on the list, but the GUI tells there are none even with cursor focus on the window. |
(0019353) WubTheCaptain (reporter) 2018-08-20 20:48 |
Quote Wrong paste, but definitely said to have found some 629 servers with the GUI empty. |
(0019609) WubTheCaptain (reporter) 2018-09-22 01:46 |
Removed $HOME/.doomseeker/doomseeker.ini on 1.2~beta (!) built with Qt4 and crashed on OpenBSD with this:[01:34:50] Parsing IP2C database: /home/doomseeker/.local/share/data/doomseeker/ IpToCountry.dat Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there. terminating with uncaught exception of type std::bad_alloc: std::bad_alloc Abort trap (core dumped) Backtracing the core dump with gdb isn't so helpful, because of abort trap. (gdb) bt #0 thrkill () at -:3 #1 0x000002c607f9655e in _libc_abort () at /usr/src/lib/libc/stdlib/abort.c:51 Die: DW_TAG_unspecified_type (abbrev = 4, offset = 251222) has children: FALSE attributes: DW_AT_name (DW_FORM_strp) string: "decltype(nullptr)" Dwarf Error: Cannot find type of die [in module /usr/lib/libc++abi.so.0.1] Something to note, $HOME/.config/doomseeker/doomseeker.ini exists. I've been switching between 1.1, 1.2, Qt4 and Qt5 versions. Something very special to note too, just before the crash every checkbox in Doomseeker settings for this 1.2~beta-1 build (latest) was unchecked through no action of mine. (But I think it may have been like that ever since Qt5 was found to be broken; 0003494.) Hopefully someone can reproduce soon, or at least finally find a cause. |
(0019611) WubTheCaptain (reporter) 2018-09-22 01:58 |
Quote from WubTheCaptain But it's odd, because I can't find any try{...}catch{...} in Doomseeker's source code (specifically Qt) with a grep search. |
(0019612) WubTheCaptain (reporter) 2018-09-22 02:09 |
Yep, okay, Doomseeker 1.1 also crashed on OpenBSD shortly after deleting ~/.config/doomseeker/* – but there was no doomseeker.ini, only doomseeker-irc.ini and the other .ini file. Same backtrace. But uh, 1.1 is not even supposed to use that directory. In fact, XDG basedir support is broken on OpenBSD. I wonder how sometimes my files got into $HOME/.config/doomseeker/, sometimes to legacy $HOME/.doomseeker/ path. [02:05:13] Setting IRC INI file: /home/doomseeker/.doomseeker/doomseeker-irc.ini [02:05:13] Starting refreshing thread. [02:05:13] Preparing GUI. [02:05:13] Please wait. IP2C database is being read. This may take some time. [02:05:13] Parsing IP2C database: /home/doomseeker/.doomseeker/IpToCountry.dat [02:05:13] Init finished. ================================ [02:05:13] Total refresh process initialized! [02:05:14] IP2C database read in 340 ms. Entries read: 175445 [02:05:14] IP2C parsing thread has finished. [02:05:14] IP2C parsing finished. LookupHostConsumerThread: 0x10c6777b8c40 terminating with uncaught exception of type std::bad_alloc: std::bad_alloc Abort trap (core dumped) |
(0019613) WubTheCaptain (reporter) 2018-09-22 02:13 |
Okay, and now it's reproducible on 1.1 all the time on my machine. |
(0019617) WubTheCaptain (reporter) 2018-09-22 02:33 edited on: 2018-09-22 02:55 |
I'd take a guess it's the IP2C autoupdater behind this. src/core/ip2c/ip2cupdater.cpp calls lots to abort(); and there's no line for IP2C remote/local comparison. When the config directory is removed, settings get reset on the next launch of Doomseeker; That is, IP2C autoupdate gets enabled again by default. Then, something with IP2C autoupdate fails on OpenBSD. Code calls abort, abort trap, do this few times until the settings file gets corrupt with no checkboxes enabled by default (disables IP2C updating), and the issue doesn't exist anymore. This is very reproducible with 1.1-0 (note: didn't try 1.1-p1) built with Qt4 on OpenBSD (using QEMU KVM virtual machine). That doesn't explain bad_alloc easily, though... |
(0019618) WubTheCaptain (reporter) 2018-09-22 02:42 edited on: 2018-09-22 02:43 |
Quote from WubTheCaptain Omg, it totally makes sense now. Yes! The most likely answer in retrospect is that in this scenario too, the config checkbox for "refresh servers on startup" (Configuration → Query) got unchecked due to config file corruption (probably an abnormal quit during a critical process), so that's why I saw no servers at all! And of course, re-creating .doomseeker directory reset that setting and things worked again for a while. This same symptom, no servers on startup, is part of what I experience on OpenBSD with reproducible results, for the same reasons. |
(0019619) WubTheCaptain (reporter) 2018-09-22 02:47 edited on: 2018-09-22 02:47 |
And fyi, a likely reason this has gone unseen for so long is that I typically disable IP2C autoupdate on my machine (Debian GNU/Linux) in Doomseeker settings. |
(0019620) WubTheCaptain (reporter) 2018-09-22 03:03 |
Oh, and std::bad_alloc in most cases with OpenBSD means memory exhaustion. If it was that (seems a bit unlikely), two plausible explanations:
Dunno? |
(0019955) Zalewa (developer) 2018-10-06 17:11 |
The std::bad_alloc may be caused by some "size()" function returning a negative value and then this negative value being passed to malloc() without checking. As malloc() takes the size as the unsigned size_t type, the negative value is interpreted as a really huge number and thus std::bad_alloc happens. Let's return to this when we go forth with 0003541 and see if it still happens. |
(0020264) WubTheCaptain (reporter) 2018-12-17 05:06 edited on: 2018-12-17 05:18 |
Quote from Zalewa 0003541 was closed as "denied". |
(0021088) WubTheCaptain (reporter) 2020-01-18 03:03 edited on: 2020-01-18 03:14 |
Enabling IP2C updates caused a segmentation fault (no abort trap) on my system again on Debian GNU/Linux, more details in a note at 0003728:0021087. Qt5 and Doomseeker 1.3. |
(0021089) Zalewa (developer) 2020-01-18 23:45 |
I'll fix this. |
(0021092) Zalewa (developer) 2020-01-19 11:35 |
I mitigated a potential race condition in the IP2C parser:'https://bitbucket.org/Doomseeker/doomseeker/commits/22abfcaa00800c2f90352d54434ae6a5d99f1b3e [^]' Please see if it helped. |
(0021095) WubTheCaptain (reporter) 2020-01-19 12:56 edited on: 2020-01-19 14:29 |
Quote from 1.3, no ~/.local/share/IpToCountry.dat[12:41:40] Preparing GUI. [12:41:40] Checking if IP2C database at '/usr/share/doomseeker/IpToCountry.dat' needs updating. [12:41:40] Please wait. IP2C database is being read. This may take some time. [12:41:40] Parsing IP2C database: /usr/share/doomseeker/IpToCountry.dat [12:41:40] Init finished. ================================ [12:41:40] IP2C database read in 99 ms. Entries read: 196041 [12:41:40] Total refresh initialized! [12:41:40] IP2C parsing thread has finished. [12:41:40] IP2C parsing finished. [12:41:41] Comparing IP2C hashes: local = aeca013c6eb838531099b9727f2187a0, remote = aeca013c6eb838531099b9727f2187a0 [12:41:41] IP2C update not needed. [12:41:44] Finished refreshing. Servers on the list: 512 (+2 custom, +0 LAN). Players: 51. ok Quote from 1.3, manually updated to acquire ~/.local/share/IpToCountry.dat[12:43:42] Preparing GUI. [12:43:42] Checking if IP2C database at '/home/wub/.local/share/doomseeker/IpToCountry.dat' needs updating. [12:43:42] Please wait. IP2C database is being read. This may take some time. [12:43:42] Parsing IP2C database: /home/wub/.local/share/doomseeker/IpToCountry.dat [12:43:42] Init finished. ================================ [12:43:42] IP2C database read in 100 ms. Entries read: 196041 [12:43:42] Total refresh initialized! [12:43:42] IP2C parsing thread has finished. [12:43:42] IP2C parsing finished. [12:43:42] Comparing IP2C hashes: local = aeca013c6eb838531099b9727f2187a0, remote = aeca013c6eb838531099b9727f2187a0 [12:43:42] IP2C update not needed. [12:43:45] Finished refreshing. Servers on the list: 513 (+2 custom, +0 LAN). Players: 53. ok Quote from 1.3 + patch, no ~/.local/share/IpToCountry.dat, with IP2C autoupdate[12:44:53] Preparing GUI. [12:44:53] Starting IP2C update. [12:44:53] Init finished. ================================ [12:44:53] Total refresh initialized! [12:44:55] IP2C database finished downloading. [12:44:55] Please wait. IP2C database is being read. This may take some time. [12:44:55] Parsing IP2C database: /home/wub/.local/share/doomseeker/IpToCountry.dat [12:44:55] IP2C database read in 220 ms. Entries read: 196041 [12:44:55] IP2C parsing thread has finished. [12:44:55] IP2C parsing finished. [12:44:57] Finished refreshing. Servers on the list: 665 (+2 custom, +0 LAN). Players: 341. Notice reading /usr/share/doomseeker/IpToCountry.dat was skipped, so IP2C autoupdate downloaded a database to /home/wub/.local/share/doomseeker/IpToCountry.dat. Quote from 1.3 + patch, no ~/.local/share/IpToCountry.dat, IP2C autoupdate disabled[13:34:27] Initializing IP2C database. [13:34:27] Initializing passwords configuration file. [13:34:27] Initializing configuration for plugins. [13:34:27] Initializing IRC configuration file. [13:34:27] Setting IRC INI file: /home/wub/.config/doomseeker/doomseeker-irc.ini [13:34:27] Starting refreshing thread. [13:34:27] Preparing GUI. [13:34:27] Did not find any IP2C database. IP2C functionality will be disabled. [13:34:27] You may install an IP2C database from the "File" menu. [13:34:27] Init finished. ================================ [13:34:27] Total refresh initialized! [13:34:31] Finished refreshing. Servers on the list: 652 (+2 custom, +0 LAN). Players: 249 Ditto, /usr/share/doomseeker/IpToCountry.dat was skipped. Server country flags won't be displayed unless the user makes a updates IP2C manually or enables IP2C autoupdates. Quote from 1.3 + patch, ~/.local/share/IpToCountry.dat exists[12:46:57] Preparing GUI. [12:46:57] Checking if IP2C database at '/home/wub/.local/share/doomseeker/IpToCountry.dat' needs updating. [12:46:57] Please wait. IP2C database is being read. This may take some time. [12:46:57] Parsing IP2C database: /home/wub/.local/share/doomseeker/IpToCountry.dat [12:46:57] Init finished. ================================ [12:46:57] Total refresh initialized! [12:46:58] IP2C database read in 228 ms. Entries read: 196041 [12:46:58] IP2C parsing thread has finished. [12:46:58] IP2C parsing finished. [12:46:58] Comparing IP2C hashes: local = aeca013c6eb838531099b9727f2187a0, remote = aeca013c6eb838531099b9727f2187a0 [12:46:58] IP2C update not needed. [12:47:01] Finished refreshing. Servers on the list: 666 (+2 custom, +0 LAN). Players: 339. Works equally like 1.3. |
(0021096) WubTheCaptain (reporter) 2020-01-19 12:58 |
|
(0021097) Zalewa (developer) 2020-01-19 13:28 |
Your observation is unrelated to the patch. In the official release "/usr" is the CMAKE_INSTALL_PREFIX path which is #defined as INSTALL_PREFIX which is prepended to "/share/doomseeker/" (in main.cpp initDataDirectories()) which is added to the paths where IpToCountry.dat is looked for (in doomseekerfilepaths.cpp ip2cDatabaseAny()). When you compile Doomseeker on your own, you probably have a different CMAKE_INSTALL_PREFIX. |
(0021099) WubTheCaptain (reporter) 2020-01-19 13:41 |
I see, that makes sense Zalewa. |
(0021101) WubTheCaptain (reporter) 2020-01-19 14:25 edited on: 2020-01-19 14:45 |
I found a (mostly reliable) way to reproduce the racing condition (as Zalewa found out) in 1.3 on my system, which often didn't trigger with the typical Doomseeker configuration I use.
As Doomseeker is started with this state (with Internet connectivity), two threads run simultaneously: IP2C thread and refresher thread. An auto update will occur: IP2C database will be overwritten while the refresher thread is still busy reading from the database (hopefully), which may result in the refresher thread reading empty or garbage data and segfaulting. The race condition didn't trigger with my usual configuration, when I querying only Zandronum's master server: It had enough time to read the old IP2C database & refresh every server before the IP2C was updated. "Slowing down" the refresher thread by giving it more work to do triggered the race condition. As new Doomseeker releases were shipped, the Debian packages shipped with an up-to-date /usr/share/doomseeker/IpToCountry.dat; thus, this problem would "go away" for a while unnoticed until a different remote IP2C database was made available again. The attached patch fixes the issue indeed, I no longer crashed. |
This issue is already marked as resolved. If you feel that is not the case, please reopen it and explain why. |
|
Supporters: | No one explicitly supports this issue yet. |
Opponents: | No one explicitly opposes this issue yet. |
Issue History | |||
Date Modified | Username | Field | Change |
2018-03-03 19:47 | WubTheCaptain | New Issue | |
2018-03-03 19:47 | WubTheCaptain | Steps to Reproduce Updated | View Revisions |
2018-03-03 19:49 | WubTheCaptain | Steps to Reproduce Updated | View Revisions |
2018-03-03 19:50 | WubTheCaptain | Additional Information Updated | View Revisions |
2018-03-03 19:54 | WubTheCaptain | Description Updated | View Revisions |
2018-03-03 19:54 | WubTheCaptain | Steps to Reproduce Updated | View Revisions |
2018-08-20 20:43 | WubTheCaptain | Note Added: 0019351 | |
2018-08-20 20:45 | WubTheCaptain | Note Added: 0019352 | |
2018-08-20 20:48 | WubTheCaptain | Note Added: 0019353 | |
2018-09-22 01:46 | WubTheCaptain | Note Added: 0019609 | |
2018-09-22 01:48 | WubTheCaptain | File Added: 2018-09-22-crash.log | |
2018-09-22 01:58 | WubTheCaptain | Note Added: 0019611 | |
2018-09-22 02:09 | WubTheCaptain | Note Added: 0019612 | |
2018-09-22 02:12 | WubTheCaptain | File Added: 2018-09-22-02-05-14-crash.log | |
2018-09-22 02:13 | WubTheCaptain | Note Added: 0019613 | |
2018-09-22 02:19 | WubTheCaptain | Note Added: 0019614 | |
2018-09-22 02:20 | WubTheCaptain | Note Added: 0019615 | |
2018-09-22 02:23 | WubTheCaptain | Note Added: 0019616 | |
2018-09-22 02:24 | WubTheCaptain | Note Deleted: 0019614 | |
2018-09-22 02:24 | WubTheCaptain | Note Deleted: 0019615 | |
2018-09-22 02:25 | WubTheCaptain | Note Deleted: 0019616 | |
2018-09-22 02:33 | WubTheCaptain | Note Added: 0019617 | |
2018-09-22 02:33 | WubTheCaptain | Status | new => acknowledged |
2018-09-22 02:33 | WubTheCaptain | Note Edited: 0019617 | View Revisions |
2018-09-22 02:36 | WubTheCaptain | Note Edited: 0019617 | View Revisions |
2018-09-22 02:36 | WubTheCaptain | Note Edited: 0019617 | View Revisions |
2018-09-22 02:37 | WubTheCaptain | Priority | low => normal |
2018-09-22 02:42 | WubTheCaptain | Note Added: 0019618 | |
2018-09-22 02:43 | WubTheCaptain | Note Edited: 0019618 | View Revisions |
2018-09-22 02:47 | WubTheCaptain | Note Added: 0019619 | |
2018-09-22 02:47 | WubTheCaptain | Note Edited: 0019619 | View Revisions |
2018-09-22 02:47 | WubTheCaptain | Note Edited: 0019619 | View Revisions |
2018-09-22 02:55 | WubTheCaptain | Note Edited: 0019617 | View Revisions |
2018-09-22 03:03 | WubTheCaptain | Note Added: 0019620 | |
2018-10-05 08:43 | WubTheCaptain | Priority | normal => low |
2018-10-06 17:11 | Zalewa | Note Added: 0019955 | |
2018-12-17 05:06 | WubTheCaptain | Note Added: 0020264 | |
2018-12-17 05:06 | WubTheCaptain | Assigned To | => Zalewa |
2018-12-17 05:18 | WubTheCaptain | Note Edited: 0020264 | View Revisions |
2020-01-18 03:03 | WubTheCaptain | Note Added: 0021088 | |
2020-01-18 03:03 | WubTheCaptain | Note Edited: 0021088 | View Revisions |
2020-01-18 03:14 | WubTheCaptain | Note Edited: 0021088 | View Revisions |
2020-01-18 23:45 | Zalewa | Note Added: 0021089 | |
2020-01-18 23:45 | Zalewa | Status | acknowledged => assigned |
2020-01-19 11:35 | Zalewa | Note Added: 0021092 | |
2020-01-19 11:35 | Zalewa | Status | assigned => needs testing |
2020-01-19 12:56 | WubTheCaptain | Note Added: 0021095 | |
2020-01-19 12:56 | WubTheCaptain | Status | needs testing => needs review |
2020-01-19 12:56 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 12:57 | WubTheCaptain | File Added: 2020-01-19-125651_maim.png | |
2020-01-19 12:57 | WubTheCaptain | File Added: 2020-01-19-125725_maim.png | |
2020-01-19 12:58 | WubTheCaptain | Note Added: 0021096 | |
2020-01-19 13:08 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 13:28 | Zalewa | Note Added: 0021097 | |
2020-01-19 13:38 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 13:38 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 13:41 | WubTheCaptain | Note Added: 0021099 | |
2020-01-19 13:41 | WubTheCaptain | Status | needs review => needs testing |
2020-01-19 14:25 | WubTheCaptain | Note Added: 0021101 | |
2020-01-19 14:25 | WubTheCaptain | Status | needs testing => resolved |
2020-01-19 14:25 | WubTheCaptain | Fixed in Version | => 1.3.3 |
2020-01-19 14:25 | WubTheCaptain | Resolution | open => fixed |
2020-01-19 14:27 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 14:28 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 14:28 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 14:29 | WubTheCaptain | Note Edited: 0021095 | View Revisions |
2020-01-19 14:33 | WubTheCaptain | Target Version | => 1.3.3 |
2020-01-19 14:36 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 14:37 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 14:39 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 14:44 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 14:44 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 14:45 | WubTheCaptain | Note Edited: 0021101 | View Revisions |
2020-01-19 16:22 | WubTheCaptain | Relationship added | related to 0003733 |
2020-01-27 20:34 | WubTheCaptain | Fixed in Version | 1.3.3 => 1.3.1 |
2020-01-27 20:34 | WubTheCaptain | Target Version | 1.3.3 => 1.3.1 |
2020-01-30 12:58 | WubTheCaptain | Status | resolved => closed |
Copyright © 2000 - 2024 MantisBT Team |