<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jul 9, 2023 at 5:54 PM Chet Ramey <<a href="mailto:chet.ramey@case.edu" target="_blank">chet.ramey@case.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 7/7/23 6:45 PM, enh wrote:<br>
<br>
>      > define "mess up"...<br>
> <br>
>     Maybe "mess up" was too strong. I think it's rude to send a fatal signal if<br>
>     you have the function. Either don't provide it or make it return -1/ENOSYS.<br>
>     Android is by no means the only place this is a problem; it happens with<br>
>     docker all the time:<br>
> <br>
>     <a href="https://lists.gnu.org/archive/html/bug-bash/2022-03/msg00010.html" rel="noreferrer" target="_blank">https://lists.gnu.org/archive/html/bug-bash/2022-03/msg00010.html</a><br>
>     <<a href="https://lists.gnu.org/archive/html/bug-bash/2022-03/msg00010.html" rel="noreferrer" target="_blank">https://lists.gnu.org/archive/html/bug-bash/2022-03/msg00010.html</a>><br>
> <br>
> <br>
> yeah, if it's any consolation we argued about this choice a lot. (which is <br>
> probably also why the choice exists in the first place!)<br>
> <br>
> iirc we even _tried_ -1/ENOSYS to test the predictions that (a) most c <br>
> programmers don't check for failures (b) even those that do don't log <br>
> enough to be able to debug these problems <br>
<br>
It penalizes those who do.<br></blockquote><div><br></div><div>yeah, but we optimize for the common case.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> and (c) even in cases where <br>
> errors are checked and logged, the ability of folks -- including _end <br>
> users_ -- to triage such problems is limited. <br>
<br>
Killing the process certainly doesn't improve that. How is it better for<br>
triage when the process dies unexpectedly with a fatal signal -- when<br>
running a builtin command -- that can't be reproduced anywhere else? If<br>
Grisha Levit hadn't recognized what was going on, I never would have even<br>
looked at it. I don't use Android as a development platform.<br></blockquote><div><br></div><div>and i think that's the cross-purpose we're talking at here ... the 99% case is app code, which actually means "JNI library dlopen()ed into a clone of the zygote --- no main() at all". most app developers have no direct contact with their users, and rely on clustered groups of automatically-collected crashes. so a _crash_ is 100x more likely to actually be something the developer sees. (as opposed to "i seem to be having more users uninstall my app, but have no idea why and no way to find out".)</div><div><br></div><div>the kind of collaborative command-line debugging over a mailing list that you're familiar with doesn't exist for the TikToks of this world.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> i'm not a _fan_ of SIGSYS, <br>
> but i do still think it was the lesser of the available evils. (but of <br>
> course it's the folks who _do_ check for failures who're most likely to <br>
> disagree;<br>
<br>
OK, I'm going to disagree.<br></blockquote><div><br></div><div>because you have a completely different use case _and_ you're a very different kind of developer. there's no question it's not a good fit for you. (but you're running in an app _context_ even if not in an app, so you get to enjoy "one size fits all" :-( )</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
>      > Android deliberately has strict seccomp filters for<br>
>      > apps, and the syscalls mentioned in that post are on the "no" list.<br>
>     Android<br>
>      > gives each _app_ a different uid, so there's typically nothing<br>
>     useful you<br>
>      > can do here anyway. (things are a bit different if you're actually<br>
>     part of<br>
>      > the OS, but bash being GPL makes that unlikely :-( )<br>
> <br>
>     Sure. But if you have the function, bash assumes it works as documented in<br>
>     the rest of the Linux world.<br>
> <br>
> <br>
> and so it does, if you're not an app.<br>
> <br>
> the tricky case here has always been the conflict between the folks who <br>
> want to check at build time versus those who want to check at runtime ... <br>
> if we hide things in the headers, people complain "i wasn't going to call <br>
> it unless i know i can anyway". (plus in addition to the general rule that <br>
> "most configure scripts don't handle cross-compilation correctly", you'd be <br>
> surprised how many screw up the simple "is this function available?" test <br>
> --- they don't compile a small program that #includes the right header and <br>
> tries to call the function; they grep the header or nm the library or <br>
> whatever.)<br>
<br>
If AC_CHECK_FUNCS doesn't do the right thing when cross-compiling, maybe<br>
the autotools folks should hear about it?<br></blockquote><div><br></div><div>i don't think autoconf is broken (given that _some_ stuff gets it right). but a lot of library developers just don't take cross-compilation into account. (obviously massive selection bias here since i was an embedded developer before working on Android, so i've mostly _only_ known cross-compilation, plus i obviously don't have to spend much time on the libraries that _do_ work.)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
>      > (yes, i agree that it's mildly unfortunate that there's no special<br>
>     case for<br>
>      > "i don't actually want to change anything", which i think is the case<br>
>      > they're talking about in that post, and i've wondered about adding<br>
>     that to<br>
>      > libc once or twice, but my feeling is that it wouldn't be particularly<br>
>      > useful in practice because _that_ kind of code probably needs a rethink<br>
>      > anyway when porting to Android.)<br>
<br>
I'm not sure moving that burden to the application is appropriate, either.<br>
But bash has no android-specific code; there's no "porting to android" at<br>
this point.<br></blockquote><div><br></div><div>again, if you're an _application_ things are very different --- it's a reasonable assumption that iOS and Android are your two main targets, and i'm sure there's plenty of stuff you can't do on iOS for security reasons too. you just don't see that because you wouldn't be able to run bash on iOS in the first place :-)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> <br>
>     I just added code to bash that doesn't try to call setresuid/setresgid if<br>
>     nothing is actually changing, which will save a couple calls everywhere.<br>
>     But killing the process is rude.<br>
> <br>
> <br>
> you're talking to the guy who added the equivalent of `if (fp == NULL) <br>
> abort_with_message("you can't pass a null FILE*");` to every stdio function <br>
> because too many developers don't check fopen() succeeded, and think libc <br>
> is broken if fgets() dereferences a null pointer.<br>
<br>
Oh, come on, really? What's next? Adding checks in the str* functions<br>
for NULL pointers? I am sure that catering to bad programming is not the<br>
way to improve programming practices.<br></blockquote><div><br></div><div>no, because there's no causal link with an earlier failure there. again, imagine you're in an app developer's shoes for a moment --- are you going to be able to remotely debug (without being able to talk to the affected users) "crashes all the time; zero stars" or "Cause: null FILE* passed to fgets()" with a stack trace that shows you where, and lets you work out which earlier fopen() you didn't check?</div><div><br></div><div>we _do_ have memcpy()-is-memmove() and we _do_ have _FORTIFY_SOURCE=2 by default, for example. so "yes; to the extent that we can be helpful, we strive to be helpful".</div><div><br></div><div>similar to Larry Wall's "make easy things easy, and hard things possible", we err on the side of "make common screwups easy to debug, and hard ones [more] possible".</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> killing a process with a <br>
> "you called syscall %d and you're not allowed to" message is pretty much <br>
> exactly what you'd expect from me :-) <br>
<br>
Yeah, alex didn't get that.<br>
<br>
 > bash-5.2$ set +p<br>
 ><br>
 > [Process completed (signal 31) - press Enter]<br>
 ><br>
<br>
Bash catches SIGSYS in interactive shells so it can clean up the terminal<br>
pgrps and save the history, so the user's not going to see that message<br>
from bash (assuming you print it from the default signal `handler'). </blockquote><div><br></div><div>yes, Android installs default signal handlers for all the usual crashes that will ensure a crash ends up in the log, a more detailed tombstone (if you're an OS developer or otherwise have access to the file system), and -- if you're a Play app -- you'll get anonymized clustered crash reports in your developer console, looking something like <a href="https://source.android.com/docs/core/tests/debug/native-crash#seccomp" target="_blank">https://source.android.com/docs/core/tests/debug/native-crash#seccomp</a> but without the "we can't _prove_ it's not PII you're trying to exfiltrate, so we just redact it" register values.</div><div><br></div><div>(you can also get hold of tombstones [in protobuf format <a href="https://android.googlesource.com/platform/system/core/+/refs/heads/main/debuggerd/proto/tombstone.proto">https://android.googlesource.com/platform/system/core/+/refs/heads/main/debuggerd/proto/tombstone.proto</a> ] from your last crash via <a href="https://developer.android.com/reference/android/app/ApplicationExitInfo#getTraceInputStream()">https://developer.android.com/reference/android/app/ApplicationExitInfo#getTraceInputStream()</a> if you want to go direct to your own mothership, and have your own privacy policy in place for such things.)</div><div><br></div><div>but, again, that's aimed at apps.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Bash<br>
will kill itself with SIGSYS after restoring the default signal handler,<br>
so it's up to the parent to catch that exit status and report it, which<br>
termux did. It's not that unusual. You can't count on the user seeing it.<br>
<br>
<br>
<br>
> it might not seem like it from the outsiders (because you only see the <br>
> stuff that _does_ break), but i'm sure as the maintainer of something old <br>
> and widely-used you're well aware that "not breaking everyone's stuff [even <br>
> when it's terrible]" is a large part of the job. (and, ironically, i've <br>
> come to believe that breaking it _loudly and clearly_ when you have to [for <br>
> security, usually] is the least worst option.)<br>
<br>
Backwards compatibility is important, and something in which I put a lot<br>
of value, but you're right, sometimes you have to break it. That's why bash<br>
has its compatibility mode. But it seems like gradually fixing things, or<br>
adding a compatibility mode setting, sometimes only gives people the<br>
opportunity to complain simultaneously about both the problem and the<br>
solution.<br>
<br>
Chet<br>
-- <br>
``The lyf so short, the craft so long to lerne.'' - Chaucer<br>
                 ``Ars longa, vita brevis'' - Hippocrates<br>
Chet Ramey, UTech, CWRU    <a href="mailto:chet@case.edu" target="_blank">chet@case.edu</a>    <a href="http://tiswww.cwru.edu/~chet/" rel="noreferrer" target="_blank">http://tiswww.cwru.edu/~chet/</a><br>
<br>
</blockquote></div></div>