Module Name:    src
Committed By:   mgorny
Date:           Thu Oct 15 17:37:36 UTC 2020

Modified Files:
        src/sys/arch/amd64/amd64: process_machdep.c
        src/sys/arch/i386/i386: process_machdep.c
        src/sys/arch/powerpc/include: ptrace.h
        src/sys/arch/powerpc/powerpc: process_machdep.c
        src/sys/arch/sh3/include: ptrace.h
        src/sys/arch/sh3/sh3: process_machdep.c
        src/sys/kern: sys_ptrace_common.c
        src/sys/sys: ptrace.h

Log Message:
Fix the machine-dependent ptrace requests to respect LWP number

Fix the machine-dependent ptrace register-related requests (e.g.
PT_GETXMMREGS, PT_GETXSTATE on x86) to correctly respect the LWP number
passed as the data argument.  Before this change, these requests
did not operate on the requested LWP of a multithreaded program.

This change required moving ptrace_update_lwp() out of unit scope,
and changing ptrace_machdep_dorequest() function to take a pointer
to pointer as the second argument, consistently with ptrace_regs().

I am planning to extend the ATF ptrace() register tests in the future
to check for regressions in multithreaded programs, as time permits.

Reviewed by kamil.


To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/sys/arch/amd64/amd64/process_machdep.c
cvs rdiff -u -r1.94 -r1.95 src/sys/arch/i386/i386/process_machdep.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/powerpc/include/ptrace.h
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/powerpc/powerpc/process_machdep.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/sh3/include/ptrace.h
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/sh3/sh3/process_machdep.c
cvs rdiff -u -r1.83 -r1.84 src/sys/kern/sys_ptrace_common.c
cvs rdiff -u -r1.70 -r1.71 src/sys/sys/ptrace.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/amd64/process_machdep.c
diff -u src/sys/arch/amd64/amd64/process_machdep.c:1.47 src/sys/arch/amd64/amd64/process_machdep.c:1.48
--- src/sys/arch/amd64/amd64/process_machdep.c:1.47	Wed Nov 27 09:16:58 2019
+++ src/sys/arch/amd64/amd64/process_machdep.c	Thu Oct 15 17:37:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.47 2019/11/27 09:16:58 rin Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.48 2020/10/15 17:37:35 mgorny Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.47 2019/11/27 09:16:58 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.48 2020/10/15 17:37:35 mgorny Exp $");
 
 #include "opt_xen.h"
 #include <sys/param.h>
