From patchwork Sun Jan 15 12:36:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helge Deller X-Patchwork-Id: 18905 Received: (qmail 43428 invoked by alias); 15 Jan 2017 12:37:29 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 43417 invoked by uid 89); 15 Jan 2017 12:37:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=unavailable version=3.3.2 spammy= X-HELO: mout.gmx.net Date: Sun, 15 Jan 2017 13:36:29 +0100 From: Helge Deller To: libc-alpha@sourceware.org Cc: Carlos O'Donell , Mike Frysinger , Aurelien Jarno , John David Anglin Subject: [PATCH] Fix crash in __longjmp on hppa architecture (BZ #21049) Message-ID: <20170115123629.GA12030@ls3530> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.7.1 (2016-10-04) X-UI-Out-Filterresults: notjunk:1; V01:K0:TnTWs+zeWO8=:kS39YzUJLYkdCTbMYkV4Jj uz5v8X02R8//zcOxuUI7cXnzNPDTzqGFdEVj2KLzXquLg9zF9tHZlsN7Ckq/OCtqtmHzN3xO7 ZnLsXr2BZhCNNlhfN1RPBmR/bBlD94bQ7NC9DiiR5mA4dU4jhBP3Wp4xLg/xKIHpEDi3CNBBX UtJKFRgRwFulSAgxKjCcHG1jZ2YbBj3U+31duqyO3IffZoiGRDs8gqEeBiNzdm9h8rvtqzt88 T1O+oNqz9AYFylr83CbKpllZtxSVYtuEzhtXDWzkIdxQozYLibdbmY+YMkbWxXwGXN+QIAMDY SZdA6KabJ5YuTdYoTiifv9JJd/RBWokMbO5+N357O9uIhIhGVxAORSJ/Eq3cPaeMdUFiabEPV iVX5aH185SuTvYaeH47r2cmkgpBYc8mTf/ButsRIkHgOwf0SJDKTF6kPKFjxvhaRIMZvqE4mC 1GQUSogCJM3GL3m50mDglpYTDLtVSLa/W4uL/kjvwwdcYSI3plr6mz8Mv/Cik7yCqR5DIkMul u8PNsXvcxtjLqewzFiwp+ReS9cKv6ltuhr5Vtl611z+ZXuZajADkTgOS/L0pWwdK6HDZwea4P vOmPfowQRT0EGUBh6RizTLFtC6RG4V4WnTfMs+cawc1b0f+KPPoQL6k1b39b4UYYS8a1FbbSj pNCxXDCEH2kpuz+4Djs9ZWNTFIxDYwquw+CS6audDLZ/9DghRzSH3sC5dXrR240iFqd9ykbkC 02PkDY+dXQXf13rNLkJKTgW4YT6QWQAxgMuVhAAzNhkExo2nJN3/RpP7akc4mmVNRJb2T/uow 1AaC/W7KyqfLVK4Vdxqg/HeMSwrWJ3KWC1Bkq7c0Gi37aj7sMXkWO0Y5jxtoDmXugM52ln8 This fixes a crash in __longjmp on the hppa architecture which happens if the new sigaltstack is above the current stack. In that case CHECK_SP() does an INTERNAL_SYSCALL which clobbers %r26. Fix this issue by calling CHECK_SP before assigning the local register variables r26 and r25. The bug exists in all glibc versions and is triggered by running the GNU forth compiler. I don't have write access, so somebody should commit this for me. Thanks. ChangeLog: 2017-01-15 Helge Deller [BZ #21049] * sysdeps/hppa/__longjmp.c (__longjmp): Move call to CHECK_SP up to avoid clobbering r26. diff -up ./sysdeps/hppa/__longjmp.c.org ./sysdeps/hppa/__longjmp.c --- ./sysdeps/hppa/__longjmp.c.org 2017-01-13 10:45:24.180424626 +0100 +++ ./sysdeps/hppa/__longjmp.c 2017-01-13 10:47:41.720409134 +0100 @@ -24,15 +24,16 @@ void __longjmp (__jmp_buf env, int val) { +#ifdef CHECK_SP + CHECK_SP (env[0].__jmp_buf.__sp); +#endif + + { /* We must use one of the non-callee saves registers for env. */ register unsigned long r26 asm ("r26") = (unsigned long)&env[0]; register unsigned long r25 asm ("r25") = (unsigned long)(val == 0 ? 1 : val); -#ifdef CHECK_SP - CHECK_SP (env[0].__jmp_buf.__sp); -#endif - asm volatile( /* Set return value. */ "copy %0, %%r28\n\t" @@ -79,6 +80,8 @@ __longjmp (__jmp_buf env, int val) : /* No outputs. */ : "r" (r25), "r" (r26) : /* No point in clobbers. */ ); + } + /* Avoid `volatile function does return' warnings. */ for (;;); }