Time |
Nick |
Message |
00:02 |
|
Alias joined #minetest-dev |
00:16 |
|
calcul0n_ joined #minetest-dev |
00:38 |
rubenwardy |
> this issue should be assumed to be a remotely-exploitable security vulnerability on the server |
00:38 |
rubenwardy |
if this is actually true, then you should probably be disclosing using the security policy |
01:02 |
erlehmann |
rubenwardy well for the previous UB i was asked to file issues after posting traces here. |
01:03 |
erlehmann |
rubenwardy but i can mail you and celeron55 future issues of that category |
01:04 |
erlehmann |
i.e. “assume its exploitable until you know it is not” |
01:04 |
erlehmann |
we discussed the noise thing already though |
01:05 |
erlehmann |
i think *all* UB is a security issue, yes, even fast inverse square root |
01:06 |
erlehmann |
rubenwardy, don't worry, when i have actual exploits i will not post them on the bug tracker |
01:06 |
erlehmann |
so far the best i can do is crash servers, but a bunch of people can do that |
01:07 |
erlehmann |
in fact, it was weaponized already in the past (“if you attack my base, i crash the server” hehe) |
01:07 |
MTDiscord |
<josiah_wi> erlehemann, I don't want to get in your way or take up your time, but if there's anything I can do to help with this work I'm up for it. I'm interested in security, and I am looking for ways to get involved with Minetest development. |
01:08 |
erlehmann |
josiah_wi, read up about ubsan, asan, tsan. figure out the ways how UB is done. for the noise thing i think pgimeno had a patch posted here? |
01:09 |
erlehmann |
josiah_wi, start here https://blog.regehr.org/archives/213 and here https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html |
01:09 |
MTDiscord |
<josiah_wi> Will do. Thanks for giving me a good direction to start in. |
01:10 |
erlehmann |
josiah_wi most of these are probably easily fixable |
01:11 |
erlehmann |
josiah_wi i think the best thing you could do if you want to invest some work would be to make --random-input predictable based on seed and then compile minetest with some sanitizers like ubsan turned on a CI and let it play randomly for 5 minutes. |
01:11 |
erlehmann |
it will prob find a bunch of bugs |
01:13 |
erlehmann |
josiah_wi i retract my assertion. the best thing you could do is fixing the bugs belonging to the stack traces i posted ;) |
01:14 |
erlehmann |
i haven't posted the heavy ones so far |
01:14 |
erlehmann |
bc i have not understood |
01:14 |
erlehmann |
by heavy i mean big oof |
01:16 |
MTDiscord |
<josiah_wi> Ok. I'll probably need to keep a document with all the stack traces you have finished the sluething on so I can keep track of them. I'll do the assigned reading first though, so I'm familiar with what's going on. |
01:16 |
erlehmann |
well i make issues for them |
01:18 |
erlehmann |
josiah_wi do not worry about getting in my way or taking my time. i want to do as little as possible. am very lazy. |
01:18 |
erlehmann |
also low energy |
01:18 |
erlehmann |
so if you do stuff it is good! |
01:18 |
erlehmann |
:) |
01:19 |
erlehmann |
also note that -DCMAKE_CXX_FLAGS= for cmake sets compiler flags, i learned that from sfan5 |
01:24 |
MTDiscord |
<josiah_wi> Good reminder. I'm reading the undefined behavior guide, and I just wanted to share this: "Similarly, there have been C compilers that optionally give undefined semantics to unsigned overflow to speed up other loops." Not the first time compilers have blown my mind, but it's always just as awe inspiring every time. |
01:29 |
erlehmann |
josiah_wi you can use https://godbolt.org/ to see what compilers can do |
01:32 |
erlehmann |
josiah_wi check out this example: https://godbolt.org/z/P3EY4TrWP |
01:36 |
v-rob |
Honestly, I doubt it would be a security vulnerability in practical cases. All common modern processors use two's complement, and even the C++17 standard guarantees two's complement on signed overflow instead of UB. We're on C++11, of course, but I doubt most compilers will do really weird things on signed overflow. Fixing it would probably be good, but not critical. |
01:41 |
erlehmann |
v-rob it is a case of “better safe than sorry” |
01:41 |
erlehmann |
i did not know the C++17 thing it sounds neat |
01:42 |
erlehmann |
don't worry, if i have an actual exploit, i will call it “client sent server mods version 2” or so |
01:42 |
erlehmann |
not something boring |
01:44 |
erlehmann |
v-rob quoting https://blog.regehr.org/archives/213 |
01:44 |
erlehmann |
> It is very common for people to say — or at least think — something like this: |
01:44 |
erlehmann |
>> The x86 ADD instruction is used to implement C’s signed add operation, and it has two’s complement behavior when the result overflows. I’m developing for an x86 platform, so I should be able to expect two’s complement semantics when 32-bit signed integers overflow. |
01:44 |
erlehmann |
> THIS IS WRONG. You are saying something like this: |
01:44 |
erlehmann |
>> Somebody once told me that in basketball you can’t hold the ball and run. I got a basketball and tried it and it worked just fine. He obviously didn’t understand basketball. |
01:45 |
erlehmann |
v-rob obviously nothing bad happens if you hold the ball and run over the field, but you definitely aren't playing basketball at that point. |
01:45 |
erlehmann |
damn |
01:46 |
MTDiscord |
<Jordach> Are we really getting pedantic about a fucking game engine that holds no data of important |
01:46 |
erlehmann |
Jordach “the compiler does not need to emit code to format your disk. Rather, following the OOB array access your computer will begin executing exploit code, and that code is what will format your disk.” |
01:47 |
erlehmann |
so, yes |
01:49 |
erlehmann |
also there is the philosophical issue of programs with unconditional UB having no meaning |
01:51 |
MTDiscord |
<josiah_wi> Jordach, do I hear you volunteering to be the test subject for any exploits discovered? Especially remote code execution. |
01:52 |
erlehmann |
to be fair, most of the stuff found will probably not result in remote code execution |
01:52 |
erlehmann |
sadly |
01:52 |
erlehmann |
but i bet there are some hidden gems in minetest |
01:54 |
MTDiscord |
<josiah_wi> Wow. That example of a switch with UB is impressive. For the record, I learned to never, ever write a switch statement without including a default case... |
01:56 |
erlehmann |
well the thing is that this function shows why UB is useful |
01:56 |
erlehmann |
you can make your function much faster if you assume that the function will only be called in a correct way |
01:56 |
erlehmann |
but then it breaks horribly if it is not called that way |
01:58 |
MTDiscord |
<Warr1024> Heh, I just tried that switch statement, and if you delete the first or last case, it produced exactly the same code :-D |
01:58 |
MTDiscord |
<josiah_wi> Indeed. But like you pointed out you're making that assumption. And actually, you could just make that behavior explicit and write a comment explaining why you sacrificed the sanity of your codebase for that extra nanosecond of speed. |
01:59 |
MTDiscord |
<josiah_wi> Warr, if you add a default case does it add an extra check, or do all the checks? I can't edit it on mobile for some reason. |
02:01 |
MTDiscord |
<Warr1024> Hmm, that's surprisingly complicated. It still unconditionally does the "sub" that corresponds to the optimized implementation, but it also now adds a compare to decide whether to use the default case afterwards. |
02:02 |
MTDiscord |
<josiah_wi> Ah, that's what I'd hoped it would do. Interesting. |
02:03 |
erlehmann |
and because it is “surprisingly complicated” to figure out what it does, one needs to be careful |
02:03 |
erlehmann |
else you get unwelcome surprises |
02:03 |
erlehmann |
also try switching between optimization levels and compilers |
02:04 |
MTDiscord |
<josiah_wi> If I remember right from the reading erlehmann gave me, modifying a volatile isn't considered a side effect in some compilers? |
02:04 |
MTDiscord |
<Warr1024> yeah, this just looks wrong |
02:05 |
MTDiscord |
<Warr1024> because it's being passed an int, but it produces the same behavior as if it were passed an unsigned int |
02:05 |
MTDiscord |
<Warr1024> and I have cases for 0, 1, 2, and the default, but it looks like it's not accounting for the possibility that the input could be negative...? |
02:05 |
MTDiscord |
<Warr1024> I don't remember the nuances of C that much tho |
02:06 |
MTDiscord |
<Warr1024> heh, I added a case for -5 and it generated a LUT instead. |
02:07 |
MTDiscord |
<Warr1024> Now we've suddenly gone from integer overflow risk to out-of-bounds memory access risk |
02:07 |
|
v-rob joined #minetest-dev |
02:08 |
MTDiscord |
<josiah_wi> Wait seriously? Despite the default case? |
02:08 |
erlehmann |
v-rob please look at the logs |
02:08 |
erlehmann |
v-rob i answered you |
02:09 |
MTDiscord |
<Warr1024> https://godbolt.org/z/senbP5v64 |
02:11 |
v-rob |
Yeah, I agree it's better to be safe than sorry, and we certainly should fix it, just saying that it's probably not a security issue in practicality. |
02:13 |
erlehmann |
how can you be so sure? |
02:17 |
v-rob |
Because all the platforms anybody in their right mind will try to compile Minetest on don't have an issue with it, x86, ARM, etc. I can't be _certain_ (I mean, a compiler might have a bug which causes a vulnerability in the final executable -- we can never be _sure_), but I can be pretty darn close to it. |
02:17 |
v-rob |
And that "pretty darn sure" means that fixing it is not necessarily critical. |
02:18 |
v-rob |
That's why I said "in practicality". In theory, anything might happen, but practically, it won't. |
02:22 |
|
Extex joined #minetest-dev |
02:30 |
MTDiscord |
<josiah_wi> @Warr1024 there's some serious haxxory going on with that assembly. Did you test whether you can observe UB? It's doing a 32-bit subtraction followed by a special conditional move. I can't tell whether it detects negative values or not. |
02:31 |
MTDiscord |
<Warr1024> No, I didn't test it, can barely read it and not sure if my interpretation is correct. I haven't looked at x86 assembly since the 486 days. |
02:37 |
erlehmann |
v-rob, what is the output of the following program according to your interpretation? |
02:37 |
erlehmann |
#include <climits> |
02:37 |
erlehmann |
#include <cstdio> |
02:37 |
erlehmann |
int main(int argc, char** argv) { int i = 1; if (i + INT_MAX < i) { printf("%i\n" ,i + INT_MAX);} } |
02:41 |
erlehmann |
(this is, of course, a trick question) |
02:43 |
erlehmann |
i mean, -2147483648 is pretty much lower than 1 right? |
02:44 |
erlehmann |
the fun thing is, it even gives different results depending on if i compile it with ubsan or not |
02:47 |
v-rob |
With my compiler, the printf will not be reached, which is, of course, valid. However, it creates no security hazard. That's my point: UB like signed integer overflow can lead to bugs, but signed integer overflow will not create a security hazard in any practical situation Minetest will every be in. |
02:48 |
erlehmann |
well if the statement is not reached, there surely is no 2s complement |
02:49 |
erlehmann |
and i already said that i doubt many of those will be exploitable, but in general, who knows |
02:58 |
MTDiscord |
<Jordach> for every hack made for speed |
02:58 |
MTDiscord |
<Jordach> a problem is introduced |
03:15 |
|
tekakutli joined #minetest-dev |
03:58 |
|
Extex joined #minetest-dev |
04:00 |
|
MTDiscord joined #minetest-dev |
04:12 |
|
v-rob joined #minetest-dev |
04:28 |
|
erlehmann joined #minetest-dev |
05:17 |
|
longerstaff13 joined #minetest-dev |
06:19 |
|
v-rob joined #minetest-dev |
06:58 |
|
queria joined #minetest-dev |
07:14 |
|
specing_ joined #minetest-dev |
07:16 |
|
v-rob joined #minetest-dev |
07:22 |
|
sfan5 joined #minetest-dev |
08:06 |
|
hendursa1 joined #minetest-dev |
09:14 |
|
olliy joined #minetest-dev |
09:31 |
|
Kimapr[i] joined #minetest-dev |
09:55 |
erlehmann |
josiah_wi maybe try to reproduce this and see if you get similar results https://github.com/minetest/minetest/issues/11624 |
10:00 |
|
Kimapr[i] joined #minetest-dev |
10:20 |
|
calcul0n_ joined #minetest-dev |
10:59 |
|
adfeno joined #minetest-dev |
11:42 |
|
tekakutli joined #minetest-dev |
12:07 |
pgimeno |
erlehmann: what noise patch? |
12:08 |
|
calcul0n__ joined #minetest-dev |
12:08 |
erlehmann |
for the mapgen thing |
12:08 |
pgimeno |
not sure what you mean |
12:08 |
pgimeno |
oh the seed |
12:08 |
erlehmann |
pgimeno, maybe i confused you sorry |
12:08 |
erlehmann |
yeah |
12:09 |
erlehmann |
you fixed that? |
12:09 |
pgimeno |
yeah, it is a 1 character fix, just add a 'U' to the last constant in the line that triggers the UB |
12:10 |
pgimeno |
sfan is aware I believe |
12:11 |
pgimeno |
anyway, since it seems we expect wrapping behaviour, why don't we just add -fwrapv to the command line and get done with all these "bugs"? |
12:13 |
pgimeno |
erlehmann: with -fwrapv in your example, I get -2147483648 printed |
12:14 |
erlehmann |
pgimeno that is because then you are no longer playing basketball |
12:14 |
pgimeno |
erlehmann: I know, we're playing GNU basketball |
12:14 |
pgimeno |
that's not necessarily a bad thing, the NBA has its own rules for example |
12:14 |
erlehmann |
the problem with -fwrapv is that it hides the fact that it was probably not intended to happen |
12:15 |
erlehmann |
you want discontinuities in the noise? i have giant stone cubes in the sky for you. |
12:15 |
pgimeno |
not intended for signed and intended for unsigned? hmm, I don't follow that logic |
12:15 |
erlehmann |
signed overflow is very rarely intended actually. if so, projects use -fwrapv from the start. |
12:17 |
pgimeno |
this is a collaborative project, the collaborators don't mandate command line arguments and often are not aware about it being UB |
12:17 |
erlehmann |
i.e. in minetest, i doubt it is intended at all |
12:17 |
pgimeno |
for the seed it may well be intended |
12:17 |
pgimeno |
it's just a hash |
12:17 |
erlehmann |
but that's the point, if you are not aware of it then the programs wrapping behaviour is something you probably do not intend. |
12:17 |
pgimeno |
but the same can be said about unsigned overflow, or not? |
12:18 |
erlehmann |
less likely, but true. i have not investigated it yet. |
12:18 |
erlehmann |
in general, saying “just do whatever” will hide logic bugs. |
12:19 |
erlehmann |
i mean, consider a length field overflowing somehow. you probably want a stacktrace then, not wrapping behaviour. |
12:21 |
erlehmann |
pgimeno, for the seed the ideal thing would be something that is as close to what the previous thing was compiled to on x86 / x64 / arm |
12:21 |
erlehmann |
i mean you tried to approximate that, right? |
12:22 |
pgimeno |
yeah, and the 'U' solution is equivalent |
12:23 |
pgimeno |
I tried with a loop over all values of the seed, the result was the same in all cases |
12:25 |
sfan5 |
if you build something as close to the previous code isn't that an admission that the wrapping sign behaviour was intended? |
12:28 |
erlehmann |
sfan5 no, in this case it is a compatibility aid, because it is a seed. but in alle cases through out the entire code base? i strongly doubt that every signed integer overflow was intended, specifically because some commit messages show that this code has already been refactored to *avoid* UB. |
12:28 |
erlehmann |
rated E for effort |
12:33 |
erlehmann |
sfan5, are the data races between threads that occur in minetest also intended? bc surely the best way to fix those races is to work out which thread wins most of the time and take that as established behaviour. |
12:34 |
MTDiscord |
<josiah_wi> erlehmann, rebuilding with different sanitize flags may take some time. Do you want me to start with the memory issue you linked? |
12:34 |
erlehmann |
(if compatibility is more important than whatever else may affect the decision) |
12:35 |
erlehmann |
josiah_wi decide for yourself. but it is a goo issue, if you can debug and fix that, it would actually enable anyone to get more memory issues – as the application exits once it encounters this one. |
12:35 |
erlehmann |
a goo issue → a good issue |
12:36 |
MTDiscord |
<josiah_wi> Righto. Will start with that one! |
12:36 |
erlehmann |
in general, i expect most of the issues that turn up once enough people try the sanitizer stuff to be easily fixable |
12:38 |
erlehmann |
so far i have encountered: wrong variable widths/types, uninitialized fields, data races between threads, having a null pointer where it is illegal, use after free, pointers appearing to point to objects that are not of the correct type, … |
12:38 |
erlehmann |
except for the data races, fixing that stuff is pretty straight-forward |
12:40 |
MTDiscord |
<josiah_wi> erhlemann, which compiler should I use? I typically use GCC, but maybe it doesn't have the memory option? |
12:41 |
|
adfeno joined #minetest-dev |
12:41 |
erlehmann |
ah, not all compilers have all sanitizers |
12:41 |
erlehmann |
sorry |
12:41 |
erlehmann |
compile with clang++ |
12:42 |
erlehmann |
to my knowledge only gcc and clang have sanitizers, and both compilers have some useful options the other does not have |
12:42 |
erlehmann |
but only clang++ had the memory sanitizer on my machine |
12:42 |
MTDiscord |
<josiah_wi> Good to know. |
12:42 |
erlehmann |
also clang & gcc differ on the optimizer |
12:43 |
erlehmann |
so if you have UB they might just disagree on what the assembly is |
12:46 |
MTDiscord |
<josiah_wi> I know people have their own personal style of each cmake command that they're used to, but you don't need quotes around every -D option; could save some typing. There's also a CMAKE_BUILD_TYPE variable. It can be set to Release, Debug, or RelWithDebug (specific to Minetest) IIRC and will add appropriate optimization flags. |
12:49 |
erlehmann |
“you don't need quotes around every -D option” actually, i do. |
12:50 |
MTDiscord |
<josiah_wi> Interesting. Which shell? |
12:50 |
erlehmann |
some shells, like the rc(1) shell that i use, choke on unquoted equals signs there |
12:50 |
erlehmann |
it also makes it obvious what value is given |
12:56 |
|
adfeno joined #minetest-dev |
13:05 |
pgimeno |
this is what I meant about the danger of bools: https://godbolt.org/z/zvPsz6Pr5 |
13:06 |
pgimeno |
clang loves to do arithmetic with them |
13:07 |
erlehmann |
pgimeno, well the boole can only be 0 or 1, so it is *perfectly legal* |
13:08 |
pgimeno |
of course, my point is that a bool out of range can result in a buffer overflow |
13:08 |
erlehmann |
volatile x, or in german “bitte nicht schubsen, diese variable ist voller teile” |
13:09 |
erlehmann |
pgimeno yeah, surprising isn't it? |
13:09 |
erlehmann |
pgimeno and all it takes is the bool not being initialized, falling back to whatever was on the heap or wherever you are storing your precious bools nowadays |
13:10 |
pgimeno |
I was emphasizing this point: |
13:10 |
pgimeno |
[0911 19:13:20] <pgimeno> so I'd say a bool taking an illegal value is a serious issue |
13:29 |
erlehmann |
pgimeno, now only people like v-rob and SmallJoker have to see it that way! |
13:29 |
erlehmann |
josiah_wi managed to reproduce the memory error? |
13:36 |
sfan5 |
instead of spending lots of time convincing people of a certain severity better just submit a PR with a fix |
13:43 |
erlehmann |
sfan5 i told you i am not exactly good at fixing |
13:49 |
pgimeno |
erlehmann: first rule of free software: that who proposes, must be prepared to do the work |
13:53 |
pgimeno |
problem is, with the incomplete traces it's hard to follow the tracks to the point where the bug was triggered |
13:53 |
MTDiscord |
<josiah_wi> erlehmann, it is still compiling. |
13:54 |
pgimeno |
if it can be accompanied by a reproduction recipe that would help me tracking the issue |
13:54 |
pgimeno |
erlehmann: have you reported this one on GH? https://mister-muffin.de/p/fSgo.txt |
13:57 |
MTDiscord |
<josiah_wi> Aha, I can repro. |
13:59 |
erlehmann |
i have reported a new one and even made a mod to reproduce it https://github.com/minetest/minetest/issues/11625 |
14:00 |
erlehmann |
> lottapixel.jpg is a 4856 byte JPEG file that has been edited to say its dimensions are 64250×64250. |
14:01 |
erlehmann |
i guess i should just get a better computer with more memory |
14:01 |
erlehmann |
spoiler: i have no idea how to fix this! |
14:02 |
sfan5 |
no backtrace? |
14:02 |
erlehmann |
no, it just craps out and i did not start it with gdb |
14:02 |
erlehmann |
there was one error message |
14:03 |
sfan5 |
it's probably an Irrlicht bug regardless |
14:04 |
erlehmann |
> 2021-09-14 15:41:34: ERROR[Main]: Irrlicht: JPEG FATAL ERROR in _tempreadfile: Corrupt JPEG data: bad Huffman code |
14:05 |
erlehmann |
bug-wise, do you prefer bugs where the server or where the client crashes? |
14:06 |
erlehmann |
i know how to fix it |
14:07 |
erlehmann |
validate all input files against a grammar |
14:08 |
pgimeno |
then you have no excuse to submit a fix if you care about the bug |
14:08 |
MTDiscord |
<josiah_wi> Is there a macro that's literally just an underscore? |
14:09 |
sfan5 |
possibly |
14:09 |
pgimeno |
most likely translation stuff |
14:09 |
MTDiscord |
<josiah_wi> make_pair("name", _("some string")) |
14:10 |
MTDiscord |
<josiah_wi> Ok, I'm not even going to ask. breathes deeply |
14:10 |
|
proller joined #minetest-dev |
14:20 |
|
calcul0n joined #minetest-dev |
14:21 |
pgimeno |
@josiah_wi see https://www.gnu.org/software/gettext/manual/html_node/Overview.html second box |
14:22 |
|
Fixer joined #minetest-dev |
14:26 |
pgimeno |
heh guess what, gimp opens the image in #11625 (it takes a while though) |
14:26 |
ShadowBot |
https://github.com/minetest/minetest/issues/11625 -- Pixelflood attack: Sending lottapixel.jpg from server segfaults client upon connection |
14:32 |
pgimeno |
what's a reasonable resolution limit for images? like, 4096x4096? or is even that too much? |
14:33 |
MTDiscord |
<Jonathon> skyboxes use the largest images that i know about |
14:36 |
MTDiscord |
<josiah_wi> I am missing something. The second insert into the std::map of options always causes the memory error |
14:36 |
MTDiscord |
<josiah_wi> Doesn't matter which insert. It's always the second one. |
14:37 |
MTDiscord |
<josiah_wi> Is it possible that std::map is responsible!? |
14:41 |
pgimeno |
@josiah_wi which issue are you investigating? |
14:42 |
MTDiscord |
<josiah_wi> The uninitialized value on startup. |
14:42 |
pgimeno |
what issue # ? |
14:44 |
MTDiscord |
<josiah_wi> 11624 |
14:45 |
MTDiscord |
<josiah_wi> Hah, doing all the options in a single insert avoids the error, |
14:45 |
MTDiscord |
<josiah_wi> Unbelievable. |
14:46 |
pgimeno |
yeah it's possible that the STL has these things, that's why valgrind has exclusion files |
14:46 |
|
v-rob joined #minetest-dev |
14:48 |
pgimeno |
https://stackoverflow.com/questions/20617788/using-memory-sanitizer-with-libstdc |
14:48 |
pgimeno |
are you using libc++? |
14:48 |
MTDiscord |
<josiah_wi> Frankly, making a single insert call should reduce overhead by a ridiculously small smidgen which is always nice, and looks nice and clean. OK if I make a PR? |
14:49 |
MTDiscord |
<josiah_wi> I probably am using libstdc++ but I don't really know. |
14:50 |
pgimeno |
do you have libc++ installed at all? |
14:51 |
sfan5 |
please don't make a PR with pointless changes |
14:52 |
MTDiscord |
<josiah_wi> Yes, I do. |
14:52 |
sfan5 |
and going by that SO post just having libc++ installed won't do it either |
14:52 |
sfan5 |
(because whatever version your distro ships will surely not be instrumented for MSan) |
14:54 |
MTDiscord |
<josiah_wi> Nevermind, error came back. |
14:54 |
|
proller joined #minetest-dev |
14:57 |
MTDiscord |
<josiah_wi> erlehmann, I'm done with this particular issue. I don't believe there's any local fix for this issue, and there are probably hundreds like it. |
15:15 |
|
MTDiscord1 joined #minetest-dev |
15:36 |
|
hendursaga joined #minetest-dev |
15:50 |
|
appguru joined #minetest-dev |
15:51 |
appguru |
We don't use Travis CI anymore, right? |
15:54 |
sfan5 |
no and even if we wouldn't be affected |
15:54 |
|
flux__ joined #minetest-dev |
15:55 |
sfan5 |
the reason you're asking is https://twitter.com/peter_szilagyi/status/1437646118700175360 right? |
15:55 |
|
Extex joined #minetest-dev |
15:58 |
nrz |
yeah, didn't linked it because we moved long time ago because travis was... s**t ? |
16:57 |
|
v-rob joined #minetest-dev |
17:00 |
|
Extex joined #minetest-dev |
17:04 |
MTDiscord |
<josiah_wi> UbSan doesn't work if Irrlicht is dynamically linked due to https://stackoverflow.com/questions/57294792/c-ubsan-produces-false-positives-with-derived-objects. |
17:08 |
MTDiscord |
<josiah_wi> Now I have to wait half an hour again to recompile with static Irrlicht. On the upside, the false positive was on a line that does have UB. It accesses a method on a pointer returned by Irrlicht, which can be null. |
17:12 |
|
tekakutli left #minetest-dev |
17:16 |
|
tekakutli joined #minetest-dev |
17:20 |
|
calcul0n_ joined #minetest-dev |
18:18 |
|
v-rob joined #minetest-dev |
18:20 |
|
erlehmann joined #minetest-dev |
18:20 |
erlehmann |
could you put https://irc.minetest.net/minetest-dev in the topic? |
18:21 |
erlehmann |
pls |
18:22 |
sfan5 |
why |
18:23 |
erlehmann |
bc kinda relevant to the channel if someone has not been there for a moment or a while or a long time |
18:23 |
erlehmann |
like me rn |
18:24 |
erlehmann |
it's not like the channel topic is rare real estate or that it is irrelevant |
18:24 |
erlehmann |
> what's a reasonable resolution limit for images? like, 4096x4096? or is even that too much? |
18:24 |
erlehmann |
pgimeno, i think the image should not be processed regardless of resolution |
18:24 |
erlehmann |
it is obviously illegal |
18:25 |
erlehmann |
the only way to be sure is to first check if this is a legal file according to your expectations |
18:26 |
erlehmann |
which would include max resolution, but also basic sanity checking like “does this thing contain all the pixels it says it does” |
18:27 |
erlehmann |
<josiah_wi> erlehmann, I'm done with this particular issue. I don't believe there's any local fix for this issue, and there are probably hundreds like it. |
18:27 |
erlehmann |
josiah_wi have you found what exactly is the uninitialized memory that is used there? |
18:27 |
erlehmann |
bc that stack trace looks like a mess |
18:28 |
erlehmann |
josiah_wi do -fno-sanitize=vptr |
18:28 |
erlehmann |
josiah_wi that will silence all the vptr warnings |
18:35 |
|
longerstaff13 joined #minetest-dev |
18:38 |
sfan5 |
merging #10796, #11618 in math.ceil(math.pi*2) minutes |
18:38 |
ShadowBot |
https://github.com/minetest/minetest/issues/10796 -- Chop game background by appgurueu |
18:38 |
ShadowBot |
https://github.com/minetest/minetest/issues/11618 -- Add Windows-specific CreateTempFile() implementation by sfan5 |
18:50 |
|
v-rob joined #minetest-dev |
18:51 |
erlehmann |
sfan5, is there still time to test https://github.com/minetest/minetest/pull/10796 ? or why are you posting this here |
18:51 |
erlehmann |
oh it is merged |
18:53 |
erlehmann |
can i suggest more stuff to delete if it is not used |
18:53 |
erlehmann |
like provably not used |
18:53 |
erlehmann |
i.e. dead code |
18:59 |
sfan5 |
you can |
19:00 |
erlehmann |
sfan5, do you have any kind of test case for the jpeg loader function? i ask becauses of https://github.com/minetest/irrlicht/commit/594de9915346a87f67cd94e28c7933993efb5d3b |
19:00 |
sfan5 |
no |
19:00 |
erlehmann |
if you give me a thing that loads jpegs, a cli program, i can instrument it and find more jpeg loader bugs |
19:00 |
erlehmann |
alternatively, i'd have to write one myself, but the downside is that i'd have to write one myself obv |
19:01 |
sfan5 |
the smallest possible irrlicht using program is pretty small so that should be quick |
19:01 |
erlehmann |
i actually have done jpeg fuzzing for work years back |
19:01 |
erlehmann |
was pretty funny |
19:02 |
erlehmann |
the result was that sometimes a bitflip is enough to totally ruin someones day (if that day hinges on loading a jpeg) |
19:04 |
erlehmann |
sfan5, neat that you fixed it fast btw |
19:04 |
erlehmann |
sfan5 i hope my mod was a good way to test it. or could i have made it any easier? |
19:10 |
sfan5 |
was easy enough |
19:15 |
|
specing_ joined #minetest-dev |
19:21 |
pgimeno |
<erlehmann> alternatively, i'd have to write one myself, but the downside is that i'd have to write one myself obv <-- if you care enough, do the work yourself; if you don't, don't ask others to do it for you |
19:24 |
erlehmann |
pgimeno, i asked if there was one available, not to make one available |
19:25 |
erlehmann |
“if you give me X, i can do Y” is true in the most naive form, i.e. it is not a request to *create* X |
19:26 |
erlehmann |
please do not thing i am expecting anything i am not clearly saying |
19:26 |
erlehmann |
think |
19:26 |
erlehmann |
sorry |
19:27 |
erlehmann |
pgimeno i do care, but like anyone elses i have limited time and energy. and since minetest scandalously broke my just released pixelflood mod i have to find a new malformed image on which it chokes to preserve the crash functionality, i.e. re-enable spacebar heating! :P |
19:28 |
sfan5 |
you said the TGA code is "battle-tested" but I am sorry to inform you that such a bug is in there too |
19:28 |
sfan5 |
so you could look for that |
19:30 |
erlehmann |
sfan5, battle-tested means exactly that, it has survived so far without major breakage. i will try to break everything, regardless if i like it or not. |
19:31 |
erlehmann |
i.e. all image formats will eventually fall |
19:31 |
erlehmann |
(and be fixed) |
19:32 |
erlehmann |
btw i found that “server owners should make sure they have no corrupted files” comment hilarious |
19:41 |
MTDiscord |
<josiah_wi> erlehmann, the uninitialized memory is completely the fault of the std::map implementation, apparently. |
19:41 |
erlehmann |
josiah_wi can you not trick it into initializing something? |
19:41 |
erlehmann |
i mean, that is unfortunate to begin with |
19:42 |
erlehmann |
bc memory sanitizer will, as i understand it, only complain if this can actually affect program flow |
19:42 |
erlehmann |
so ig it matters in *some* arcane way i do not understand |
19:43 |
erlehmann |
josiah_wi statically recompiling is prob smarter than what i did with ignoring vptr |
19:46 |
MTDiscord |
<josiah_wi> The static lib either didn't fix it, or I messed some up. |
19:48 |
MTDiscord |
<josiah_wi> I tried to trick std::map by making a single insert() call, but that failed too. |
19:57 |
|
v-rob joined #minetest-dev |
20:12 |
pgimeno |
thing is, the C/C++ libraries are allowed to invoke UB because they are aware of the 8nternals of the compiler they're designed to work with, so you may have false positives there |
20:12 |
pgimeno |
internals* |
20:14 |
erlehmann |
pgimeno, “allowed to invoke UB”? |
20:14 |
erlehmann |
that would be news to me |
20:14 |
erlehmann |
pgimeno do you have any further reading on that? |
20:15 |
erlehmann |
josiah_wi did you try -fno-sanitize=vptr though? |
20:15 |
specing |
UB is a way of life for C/C++-heads |
20:15 |
specing |
they can't sleep well at night unless they have at least one serious memory bug per 100 lines of code |
20:16 |
MTDiscord |
<Warr1024> Holy shit, this Targagate thread on GitHub ... what's all this talk about breaking old worlds? |
20:17 |
MTDiscord |
<Warr1024> I have to be crazy because there's all this debate but the solution for MCL* to guard against future deprecation is obvious. |
20:17 |
MTDiscord |
<Warr1024> Just read the maps from TGA, then write them to TGA (for storage) and to PNG (for the clients to display) |
20:17 |
MTDiscord |
<Warr1024> Is there something I missed about why that wouldn't work? |
20:18 |
sfan5 |
it works perfectly well |
20:18 |
sfan5 |
MCL does not even need TGA for storage |
20:18 |
sfan5 |
the maps are only ever written |
20:18 |
pgimeno |
yeah, old servers with new clients @Warr1024 |
20:19 |
MTDiscord |
<Warr1024> Server owners are probably just going to have to maintain their servers |
20:20 |
MTDiscord |
<Warr1024> Well, we're still talking about deprecation, not removal. Presumably we would flag TGA deprecated in 5.5, and server owners would have until 5.6 is released to handle that. |
20:21 |
sfan5 |
well I don't think we've ever had "new clients may not fully work on previous version servers" before |
20:21 |
MTDiscord |
<Warr1024> Or maybe 5.6 would end up being called 6.0 instead, if people are going to make such a stink about one file format. |
20:22 |
MTDiscord |
<Warr1024> I see no reason why we have to assume 6.0 needs to be some huge milestone. Just trimming the fat out of Irrlicht could be sufficient justification. It's really just a number... |
20:23 |
erlehmann |
“Presumably we would flag TGA deprecated in 5.5, and server owners would have until 5.6 is released to handle that.” – look, if debian is still on 5.3 while you release 5.5, no server owner will even know. |
20:23 |
sfan5 |
debian's lousy update policy will not dictate development. |
20:23 |
MTDiscord |
<Warr1024> I can tell you from experience that being on Debian means you use FlatPak :-D |
20:24 |
MTDiscord |
<Warr1024> Well, for client use, anyway. Servers are more a Docker thing anyway. |
20:25 |
erlehmann |
as i see it, the choice is: break stuff or do not break stuff. it's not like the TGA code is hampering anyone's ability to refactor anything, or is it?? |
20:25 |
erlehmann |
btw, i would care much less if the attitude “haha i break it now someone else fix it” was verboten |
20:27 |
MTDiscord |
<Warr1024> Actually, what I was hoping for was to do the fix first. Should be a short patch for e.g. Mineclonia to leave the rest of stuff as-is but write the PNG in tandem and just use that. |
20:27 |
erlehmann |
sfan5, btw, i have reports that minetest has much worse performance on reform2 than on my thinkpad |
20:27 |
erlehmann |
Warr1024 if hecks was forced to follow a sensible deprecation policy that would probably have been discussed already |
20:28 |
sfan5 |
in what way? rendering? if so no surprise, the graphics stuff that comes with SoC is bad (exceptions are rare) |
20:28 |
erlehmann |
someone got like 7 or 8 fps out of the box |
20:29 |
erlehmann |
i get 27 even with mineclonia on the T60, which is among the heaviest games |
20:29 |
sfan5 |
it maybe also be a coincidence that the way MT goes about rendering works particularily bad there |
20:29 |
erlehmann |
well it worked on reform1 |
20:29 |
MTDiscord |
<Warr1024> Pretty sure we have been having the TGA vs PNG discussion already. It's just that instead of spiraling in toward a conclusion it's spiraling out into another sneakgate or something. |
20:29 |
erlehmann |
i will investigate if anything broke it some time soon |
20:30 |
sfan5 |
if whatever SoC the new one is using isn't using something entirely different for graphics the performance should be strictly better |
20:30 |
erlehmann |
the new one is ofc using an imx8, while the old one is using an imx6 |
20:30 |
MTDiscord |
<Warr1024> I'd rather just patch the mineclones defensively so that they can not have to give a shit about whether the engine supports TGA or not in the future. The sooner that happens, the better the chance that it will actually affect nobody, or at least the fewer who will actually be affected, regardless of what/when deprecations actually happen. |
20:30 |
sfan5 |
at this point I'd question whether the graphics driver is even complete |
20:31 |
erlehmann |
also the old one uses X11, the new one wayland |
20:32 |
erlehmann |
look i am just trying to point out that hecktest is literally trying to make me unable to run minetest on any of the devices i own |
20:32 |
erlehmann |
which kinda makes it personal |
20:32 |
erlehmann |
unless afterwards it works on the reform2 |
20:32 |
Menchers |
hecktest? |
20:33 |
MTDiscord |
<Warr1024> Heh, I never heard of the reform before, so I went and checked it out, and they show one actually playing minetest :-) |
20:34 |
erlehmann |
hecks is the person who is gutting irrlichtmt and plans to rewrite the renderer for reasons of performace on newer device, but will probably not do the work of making it still run on older devices or devices who have abysmal OGLES performance |
20:34 |
appguru |
Really, the issue is MT doesn't abide by semver but claims it did. Features are being removed in minor releases, which is not acceptable. Minor releases may not break compatibility. I have no issue with the major version increasing every year, but please do it properly. |
20:34 |
appguru |
s/did/does |
20:34 |
erlehmann |
what appguru says |
20:35 |
MTDiscord |
<Warr1024> I'd be fine with doing major version bumps pretty regularly too. Not necessarily every release, but maybe every 2 releases (i.e. once per year) I could live with. |
20:35 |
erlehmann |
it's funny though, many devs say to “just be honest about breakage” something like “but then we will we at version 25.x.y. in a year” |
20:35 |
erlehmann |
well either they are honest about breaking stuff – or they stop breaking stuff |
20:35 |
appguru |
MTver: majormajor.majorminor.minorpatch |
20:36 |
erlehmann |
any idiot can make a new feature work. but it takes care to make it a) maintainable b) provide a good upgrade path. |
20:36 |
MTDiscord |
<Warr1024> I only support 1 past minor release for my game anyway, and even that isn't always "actively" tested. I do make exceptions to that policy if some platform gets stuck behind, like Android did for a while, but it really does hold the whole game back... |
20:36 |
sfan5 |
a major version bump is essentially reserved for network incompatibility or I dunno, a half rewrite of the mod api or something |
20:36 |
sfan5 |
proposing more major bumps is essentially saying "please do more, bigger and large scale incompatible changes" |
20:37 |
appguru |
Please refer to https://semver.org/: "MAJOR version when you make incompatible API changes" |
20:37 |
appguru |
"MINOR version when you add functionality in a backwards compatible manner" |
20:37 |
appguru |
"PATCH version when you make backwards compatible bug fixes" |
20:37 |
appguru |
There is no room for interpretation here. |
20:37 |
sfan5 |
no? |
20:37 |
sfan5 |
what is an "API"? |
20:38 |
appguru |
The Lua API is obviously an API. |
20:38 |
erlehmann |
appguru do not go down that rabbit hole. i have seen that discussion technique. sfan5 is probably not malicious, but you can not win when the other person traps you into “what is the meaning of this word”. |
20:39 |
erlehmann |
especially if they have experience with that word (i.e. the API in this case) |
20:39 |
appguru |
Well, the meaning of API is quite simple: Application Programmer Interface. |
20:39 |
sfan5 |
so are the media formats part of the API or not? |
20:39 |
sfan5 |
after all the API did not change |
20:39 |
sfan5 |
does API even cover the client? all code runs on the server after all |
20:40 |
sfan5 |
also, there are two API-incompatible versions of Minetest at any given point depending on whether you build with or without LuaJIT |
20:40 |
sfan5 |
I don't think semver supports quantum states |
20:40 |
sfan5 |
erlehmann: correct |
20:40 |
appguru |
This conversation technique is generally referred to as "reasonable doubt" IIRC |
20:40 |
appguru |
Yes, the Lua vs. LuaJIT thing is definitely an annoyance |
20:41 |
appguru |
The server API did change: dynamic_media_add won't accept a TGA file anymore |
20:41 |
erlehmann |
that's unfortunate |
20:41 |
sfan5 |
don't worry, we could leave that in |
20:41 |
sfan5 |
just the client won't accept it anymore ;) |
20:41 |
erlehmann |
they are generated dynamically after all |
20:41 |
appguru |
Well, TGA is being added back, so it's fine |
20:42 |
appguru |
But media is definitely part of the interface. |
20:43 |
sfan5 |
reverse question: since the network protocol is not an API could be break it in a minor version? |
20:43 |
sfan5 |
as should be obvious by now my point is that throwing the semver definition at MT does not work |
20:43 |
erlehmann |
told you you can't win |
20:43 |
sfan5 |
maybe it would be worth to write down "Semver-inspired" rules that we actually use but I fear that would just result in more exceptions being made |
20:43 |
erlehmann |
btw the technique is deeply unfair |
20:44 |
erlehmann |
sfan5 what you are doing is moving the goalposts. you could definitely write down hard rules. |
20:44 |
erlehmann |
but you would have to keep to them. |
20:44 |
sfan5 |
yes |
20:44 |
appguru |
"reverse question: since the network protocol is not an API could be break it in a minor version?" |
20:44 |
appguru |
No we could not |
20:45 |
appguru |
Because the API is documented by the effect it has on clients |
20:45 |
erlehmann |
http://sentimentalversioning.org/ |
20:45 |
erlehmann |
> You may explain the system you create, if the beauty is enhanced by understanding it. You may just improvise new numbers from your mood on that day. The only important thing, is that the version number must be meaningful to you, the author. |
20:46 |
erlehmann |
i suggest to read the page to lighten the mood |
20:46 |
erlehmann |
the examples are comedy gold |
20:46 |
sfan5 |
somewhat related https://0ver.org/ |
20:47 |
MTDiscord |
<Warr1024> I actually use monotonic myself, but I could have some fun with senver |
20:47 |
appguru |
"Jeremy calls his versioning system romantic (which is very sentimental of him) It looks like semver (major.minor.patch), but with a personal meaning. For him, a patch is a change you probably won’t notice, and a minor change is when you change it a little bit. A major change is when you make a major release (notice the circular definition!)." |
20:47 |
appguru |
Now that reminds me much of Minetest ;) |
20:47 |
MTDiscord |
<Warr1024> I've seen projects that use senver actually kind of explicitly before (without necessarily knowing of that page). You get version numbers with emoji in them and stuff. |
20:48 |
MTDiscord |
<Warr1024> Look, it's simple. A minor change is any change that's not old enough to drink yet. A major change is a change that's bigger than a captain change but smaller than a lieutenant colonel change. |
20:49 |
appguru |
Warr1024: If I get monotonic right, it just fits minor + patch in a single number? |
20:49 |
MTDiscord |
<Warr1024> er, wait, it's not actually monotonic, it's calver, I get those mixed up. |
20:49 |
MTDiscord |
<Warr1024> timestamp + commit hash |
20:50 |
MTDiscord |
<Warr1024> it always monotonically increases (the versions are lexically sortable except in extreme cases) but it doesn't say anything about distance. |
20:50 |
MTDiscord |
<Warr1024> In theory I could add a second versioning scheme post-hoc, but it seems complicated to have a project with 2 versioning systems. |
20:51 |
appguru |
Just mush them all together: 0-YYYY-MM-dd-major.minor.patch-42-69 |
20:56 |
erlehmann |
i have updated my pixelflood mod to crash minetest again |
20:56 |
erlehmann |
this will be a fun game |
20:56 |
MTDiscord |
<josiah_wi> erlehmann, I got UBSan chugging away, and I'm working on the first error, namely the integer overflow in noise2d. |
20:57 |
erlehmann |
josiah_wi yay |
20:57 |
MTDiscord |
<josiah_wi> It was so subtle I had to go double check the assembly to convince myself of the issue lol. Almost scary. |
20:57 |
erlehmann |
josiah_wi tell more? |
20:57 |
MTDiscord |
<josiah_wi> I am asking myself how many times I've caused that exact same behavior. |
20:57 |
erlehmann |
haha yeah |
20:57 |
MTDiscord |
<josiah_wi> Overflow during an intermediate arithmetic operation. |
20:58 |
MTDiscord |
<josiah_wi> The result is stored as unsigned, but all intermediate computations are signed. |
20:58 |
erlehmann |
solution, ubsan in production, there is some “fast mode” where it just crashes i think and has little runtime overhead (but do not believe me, test that!) |
20:58 |
MTDiscord |
<josiah_wi> I'm using the mode where it crashes on every error it encounters. |
20:59 |
erlehmann |
that's a good way to work yourself through the binary lol |
21:00 |
MTDiscord |
<josiah_wi> Anyway, I want advice from a core dev, because fixing this will very likely be a behavior change in the perlin noise. |
21:01 |
MTDiscord |
<josiah_wi> I don't know the perlin noise math, and I have no clue what kind of change this is going to be, but I'm pretty sure the results of the arithmetic will be different after it's fixed. |
21:03 |
sfan5 |
that doesn't sound acceptable |
21:03 |
MTDiscord |
<josiah_wi> erlehmann, will UBSan make any kind of deductions about possible values, or will it only error when it observes UB actually happening? |
21:04 |
MTDiscord |
<josiah_wi> I fixed it temporarily by casting one operand to unsigned int, but to properly fix it I'm assuming I would have to reason about all possible values of all operands. |
21:05 |
MTDiscord |
<josiah_wi> sfan5, the argument for fixing it would be that right now, the perlin noise equation isn't even strictly defined. XD |
21:05 |
erlehmann |
josiah_wi ubsan comes to you at runtime to tell you that your code did not actually compile. |
21:06 |
sfan5 |
that is a good argument for fixing it, not for breaking the values |
21:06 |
erlehmann |
josiah_wi pleases ask the ubsan docs about what it actually does behind the scene, not me |
21:06 |
sfan5 |
maps are supposed to stay consistent, I don't know how strictly this promise is kept but it's yet another unwritten ruke |
21:06 |
sfan5 |
rule* |
21:06 |
erlehmann |
sfan5 in conclusion, a regression test would enable fearless refactorign |
21:07 |
erlehmann |
maps already have different layout depending from where you approach a mapblock lol |
21:07 |
erlehmann |
it's very subtle |
21:07 |
erlehmann |
but prob irrelevant if no one noticed, it is hard to reproduce anyway |
21:08 |
MTDiscord |
<josiah_wi> So, skip over this issue for the time being? |
21:08 |
erlehmann |
why? |
21:09 |
erlehmann |
there are only a limited amount of inputs and outputs, so you can actually test them all in reasonable time |
21:09 |
MTDiscord |
<josiah_wi> Because the core devs won't support fixing it? |
21:09 |
erlehmann |
i agree with sfan5 that maps should stay consistent |
21:10 |
erlehmann |
so the fix should probably approach the most common miscompilation of the function |
21:10 |
erlehmann |
or whatever you wanna call it |
21:10 |
sfan5 |
if this is about blockseed there are 1208925819614629174706176 distinct inputs |
21:10 |
erlehmann |
but i a defined, stable, never to be broken way |
21:10 |
sfan5 |
we'll wait for you to test them all |
21:11 |
MTDiscord |
<josiah_wi> sfan5, do you know off the top of your head whether the x and y arguments have set limits by the application or whether any integer value is possible? |
21:11 |
sfan5 |
[-4095, 4096] or whatever |
21:11 |
sfan5 |
so in fact are lied, that number is too big |
21:11 |
sfan5 |
I* |
21:12 |
MTDiscord |
<josiah_wi> Hang on a sec. How do we know maps are consistent? Because this is undefined behavior, different compilers could produce different maps for the same seed. (?) |
21:12 |
MTDiscord |
<josiah_wi> 3d noise has the same UB btw, I can see it here looking at the code. |
21:13 |
sfan5 |
¯\_(ツ)_/¯ |
21:14 |
|
v-rob joined #minetest-dev |
21:15 |
MTDiscord |
<josiah_wi> Does the seed need to be signed? It's explicitly signed here, but if I could cast it to unsigned that would completely fix it. |
21:16 |
ShadowNinja |
Signed integer overflow usually either 1. works as you'd expect or 2. triggers dead code elimination and causes the compiler to delete a chunk of code that was actually reachable. |
21:16 |
ShadowNinja |
We can probably cast to/from unsigned with a reinterpret_cast and just assume 2's compliment representation. |
21:18 |
erlehmann |
ShadowNinja it basically never works as you'd expect, because you can have BOTH: see my “if (1 + INT_MAX < 1)” example from earlier |
21:18 |
erlehmann |
ShadowNinja the cast thing would have to be verified to actually behave like the old result though |
21:18 |
erlehmann |
to not break mapss |
21:19 |
sfan5 |
"it's possible therefore it's always the case" |
21:19 |
erlehmann |
true |
21:19 |
erlehmann |
demons will fly out eventually out of your nose, given enough compilations |
21:19 |
MTDiscord |
<josiah_wi> Can I assume that the seed will always be positive? |
21:20 |
erlehmann |
jokes aside, the result of what compilers do with signed integer overflow stuff used to change in minor versions of compilers bc they could literally do what they want, maybe that changed at some point? |
21:20 |
MTDiscord |
<josiah_wi> Actually nevermind. I'm going to cast to long. |
21:20 |
MTDiscord |
<josiah_wi> I better explicitly make it s64. |
21:21 |
erlehmann |
josiah_wi please have a regression test or at least confirm that the assembly is the same, sfan5 map breakage fears are well-founded and i share them! |
21:21 |
ShadowNinja |
Yep, long may be the same size as int depending on platform. |
21:21 |
sfan5 |
I'm pretty sure if you cast it right you can get the same assembly as before |
21:21 |
erlehmann |
better explicitly use types of a width |
21:21 |
sfan5 |
an that would be definitely safe |
21:22 |
erlehmann |
otherwise you may get a windows/linux problem |
21:22 |
MTDiscord |
<josiah_wi> So best bet is to just make the overflow explicit so ubsan doesn't complain about it? |
21:22 |
MTDiscord |
<josiah_wi> It's simply impossible to not overflow and have the same behavior. |
21:23 |
MTDiscord |
<josiah_wi> Now practically, it might turn out there's no noticeable change at all. I can test that. |
21:23 |
sfan5 |
changing it into a defined overflow is the way to go, if that works |
21:25 |
erlehmann |
if there is no change in behavior, you basically lock it in, which is good |
21:25 |
erlehmann |
bc then future compilers will not say that this is not the way |
21:25 |
erlehmann |
sfan5, your move https://github.com/minetest/minetest/issues/11628 |
21:26 |
erlehmann |
and by “your move” i mean, i accidentally filed it on the wrong repo |
21:26 |
erlehmann |
again |
21:26 |
erlehmann |
sorry |
21:26 |
erlehmann |
or did i? |
21:26 |
erlehmann |
sfan5, i actually think this should not even reach irrlichtmt |
21:27 |
erlehmann |
so maybe it is the right repo |
21:27 |
pgimeno |
@josiah_wi can you point out to the line causing the trouble? |
21:28 |
erlehmann |
yeah i think pgimeno fixed it already or not? |
21:28 |
erlehmann |
question was if the fix was the same |
21:28 |
MTDiscord |
<josiah_wi> noise.cpp line 167 and line 177. |
21:28 |
MTDiscord |
<josiah_wi> Sorry, 168 and 178, because the lines wrap. |
21:29 |
sfan5 |
well I won't be adding a size limit in Minetest |
21:30 |
pgimeno |
oh fsck, these are ints |
21:31 |
MTDiscord |
<josiah_wi> Yeah. I don't know how to make the overflow explicit. If I cast before multiplying I change the operands which is no good, but if I cast after it's too late? |
21:32 |
MTDiscord |
<josiah_wi> Casting the seed to s64 fixes the UB but it also changes the assembly (and the behavior, ofc, because now it doesn't overflow). |
21:32 |
pgimeno |
I'd just change s32 to u32 and call it a day |
21:33 |
MTDiscord |
<josiah_wi> That's why I've been asking whether a negative seed is possible. Because if so, that solution is also going to break map consistency (although probably not in practice). |
21:33 |
pgimeno |
I don't say it lightly even if it might seem so, the operation is with a s32 and the product is going to have 32 bits |
21:34 |
pgimeno |
it doesn't matter if the seed can be negative |
21:34 |
erlehmann |
josiah_wi you could make at least a unit test that checks out the boundaries |
21:34 |
erlehmann |
i.e. test for cases that overflow and *just so* do not overflow |
21:34 |
pgimeno |
changing the API is probably not wise, so better to cast the seed to u32 instead |
21:35 |
MTDiscord |
<josiah_wi> Ok, thanks! |
21:37 |
MTDiscord |
<josiah_wi> pgimeno, irrMath.h:329, have you fixed this or shall I start on it? |
21:37 |
MTDiscord |
<josiah_wi> (another signed integer overflow) |
21:37 |
pgimeno |
@josiah_wi I have only worked on the first one erlehmann reported |
21:39 |
pgimeno |
for noise.cpp it's possible to just change line 38 to define NOISE_MAGIC_SEED as 1013U |
21:39 |
erlehmann |
they are basically the same i think |
21:39 |
erlehmann |
or not? |
21:39 |
erlehmann |
ah |
21:39 |
pgimeno |
yes |
21:39 |
erlehmann |
why is that code duplicated anyway |
21:40 |
MTDiscord |
<josiah_wi> I feel like facepalming. The function is computing the maximum value of an s32 (and the one for computing the minimum has the same UB). |
21:41 |
MTDiscord |
<josiah_wi> Oh wait no it's not. It's taking the max of two s32 values. |
21:41 |
pgimeno |
to be clear, this is the patch I propose: http://www.formauri.es/personal/pgimeno/pastes/fix-two-overflows.diff |
21:41 |
MTDiscord |
<josiah_wi> My bad. Anyway, I'm pretty sure there's something for computing a max in the standard library.... |
21:42 |
ShadowNinja |
https://gcc.godbolt.org/z/s4jcaWzhM |
21:43 |
ShadowNinja |
clang compilation is identical. gcc compilation is slightly different, but it looks like the instructions are just reordered. |
21:43 |
MTDiscord |
<josiah_wi> My one concern with the proposed patch is that it's kind of an obscure way to fix the issue and later nobody is going to understand why it was done, but I will do it that way. |
21:45 |
pgimeno |
@josiah_wi it can be explained in the commit text |
21:45 |
pgimeno |
or even in a comment |
21:46 |
pgimeno |
Minetest is sorely lacking in the comment area |
21:46 |
pgimeno |
// The U causes promotion to unsigned of the operation, avoiding UB |
21:47 |
pgimeno |
(example comment) |
21:47 |
MTDiscord |
<josiah_wi> Let's face it. The function in mapgen.cpp should be using the defined value instead of a magic number. |
21:47 |
MTDiscord |
<josiah_wi> I have to put the comment in 2 places because of this. |
21:47 |
pgimeno |
right, but the defines aren't in any header file |
21:47 |
MTDiscord |
<josiah_wi> Yeah. |
21:48 |
pgimeno |
and you know how erlehmann complains when a header file is changed :) |
21:50 |
|
Extex joined #minetest-dev |
21:51 |
erlehmann |
pgimeno i complain anytime, look i trust all of you to work this out |
21:51 |
MTDiscord |
<josiah_wi> Irrlicht has a whole bunch of functions for taking the max/min of two values. Is it OK to start replacing these with STL functions, or are they important for performance or something? |
21:51 |
erlehmann |
i mean with this issue everyone involved understands the rules of basketball and cares about backwards compat |
22:10 |
erlehmann |
did you know that a 165 byte BMP can have apparent image dimensions of 1111498827×1083981? neither did minetest! |
22:10 |
erlehmann |
https://github.com/minetest/minetest/issues/11629 |
22:45 |
pgimeno |
feh swallows that one without problems, it doesn't even take long to open, about 4s |
22:48 |
MTDiscord |
<josiah_wi> networkpacket.cpp line 66: null pointer passed as argument 1, which is declared to never be null |
22:49 |
erlehmann |
ha, this proves you actually did run it |
22:49 |
erlehmann |
i did not mention that one on purpose so far |
22:49 |
MTDiscord |
<josiah_wi> Ofc I ran it. ^^ Why didn't you mention that one? |
22:51 |
erlehmann |
well it is something weird with network packets |
22:51 |
erlehmann |
so naturally, i want this for the client-sent server-side mods! |
22:52 |
erlehmann |
also it is the easiest fiend |
22:52 |
erlehmann |
find |
22:52 |
erlehmann |
happens every time |
22:52 |
erlehmann |
so congratulation, you are the only one who actually tried ubsan apparently |
22:54 |
MTDiscord |
<josiah_wi> It's always possible someone else found it too and kept silent... |
22:59 |
MTDiscord |
<josiah_wi> How do you get the tracebacks? |
23:02 |
erlehmann |
josiah_wi start the instrumented binary with UBSAN_OPTIONS='print_stacktrace=1' |
23:07 |
|
v-rob joined #minetest-dev |
23:15 |
|
hendursaga joined #minetest-dev |
23:26 |
|
AliasAlreadyTake joined #minetest-dev |
23:27 |
pgimeno |
here's the backtrace of #11628: http://www.formauri.es/personal/pgimeno/pastes/backtrace-image-crash.txt |
23:27 |
ShadowBot |
https://github.com/minetest/minetest/issues/11628 -- Pixelflood 2 – Segfault Boogaloo: Sending lottapixel.jpg from server segfaults client upon connection |
23:28 |
pgimeno |
in fact I haven't tried if pixelflood 1.0 crashes too |
23:30 |
pgimeno |
it's a bit weird that it crashes because it reports an error and a warning before crashing |
23:33 |
pgimeno |
yeah, pixelflood 1.0 does not crash, but why does 1.0 not crash and 2.0 does? after the error it should have created a dummy texture just like with 1.0, but it seems that hasn't happened |
23:33 |
pgimeno |
I wonder if this still holds: https://github.com/minetest/irrlicht/blob/master/source/Irrlicht/CImageLoaderJPG.cpp#L94 |
23:41 |
|
adfeno_ joined #minetest-dev |
23:45 |
erlehmann |
pgimeno pixelflood 1.0 was fixed by sfan5 already |
23:45 |
erlehmann |
by limiting the image dimensions to 32000×32000 |
23:45 |
pgimeno |
yeah my point is that the crash does not happen while loading |
23:45 |
erlehmann |
ah hmm |
23:45 |
pgimeno |
it actually attempts to use the image |
23:45 |
erlehmann |
and then crashes? |
23:46 |
pgimeno |
yes, I guess it does because it's incomplete |
23:47 |
pgimeno |
what it should do in case of error is what happens after sfan5's fix: it should replace it with a dummy texture |
23:48 |
erlehmann |
i need to make a prequel btw |
23:48 |
erlehmann |
pixelflood 0: divided |
23:49 |
erlehmann |
just need to find an image format that somehow divides by something |
23:49 |
erlehmann |
and i can also make “2 pixel 4 flood – old filename, new segfault” i guess |
23:50 |
pgimeno |
you're giving good arguments for taking out TGA :) |
23:51 |
pgimeno |
the fewer graphic formats, the lesser code to maintain |
23:52 |
erlehmann |
pgimeno actually TGA is probably the one where i would demonstrate how to fix this issue |
23:52 |
erlehmann |
it is the one for which you can feasibly write a validator |
23:53 |
erlehmann |
to fix these kinds of issues once and forever, one basically needs to write a function that takes the input file and returns either true or false |
23:53 |
erlehmann |
and only determines if it is valid (i.e. expected) input |
23:54 |
erlehmann |
since the TGA files created by MineClone2 and MineClone2 |
23:54 |
erlehmann |
5 i mean |
23:54 |
erlehmann |
are 18 bytes + payload |
23:54 |
pgimeno |
if it's not feasible in other cases, why even bother? |
23:54 |
erlehmann |
it is pretty easy |
23:54 |
erlehmann |
well it is possible, just not in very little time |
23:55 |
erlehmann |
to write it i mean |
23:55 |
erlehmann |
the validation is always fast |
23:55 |
erlehmann |
and you do not neet to match the full file format, only the part of the spec that minetest actually understands |
23:56 |
erlehmann |
like, if minetest can't do palette images or whatever weird feature a file format might have, let the validator reject that |
23:56 |
erlehmann |
before it reaches code where it might crahs |
23:56 |
erlehmann |
basically, that way you get an application firewall |
23:56 |
pgimeno |
you don't have to validate files if you have robust decoders, which I don't know if is the case |
23:56 |
erlehmann |
that is plain wrong |
23:56 |
erlehmann |
do you have python3 installed? |
23:56 |
pgimeno |
yes |
23:57 |
erlehmann |
from base64 import b64decode |
23:57 |
erlehmann |
b64decode("V=m=0=") |
23:57 |
erlehmann |
stuff is *horribly* broken |
23:58 |
erlehmann |
becaue there is no way that “V=m=0=” is valid basse64 |
23:58 |
erlehmann |
yet it is decoded to “Vm” |
23:59 |
erlehmann |
now imagine you have python – you must put a regex that recognizes valid base64 before the b64decode() invocation, otherwise bad things will happen. |
23:59 |
erlehmann |
but once you do, you don't care about how your decoder reacts to malformed input |
23:59 |
erlehmann |
after all, it handles all the valid innput correctly |
23:59 |
MTDiscord |
<Jordach> take it from me - if someone is going to validly upload broken things to CDB it'll get caught by the review process as it probably contains crashes from corrupt or invalid files |
23:59 |
erlehmann |
and the invalid one does not reach it |
23:59 |
MTDiscord |
<Jordach> things like this in a small community that generally knows each other isn't going to go far |
23:59 |
erlehmann |
is that a challenge |