|
Message-ID: <1501520360.0.593167188853569@go.bunnymail.go> Date: Mon, 31 Jul 2017 22:06:51 +0200 From: felix.winkelmann@...uta.com To: musl@...ts.openwall.com Cc: peter@...e-magic.net Subject: possible bug in setjmp implementation for ppc64 Hi! I think I may have come across a bug in musl on PPC64(le), and the folks on the #musl IRC channel directed me here. I'm not totally sure whether the problem is caused by a my misunderstanding of C library functions or whether it is a plain bug in the musl implementation of setjmp(3). In out project[1] we use setjmp to establish a global trampoline and allocate small objects on the stack using alloca (see [2] for more information about the compiliation strategy used). I was able to reduce the code that crashes to the following: --- #include <stdio.h> #include <alloca.h> #include <setjmp.h> #include <string.h> #include <stdlib.h> jmp_buf jb; int foo = 99; int c = 0; void bar() { c++; longjmp(jb, 1); } int main() { setjmp(jb); char *p = alloca(256); memset(p, 0, 256); printf("%d\n", foo); if(c < 10) bar(); exit(0); } --- When executing the longjmp, the code that restores $r2 (TOC) after the call to setjmp reads invalid data, because the memset apparently clobbered the stack frame - i.e. the pointer returned be alloca points into a part of the stack frame that is still in use. I tried this on arm, x86_64 and ppc64 with glibc and it seems to work fine, but crashes when linked with musl (running Alpine Linux on a VM) If you need more information, please feel free to ask. You can also keep me CC'd, since I'd be interested in knowing more about the details. felix [1] http://www.call-cc.org [2] http://home.pipeline.com/~hbaker1/CheneyMTA.html
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.