summary refs log tree commit diff stats
path: root/results/classifier/zero-shot/108/other/1729
blob: d17892ed5d6acd176267d65fdfec247c6bb56628 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
performance: 0.884
device: 0.875
graphic: 0.865
network: 0.847
PID: 0.829
socket: 0.801
vnc: 0.769
permissions: 0.765
files: 0.764
boot: 0.616
semantic: 0.563
debug: 0.508
KVM: 0.397
other: 0.235

mremap fails with EFAULT if address range overlaps with stack guard
Description of problem:
When running 32-bit user-static on 64-bit host, `mremap` behave differently from the kernel. This difference let programs that call `pthread_getattr_np` on musl-libc to run into a loop on repeated calling `mremap`.

https://git.musl-libc.org/cgit/musl/plain/src/thread/pthread_getattr_np.c

``` c
		while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
			l += PAGE_SIZE;
```
Steps to reproduce:
Compile the following program against musl-libc arm 32-bit, and run it in qemu-user-static on x86_64 host.

``` c
#define _GNU_SOURCE
#include <pthread.h>

int main(int argc, char *argv[]) {
	pthread_attr_t attr;
	return pthread_getattr_np(pthread_self(), &attr);
}
```

For example, on x86_64 fedora 38 with podman and qemu-user-static installed, we can reproduce this with alpine container:

```
$ podman run --rm -it --arch arm/v7 docker.io/library/alpine:latest

/ # apk add alpine-sdk

......

/ # cat test.c
#define _GNU_SOURCE
#include <pthread.h>

int main(int argc, char *argv[]) {
	pthread_attr_t attr;
	return pthread_getattr_np(pthread_self(), &attr);
}

/ # gcc test.c

/ # ./a.out
```
Additional information:
Original thread on musl mail list where this was initially reported: https://www.openwall.com/lists/musl/2017/06/15/9