diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-07-03 19:39:53 +0200 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-07-03 19:39:53 +0200 |
| commit | dee4dcba78baf712cab403d47d9db319ab7f95d6 (patch) | |
| tree | 418478faf06786701a56268672f73d6b0b4eb239 /results/classifier/111/debug/1876373 | |
| parent | 4d9e26c0333abd39bdbd039dcdb30ed429c475ba (diff) | |
| download | emulator-bug-study-dee4dcba78baf712cab403d47d9db319ab7f95d6.tar.gz emulator-bug-study-dee4dcba78baf712cab403d47d9db319ab7f95d6.zip | |
restructure results
Diffstat (limited to 'results/classifier/111/debug/1876373')
| -rw-r--r-- | results/classifier/111/debug/1876373 | 105 |
1 files changed, 0 insertions, 105 deletions
diff --git a/results/classifier/111/debug/1876373 b/results/classifier/111/debug/1876373 deleted file mode 100644 index 7b44f188..00000000 --- a/results/classifier/111/debug/1876373 +++ /dev/null @@ -1,105 +0,0 @@ -debug: 0.106 -permissions: 0.101 -PID: 0.099 -other: 0.097 -device: 0.094 -semantic: 0.072 -performance: 0.067 -vnc: 0.065 -files: 0.058 -graphic: 0.056 -network: 0.049 -boot: 0.047 -socket: 0.045 -KVM: 0.043 -debug: 0.582 -files: 0.074 -performance: 0.055 -other: 0.050 -semantic: 0.040 -PID: 0.038 -boot: 0.029 -device: 0.024 -network: 0.024 -permissions: 0.023 -graphic: 0.017 -KVM: 0.016 -socket: 0.016 -vnc: 0.012 - -segfault mremap 4096 - -a qemu-hosted process segfaults when the program calls mremap to shrink the size of a buffer to 4096 that was allocated with mmap. See below for a C program to reproduce this issue. I was able to compile this program for both i386 and 32-bit arm, and use qemu-i386 and qemu-arm to reproduce the segfault. If I run the i386 program natively on my x86_64 system, no segfault occurs. Also note that if I change the mremap size to something else such as 12288, no segfault occurs. I also confirmed using qemu's -singlestep debug option that the segfault occurs during the mremap syscall. - -If you save the source below to mremapbug.c, the following should reproduce the issue given you have gcc-multilib: - -gcc -m32 mremapbug.c -# works -./a.out -# segfault -qemu-i386 a.out - -If you can also compile to arm, the same thing happens when running "qemu-arm a.out". I also tried compiling natively and running "qemu-x86_64 a.out" but no segfault in that case, not sure if it's because it is 64-bits or if it was because it was my native target. - - -#define _GNU_SOURCE -#include <stdlib.h> -#include <stdio.h> -#include <sys/mman.h> - -int main(int argc, char *argv[]) -{ - const size_t initial_size = 8192; - - printf("calling mmap, size=%llu\n", (unsigned long long)initial_size); - void *mmap_ptr = mmap(NULL, initial_size, - PROT_READ | PROT_WRITE , - MAP_PRIVATE | MAP_ANONYMOUS, - -1, 0); - printf("mmap returned : %p\n", mmap_ptr); - if (mmap_ptr == MAP_FAILED) { - perror("mmap"); - exit(1); - } - - const size_t new_size = 4096; - printf("calling mremap, size=%llu\n", (unsigned long long)new_size); - void *remap_ptr = mremap(mmap_ptr, initial_size, new_size, 0); - printf("mremap returned: %p\n", remap_ptr); - if (remap_ptr != mmap_ptr) { - perror("mreamap"); - exit(1); - } - printf("Success: pointers match\n"); -} - - -This issue was found while I was pushing code that calls "mremap" to the Zig compiler repository, it's CI testing uses qemu-i386 and qemu-arm to run tests for non-native hosts. I've filed an issue in that repository as well with details on how to reproduce this issue with the Zig compiler as well: https://github.com/ziglang/zig/issues/5245 - -Thanks to @LemonBoy for finding this: - -It looks like this issue my be caused by this chunk of code in linux-user/mmap.c - - if (prot == 0) { - host_addr = mremap(g2h(old_addr), old_size, new_size, flags); - if (host_addr != MAP_FAILED && reserved_va && old_size > new_size) { - mmap_reserve(old_addr + old_size, new_size - old_size); - } - } else { - errno = ENOMEM; - host_addr = MAP_FAILED; - } - -if new_size is less than old_size (which is the case in my example program) then we'll get an integer underflow which would cause a very large value passed to mmap_reserve - -I've submitted a patch, this is my first qemu patch so sorry if I didn't format it correctly: https://lists.gnu.org/archive/html/qemu-trivial/2020-05/msg00000.html - -FYI, first patch in the previous comment was wrong. This new patch is the correct one: https://lists.gnu.org/archive/html/qemu-devel/2020-05/msg00183.html - - -Fix has been included here: -https://git.qemu.org/?p=qemu.git;a=commitdiff;h=257a7e212d5e518ac5 - -Patch has been included here: -https://git.qemu.org/?p=qemu.git;a=commitdiff;h=257a7e212d5e518ac53b - |
