View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0005281 | unreal | ircd | public | 2019-05-17 15:09 | 2019-11-27 16:48 |
| Reporter | syzop | Assigned To | syzop | ||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | resolved | Resolution | fixed | ||
| Fixed in Version | 5.0.0-rc2 | ||||
| Summary | 0005281: Configuration file ideas: define and conditional sections | ||||
| Description | 1. define variables 2. condition sections with "if" 2a. based on defines 2b. based on if a module is loaded | ||||
| Tags | No tags attached. | ||||
| 3rd party modules | |||||
|
|
Current idea after discussion is to support these things:$define IPADDR xyz
listen { ip $IPADDR; .... }$define SERVER "hub.example.org"
$if $SERVER == "hub.example.org"
link {
...
}
$endif$if module-loaded("something")
block {
}
block {
}
$endif
helpop {
xyz
xyz
$if module-loaded("something")
zzz
zzz
$endif
xyz
xyz
} |
|
|
I will probably do it as follows: 1. Load the includes 2. Resolve define's globally (result: it won't matter where the $define is, as this will be done in configuration file pass 1) 3. The $if's based on defines can then be resolved (sections enabled or disabled) 4. Load the modules 5. The $if's based on module-loaded() can then be resolved (sections enabled or disabled) Limitations: 1. You cannot have an include within an $if, but you can do it in the include itself. So NOT: $if module-loaded("something")
include "something.conf"
$endifBut YES by doing it in the included file itself: $if module-loaded("something")
....
$endif2. You cannot $define within an $if I think even with these limitations it will be quite nice :) |
|
|
Operations supported in $if: $XYZ == "something" $XYZ != "something" module-loaded("something") !module-loaded("something") defined($XYZ) !defined($XYZ) No || or && |
|
|
Just committed some stuff. Most things done. Still need to do variable name/value replacement (so you can use $IPADDR if you used $define IPADDR... before...). And also cleanups and fixing some small issues (memory leak). NOTE TO SELF: I think I forgot phase 1 so far, it has only phase 2 atm. Also document limitations |
|
|
Limitations: - you cannot use an include within an $if module-loaded()... [because of of the config sequence, pretty much impossible to solve] [too bad] - you cannot use a loadmodule within an $if module-loaded()... [because of of the config sequence, pretty much impossible to solve] [not a problem I think] - you cannot use $define within an $if.... [because I add defines straight away, this could be changed.... some day..] |
|
|
I've put 90% of the stuff in src/conf_preprocessor.c to make it look a bit more clean. Actually source should still receive some cleanup ;) Still to do: 1. Warn on limitations (see previous) 2. Replacement of defines in variable name/values in the conf, so you can use "ip $IPADDR;" |
|
|
TODO: fix some memory leak(s) Maybe support $else? Or not.. because that could imply $elseif or $else..$if.. which we are unlikely to support soon ;) |
|
|
So I guess the current implementation is doing well. TODO: * It has 1 or 2 TODO/FIXME's that I still need to investigate * Should warn on limitation (see few bugnotes up). It's not bad that there are a few limitations but we should really warn about them if possible. * What, comments from above claim replacement of variables is still a TODO item? To my knowledge it is working already. Did not test within "" strings and such though. |
|
|
This does not appear to be working. Reported by Gottem and westor... so... I should definitely look into that. |
|
|
Was fixed in alpha3. Only reason this issue is still open is due to some warnings that should be fired in some corner cases. |
|
|
Welllll my IRCd crashes hard when I use some conditionals. :D My unrealircd.conf consists of just 2 remote includes, one for global network stuff and another for per-server things. The latter defines a variable $SERVER, then in the network one there is: @if $SERVER != "hubberino.u5.home.lan"
loadmodule "hideserver";
hideserver {
disable-map yes;
disable-links yes;
map-deny-message "*** Command /MAP is disabled for security reasons";
links-deny-message "*** Command /LINKS is disabled for security reasons";
};
@endif
@if $SERVER == "hubberino.u5.home.lan"
require module {
name "rmtkl";
};
deny module {
name "hideserver";
reason "top keks";
};
@endifThe server conf is included *before* the network one, so the variable should be defined before the if stuff. Switching the .conf lines around doesn't matter anyways. :D Neither does removing *either* of the @if blocks by the way. Removing both makes the IRCd boot up nicely. Have a nice lil' dump from ASAN: Loading IRCd configuration..
=================================================================
==5420==ERROR: AddressSanitizer: heap-use-after-free on address 0x60700000cf48 at pc 0x5555555d45b1 bp 0x7fffffffe070 sp 0x7fffffffe068
READ of size 8 at 0x60700000cf48 thread T0
#0 0x5555555d45b0 in preprocessor_resolve_conditionals_ce /home/gottemhams/_unrealircd/src/conf_preprocessor.c:401
#1 0x55555560c7f2 in load_conf /home/gottemhams/_unrealircd/src/conf.c:2069
#2 0x55555560bcff in remote_include /home/gottemhams/_unrealircd/src/conf.c:10198
#3 0x55555560c28e in _conf_include /home/gottemhams/_unrealircd/src/conf.c:3136
#4 0x55555560c92b in load_conf /home/gottemhams/_unrealircd/src/conf.c:2087
#5 0x55555560d495 in init_conf /home/gottemhams/_unrealircd/src/conf.c:1879
#6 0x5555555c0e2e in main /home/gottemhams/_unrealircd/src/ircd.c:1256
#7 0x7ffff53dfb44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b44)
0000008 0x5555555a14d8 (/home/gottemhams/ircd/bin/unrealircd+0x4d4d8)
0x60700000cf48 is located 56 bytes inside of 72-byte region [0x60700000cf10,0x60700000cf58)
freed by thread T0 here:
#0 0x7ffff6f59527 in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x54527)
#1 0x5555555db7e6 in config_entry_free /home/gottemhams/_unrealircd/src/conf.c:1211
#2 0x5555555d467a in preprocessor_resolve_conditionals_ce /home/gottemhams/_unrealircd/src/conf_preprocessor.c:414
#3 0x55555560c7f2 in load_conf /home/gottemhams/_unrealircd/src/conf.c:2069
#4 0x55555560bcff in remote_include /home/gottemhams/_unrealircd/src/conf.c:10198
#5 0x55555560c28e in _conf_include /home/gottemhams/_unrealircd/src/conf.c:3136
#6 0x55555560c92b in load_conf /home/gottemhams/_unrealircd/src/conf.c:2087
#7 0x55555560d495 in init_conf /home/gottemhams/_unrealircd/src/conf.c:1879
0000008 0x5555555c0e2e in main /home/gottemhams/_unrealircd/src/ircd.c:1256
#9 0x7ffff53dfb44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b44)
previously allocated by thread T0 here:
#0 0x7ffff6f59885 in calloc (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x54885)
#1 0x555555631146 in safe_alloc /home/gottemhams/_unrealircd/src/support.c:716
#2 0x5555555ddcda in config_parse /home/gottemhams/_unrealircd/src/conf.c:1153
#3 0x5555555de3d7 in config_load /home/gottemhams/_unrealircd/src/conf.c:805
#4 0x55555560c756 in load_conf /home/gottemhams/_unrealircd/src/conf.c:2060
#5 0x55555560bcff in remote_include /home/gottemhams/_unrealircd/src/conf.c:10198
#6 0x55555560c28e in _conf_include /home/gottemhams/_unrealircd/src/conf.c:3136
#7 0x55555560c92b in load_conf /home/gottemhams/_unrealircd/src/conf.c:2087
0000008 0x55555560d495 in init_conf /home/gottemhams/_unrealircd/src/conf.c:1879
#9 0x5555555c0e2e in main /home/gottemhams/_unrealircd/src/ircd.c:1256
#10 0x7ffff53dfb44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b44)
SUMMARY: AddressSanitizer: heap-use-after-free /home/gottemhams/_unrealircd/src/conf_preprocessor.c:401 preprocessor_resolve_conditionals_ce
Shadow bytes around the buggy address:
0x0c0e7fff9990: fd fd fd fd fd fd fd fa fa fa fa fa fd fd fd fd
0x0c0e7fff99a0: fd fd fd fd fd fa fa fa fa fa fd fd fd fd fd fd
0x0c0e7fff99b0: fd fd fd fa fa fa fa fa fd fd fd fd fd fd fd fd
0x0c0e7fff99c0: fd fa fa fa fa fa fd fd fd fd fd fd fd fd fd fa
0x0c0e7fff99d0: fa fa fa fa fd fd fd fd fd fd fd fd fd fa fa fa
=>0x0c0e7fff99e0: fa fa fd fd fd fd fd fd fd[fd]fd fa fa fa fa fa
0x0c0e7fff99f0: fd fd fd fd fd fd fd fd fd fa fa fa fa fa fd fd
0x0c0e7fff9a00: fd fd fd fd fd fd fd fa fa fa fa fa 00 00 00 00
0x0c0e7fff9a10: 00 00 00 00 00 fa fa fa fa fa 00 00 00 00 00 00
0x0c0e7fff9a20: 00 00 00 fa fa fa fa fa 00 00 00 00 00 00 00 00
0x0c0e7fff9a30: 00 fa fa fa fa fa 00 00 00 00 00 00 00 00 00 fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Heap right redzone: fb
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack partial redzone: f4
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Contiguous container OOB:fc
ASan internal: fe |
|
|
Thanks, I'll check it out this evening or tomorrow. |
|
|
I can reproduce the issue. Defined in included conf and used in another causes a crash. The other way around (defined in unrealircd.conf and used in eg network.conf) does not.. that's why I missed it I guess. I will take a look... |
|
|
Bug from above fixed. The code to remove an @if block that didn't match didn't work properly. Also, I tested @define in one included conf, and using it in another included conf. This works if they are in order but not in reverse order. That is as intended, though. |
|
|
And warning on limitations. Only thing I couldn't raise a warning on is a @define within an @if. This is because it happens so super early in the parser process that it doesn't even know it is inside a @define. Hopefully that won't catch too many users... hmm.. ;) Anyway, done for now! |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2019-05-17 15:09 | syzop | New Issue | |
| 2019-05-17 15:10 | syzop | Note Added: 0020676 | |
| 2019-05-17 15:15 | syzop | Note Added: 0020677 | |
| 2019-05-17 15:15 | syzop | Note Edited: 0020677 | |
| 2019-05-17 15:21 | syzop | Note Added: 0020678 | |
| 2019-05-17 20:52 | syzop | Note Added: 0020679 | |
| 2019-05-17 20:52 | syzop | Assigned To | => syzop |
| 2019-05-17 20:52 | syzop | Status | new => assigned |
| 2019-05-18 13:35 | syzop | Note Added: 0020680 | |
| 2019-05-18 14:05 | syzop | Relationship added | child of 0005279 |
| 2019-05-18 14:15 | syzop | Note Added: 0020682 | |
| 2019-05-25 15:52 | syzop | Note Added: 0020696 | |
| 2019-08-18 15:17 | syzop | View Status | private => public |
| 2019-08-18 16:10 | syzop | Note Added: 0020833 | |
| 2019-08-18 16:13 | syzop | Note Edited: 0020833 | |
| 2019-08-18 16:13 | syzop | Note Edited: 0020833 | |
| 2019-09-17 18:27 | syzop | Note Added: 0020897 | |
| 2019-10-06 07:42 | syzop | Note Added: 0020936 | |
| 2019-10-09 21:19 | Gottem | Note Added: 0020949 | |
| 2019-10-10 07:40 | syzop | Note Added: 0020950 | |
| 2019-10-14 14:55 | syzop | Relationship added | related to 0004144 |
| 2019-11-27 13:34 | syzop | Note Added: 0021129 | |
| 2019-11-27 15:49 | syzop | Note Added: 0021130 | |
| 2019-11-27 16:48 | syzop | Status | assigned => resolved |
| 2019-11-27 16:48 | syzop | Resolution | open => fixed |
| 2019-11-27 16:48 | syzop | Fixed in Version | => 5.0.0-rc2 |
| 2019-11-27 16:48 | syzop | Note Added: 0021131 |