Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Sun, 3 Dec 2017 11:50:34 +0100
From: bluemoon <blaumolch@...lbox.org>
To: musl@...ts.openwall.com
Subject: Problems that emerged when trying to port dosemu2

Hi,

I was trying to build dosemu2 (https://github.com/stsp/dosemu2) and ran
into some problems which I reported to the developer of dosemu2. He
found two issues which might be relevant to musl itself so I’d like to
report them.

The starting point was that dosemu2 crashed when trying to use DPMI to run
protected mode DOS programs. The Issue was discussed here:
https://github.com/stsp/dosemu2/issues/537
The last comments are the ones of relevance.

My knowledge of the matter is too limited to explain it in my own words, but
he summarized what’s going on here (patches are below):
https://github.com/stsp/dosemu2/issues/537#issuecomment-346177776

> The checks that you remove, are nonsense:
> they check for "ss_size" and return ENOMEM
> even for SS_DISABLE. They check for ~SS_DISABLE
> and return error for SS_AUTODISARM, even
> though it is defined in their headers. Overall
> they try to check the syscall parameters -
> something they should never do simply because
> libc does not understand the syscall parameters.
> It should just call the syscall - not more, not less.
> syscall understands its parameters, so it will
> check them correctly and return error as appropriate.
> Check from musl should be removed, and I think
> it would be good to try to submit that change.
>
> Stack-protector problem is a kernel mis-feature,
> and a very unfortunate one. We should pester
> Andy Lutomirski (@amluto) to finally fix it. :)
> I don't know if musl can accept this patch, maybe
> it can if the attribute is put under #ifdef __GNUC__
> check.

To make it work the following two patches were applied:

--- src/misc/syscall.c.orig     2017-10-31 20:13:58.000000000 +0100
+++ src/misc/syscall.c  2017-11-21 18:36:38.912082672 +0100
@@ -3,7 +3,7 @@

 #undef syscall

-long syscall(long n, ...)
+__attribute__((optimize("no-stack-protector"))) long syscall(long n, ...)
 {
        va_list ap;
        syscall_arg_t a,b,c,d,e,f;

--- src/signal/sigaltstack.c.orig       2017-10-31 20:13:58.000000000 +0100
+++ src/signal/sigaltstack.c    2017-11-21 20:56:59.740814704 +0100
@@ -4,15 +4,5 @@

 int sigaltstack(const stack_t *restrict ss, stack_t *restrict old)
 {
-       if (ss) {
-               if (ss->ss_size < MINSIGSTKSZ) {
-                       errno = ENOMEM;
-                       return -1;
-               }
-               if (ss->ss_flags & ~SS_DISABLE) {
-                       errno = EINVAL;
-                       return -1;
-               }
-       }
        return syscall(SYS_sigaltstack, ss, old);
 }

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.