Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/arch/x86_64/sys Fix ptrace %rcx corruption when pth...



details:   https://anonhg.NetBSD.org/src/rev/a8e0a7d53672
branches:  trunk
changeset: 804123:a8e0a7d53672
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Nov 24 15:33:18 2014 +0000

description:
Fix ptrace %rcx corruption when pthread_errno() is used. Small example:
    #include <sys/types.h>
    #include <stdio.h>
    #include <sys/ptrace.h>
    int main(void) { ptrace(18, getpid(), NULL, 0xabcd); }
The -lpthread cases pases 0 instead of 0xabcd

diffstat:

 lib/libc/arch/x86_64/sys/ptrace.S |  13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diffs (40 lines):

diff -r 43646c00569a -r a8e0a7d53672 lib/libc/arch/x86_64/sys/ptrace.S
--- a/lib/libc/arch/x86_64/sys/ptrace.S Mon Nov 24 15:22:59 2014 +0000
+++ b/lib/libc/arch/x86_64/sys/ptrace.S Mon Nov 24 15:33:18 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ptrace.S,v 1.5 2014/05/22 15:01:57 uebayasi Exp $      */
+/*     $NetBSD: ptrace.S,v 1.6 2014/11/24 15:33:18 christos Exp $      */
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -36,7 +36,7 @@
 
 #include <machine/asm.h>
 #if defined(SYSLIBC_SCCS) && !defined(lint)
-       RCSID("$NetBSD: ptrace.S,v 1.5 2014/05/22 15:01:57 uebayasi Exp $")
+       RCSID("$NetBSD: ptrace.S,v 1.6 2014/11/24 15:33:18 christos Exp $")
 #endif /* SYSLIBC_SCCS and not lint */
 
 #include "SYS.h"
@@ -44,12 +44,21 @@
        .globl  _C_LABEL(__errno)
 
 ENTRY(ptrace)
+       /*
+        * The following code calls __errno() to set it to 0 before
+        * calling ptrace(2). The libc version of __errno() does not use
+        * any registers, but the libpthread version clobbers %rcx
+        * before we get a chance to store it in %r10. So we save it
+        * in %r10 and restore it.
+        */
+       movq    %rcx, %r10
 #ifdef __PIC__
        call    PIC_PLT(_C_LABEL(__errno))
 #else
        call    _C_LABEL(__errno)
 #endif /* __PIC__ */
        movl    $0,(%rax)
+       movq    %r10, %rcx
        SYSTRAP(ptrace)
        jc      err
        ret



Home | Main Index | Thread Index | Old Index