@@ -307,7 +307,7 @@ process_machdep_write_xstate(struct lwp 
 int
 ptrace_machdep_dorequest(
     struct lwp *l,
-    struct lwp *lt,
+    struct lwp **lt,
     int req,
     void *addr,
     int data
@@ -326,7 +326,9 @@ ptrace_machdep_dorequest(
 		/* FALLTHROUGH */
 	case PT_GETXSTATE:
 		/* write = false done above. */
-		if (!process_machdep_validfpu(lt->l_proc))
+		if ((error = ptrace_update_lwp((*lt)->l_proc, lt, data)) != 0)
+			return error;
+		if (!process_machdep_validfpu((*lt)->l_proc))
 			return EINVAL;
 		if (__predict_false(l->l_proc->p_flag & PK_32)) {
 			struct netbsd32_iovec user_iov;
@@ -357,7 +359,7 @@ ptrace_machdep_dorequest(
 		uio.uio_resid = iov.iov_len;
 		uio.uio_rw = write ? UIO_WRITE : UIO_READ;
 		uio.uio_vmspace = vm;
-		error = process_machdep_doxstate(l, lt, &uio);
+		error = process_machdep_doxstate(l, *lt, &uio);
 		uvmspace_free(vm);
 		return error;
 
@@ -367,8 +369,10 @@ ptrace_machdep_dorequest(
 		/* FALLTHROUGH */
 	case PT_GETXMMREGS:		/* only for COMPAT_NETBSD32 */
 		/* write = false done above. */
+		if ((error = ptrace_update_lwp((*lt)->l_proc, lt, data)) != 0)
+			return error;
 		MODULE_HOOK_CALL(netbsd32_process_doxmmregs_hook,
-		    (l, lt, addr, write), EINVAL, error);
+		    (l, *lt, addr, write), EINVAL, error);
 		return error;
 	}
 

Index: src/sys/arch/i386/i386/process_machdep.c
diff -u src/sys/arch/i386/i386/process_machdep.c:1.94 src/sys/arch/i386/i386/process_machdep.c:1.95
--- src/sys/arch/i386/i386/process_machdep.c:1.94	Tue Aug  6 02:04:43 2019
+++ src/sys/arch/i386/i386/process_machdep.c	Thu Oct 15 17:37:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.94 2019/08/06 02:04:43 kamil Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.95 2020/10/15 17:37:35 mgorny Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.94 2019/08/06 02:04:43 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.95 2020/10/15 17:37:35 mgorny Exp $");
 
 #include "opt_ptrace.h"
 
@@ -273,7 +273,7 @@ process_machdep_write_xmmregs(struct lwp
 int
 ptrace_machdep_dorequest(
     struct lwp *l,
-    struct lwp *lt,
+    struct lwp **lt,
     int req,
     void *addr,
     int data
@@ -293,7 +293,9 @@ ptrace_machdep_dorequest(
 		/* FALLTHROUGH */
 	case PT_GETXMMREGS:
 		/* write = 0 done above. */
-		if (!process_machdep_validxmmregs(lt->l_proc))
+		if ((error = ptrace_update_lwp((*lt)->l_proc, lt, data)) != 0)
+			return error;
+		if (!process_machdep_validxmmregs((*lt)->l_proc))
 			return (EINVAL);
 		error = proc_vmspace_getref(l->l_proc, &vm);
 		if (error) {
@@ -307,7 +309,7 @@ ptrace_machdep_dorequest(
 		uio.uio_resid = sizeof(struct xmmregs);
 		uio.uio_rw = write ? UIO_WRITE : UIO_READ;
 		uio.uio_vmspace = vm;
-		error = process_machdep_doxmmregs(l, lt, &uio);
+		error = process_machdep_doxmmregs(l, *lt, &uio);
 		uvmspace_free(vm);
 		return error;
 
@@ -317,7 +319,9 @@ ptrace_machdep_dorequest(
 		/* FALLTHROUGH */
 	case PT_GETXSTATE:
 		/* write = 0 done above. */
-		if (!process_machdep_validxstate(lt->l_proc))
+		if ((error = ptrace_update_lwp((*lt)->l_proc, lt, data)) != 0)
+			return error;
+		if (!process_machdep_validxstate((*lt)->l_proc))
 			return EINVAL;
 		if ((error = copyin(addr, &user_iov, sizeof(user_iov))) != 0)
 			return error;
@@ -335,7 +339,7 @@ ptrace_machdep_dorequest(
 		uio.uio_resid = iov.iov_len;
 		uio.uio_rw = write ? UIO_WRITE : UIO_READ;
 		uio.uio_vmspace = vm;
-		error = process_machdep_doxstate(l, lt, &uio);
+		error = process_machdep_doxstate(l, *lt, &uio);
 		uvmspace_free(vm);
 		return error;
 	}

Index: src/sys/arch/powerpc/include/ptrace.h
diff -u src/sys/arch/powerpc/include/ptrace.h:1.17 src/sys/arch/powerpc/include/ptrace.h:1.18
--- src/sys/arch/powerpc/include/ptrace.h:1.17	Sun Jun 21 00:39:59 2020
+++ src/sys/arch/powerpc/include/ptrace.h	Thu Oct 15 17:37:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.h,v 1.17 2020/06/21 00:39:59 rin Exp $	*/
+/*	$NetBSD: ptrace.h,v 1.18 2020/10/15 17:37:35 mgorny Exp $	*/
 
 #ifndef _POWERPC_PTRACE_H
 #define	_POWERPC_PTRACE_H
@@ -41,7 +41,7 @@
 	case PT_GETVECREGS: \
 	case PT_SETVECREGS:
 
-int ptrace_machdep_dorequest(struct lwp *, struct lwp *, int, void *, int);
+int ptrace_machdep_dorequest(struct lwp *, struct lwp **, int, void *, int);
 int process_machdep_dovecregs(struct lwp *, struct lwp *, struct uio *);
 int process_machdep_validvecregs(struct proc *);
 

Index: src/sys/arch/powerpc/powerpc/process_machdep.c
diff -u src/sys/arch/powerpc/powerpc/process_machdep.c:1.39 src/sys/arch/powerpc/powerpc/process_machdep.c:1.40
--- src/sys/arch/powerpc/powerpc/process_machdep.c:1.39	Mon Jul  6 09:34:18 2020
+++ src/sys/arch/powerpc/powerpc/process_machdep.c	Thu Oct 15 17:37:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.39 2020/07/06 09:34:18 rin Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.40 2020/10/15 17:37:36 mgorny Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.39 2020/07/06 09:34:18 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.40 2020/10/15 17:37:36 mgorny Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_altivec.h"
@@ -188,7 +188,7 @@ process_machdep_write_vecregs(struct lwp
 }
 
 int
-ptrace_machdep_dorequest(struct lwp *l, struct lwp *lt,
+ptrace_machdep_dorequest(struct lwp *l, struct lwp **lt,
 	int req, void *addr, int data)
 {
 	struct uio uio;
@@ -201,7 +201,9 @@ ptrace_machdep_dorequest(struct lwp *l, 
 
 	case PT_GETVECREGS:
 		/* write = 0 done above. */
-		if (!process_machdep_validvecregs(lt->l_proc))
+		if ((error = ptrace_update_lwp((*lt)->l_proc, lt, data)) != 0)
+			return error;
+		if (!process_machdep_validvecregs((*lt)->l_proc))
 			return (EINVAL);
 		iov.iov_base = addr;
 		iov.iov_len = sizeof(struct vreg);
@@ -211,7 +213,7 @@ ptrace_machdep_dorequest(struct lwp *l, 
 		uio.uio_resid = sizeof(struct vreg);
 		uio.uio_rw = write ? UIO_WRITE : UIO_READ;
 		uio.uio_vmspace = l->l_proc->p_vmspace;
-		return process_machdep_dovecregs(l, lt, &uio);
+		return process_machdep_dovecregs(l, *lt, &uio);
 	}
 
 #ifdef DIAGNOSTIC

Index: src/sys/arch/sh3/include/ptrace.h
diff -u src/sys/arch/sh3/include/ptrace.h:1.18 src/sys/arch/sh3/include/ptrace.h:1.19
--- src/sys/arch/sh3/include/ptrace.h:1.18	Mon Sep 14 05:04:05 2020
+++ src/sys/arch/sh3/include/ptrace.h	Thu Oct 15 17:37:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.h,v 1.18 2020/09/14 05:04:05 mrg Exp $	*/
+/*	$NetBSD: ptrace.h,v 1.19 2020/10/15 17:37:36 mgorny Exp $	*/
 
 /*
  * Copyright (c) 1993 Christopher G. Demetriou
@@ -95,7 +95,7 @@
 #endif /* COMPAT_40 */
 
 #ifdef __HAVE_PTRACE_MACHDEP
-int ptrace_machdep_dorequest(struct lwp *, struct lwp *, int, void *, int);
+int ptrace_machdep_dorequest(struct lwp *, struct lwp **, int, void *, int);
 #endif
 
 #define PTRACE_LWP_GETPRIVATE(l) (l)->l_md.md_regs->tf_gbr

Index: src/sys/arch/sh3/sh3/process_machdep.c
diff -u src/sys/arch/sh3/sh3/process_machdep.c:1.22 src/sys/arch/sh3/sh3/process_machdep.c:1.23
--- src/sys/arch/sh3/sh3/process_machdep.c:1.22	Wed Nov 20 19:37:52 2019
+++ src/sys/arch/sh3/sh3/process_machdep.c	Thu Oct 15 17:37:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.22 2019/11/20 19:37:52 pgoyette Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.23 2020/10/15 17:37:36 mgorny Exp $	*/
 
 /*
  * Copyright (c) 1993 The Regents of the University of California.
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.22 2019/11/20 19:37:52 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.23 2020/10/15 17:37:36 mgorny Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -183,7 +183,7 @@ process_write_regs(struct lwp *l, const 
 #ifdef __HAVE_PTRACE_MACHDEP
 
 int
-ptrace_machdep_dorequest(struct lwp *l, struct lwp *lt,
+ptrace_machdep_dorequest(struct lwp *l, struct lwp **lt,
 			 int req, void *addr, int data)
 {
 	struct uio uio;
@@ -200,7 +200,9 @@ ptrace_machdep_dorequest(struct lwp *l, 
 		/* FALLTHROUGH*/
 
 	case PT___GETREGS40:
-		if (!process_validregs(lt))
+		if ((error = ptrace_update_lwp((*lt)->l_proc, lt, data)) != 0)
+			return error;
+		if (!process_validregs(*lt))
 			return EINVAL;
 		iov.iov_base = addr;
 		iov.iov_len = sizeof(struct __reg40);
@@ -210,7 +212,7 @@ ptrace_machdep_dorequest(struct lwp *l, 
 		uio.uio_resid = sizeof(struct __reg40);
 		uio.uio_rw = write ? UIO_WRITE : UIO_READ;
 		uio.uio_vmspace = l->l_proc->p_vmspace;
-		return process_machdep_doregs40(l, lt, &uio);
+		return process_machdep_doregs40(l, *lt, &uio);
 #endif	/* COMPAT_40 */
 	}
 }

Index: src/sys/kern/sys_ptrace_common.c
diff -u src/sys/kern/sys_ptrace_common.c:1.83 src/sys/kern/sys_ptrace_common.c:1.84
--- src/sys/kern/sys_ptrace_common.c:1.83	Sat May 30 08:41:22 2020
+++ src/sys/kern/sys_ptrace_common.c	Thu Oct 15 17:37:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_ptrace_common.c,v 1.83 2020/05/30 08:41:22 maxv Exp $	*/
+/*	$NetBSD: sys_ptrace_common.c,v 1.84 2020/10/15 17:37:36 mgorny Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -118,7 +118,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.83 2020/05/30 08:41:22 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.84 2020/10/15 17:37:36 mgorny Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ptrace.h"
@@ -565,7 +565,7 @@ ptrace_needs_hold(int req)
 	}
 }
 
-static int
+int
 ptrace_update_lwp(struct proc *t, struct lwp **lt, lwpid_t lid)
 {
 	if (lid == 0 || lid == (*lt)->l_lid || t->p_nlwps == 1)
@@ -1569,7 +1569,7 @@ do_ptrace(struct ptrace_methods *ptm, st
 
 #ifdef __HAVE_PTRACE_MACHDEP
 	PTRACE_MACHDEP_REQUEST_CASES
-		error = ptrace_machdep_dorequest(l, lt, req, addr, data);
+		error = ptrace_machdep_dorequest(l, &lt, req, addr, data);
 		break;
 #endif
 	}

Index: src/sys/sys/ptrace.h
diff -u src/sys/sys/ptrace.h:1.70 src/sys/sys/ptrace.h:1.71
--- src/sys/sys/ptrace.h:1.70	Thu May 14 13:32:15 2020
+++ src/sys/sys/ptrace.h	Thu Oct 15 17:37:36 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.h,v 1.70 2020/05/14 13:32:15 kamil Exp $	*/
+/*	$NetBSD: ptrace.h,v 1.71 2020/10/15 17:37:36 mgorny Exp $	*/
 
 /*-
  * Copyright (c) 1984, 1993
@@ -243,6 +243,7 @@ struct ptrace_methods {
 
 int	ptrace_init(void);
 int	ptrace_fini(void);
+int	ptrace_update_lwp(struct proc *t, struct lwp **lt, lwpid_t lid);
 void	ptrace_hooks(void);
 
 int	process_doregs(struct lwp *, struct lwp *, struct uio *);
@@ -337,7 +338,7 @@ int	process_write_regs(struct lwp *, con
 #endif
 #endif
 
-int	ptrace_machdep_dorequest(struct lwp *, struct lwp *, int,
+int	ptrace_machdep_dorequest(struct lwp *, struct lwp **, int,
 	    void *, int);
 
 #ifndef FIX_SSTEP

Reply via email to