ptrace: clear TDP_USERWR after transparent attach only on attach

The flag indicates that the modifying ptrace op was issued, and clearing
it after transparent attach is needed to not leak the flag to later
operations, since it is cleared on the syscall enter.

But clearing it there unconditionally is too strong.  The clearing
should be only done for attach situation.

Reported by:	Alex S <iwtcex@gmail.com>
Fixes:	9997693427
Reviewed by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D56928
This commit is contained in:
Konstantin Belousov
2026-05-11 04:12:30 +03:00
parent 54d0ae979d
commit cb31a26616
+9 -10
View File
@@ -1411,17 +1411,16 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
* register file or specifying the pc, make the thread
* xstopped by waking it up.
*/
if ((td2->td_dbgflags & TDB_USERWR) != 0) {
if (pt_attach_transparent) {
thread_lock(td2);
if (TD_ON_SLEEPQ(td2) &&
(td2->td_flags & TDF_SINTR) != 0) {
sleepq_abort(td2, EINTR);
} else {
thread_unlock(td2);
}
if ((td2->td_dbgflags & TDB_USERWR) != 0 &&
pt_attach_transparent) {
thread_lock(td2);
if (TD_ON_SLEEPQ(td2) &&
(td2->td_flags & TDF_SINTR) != 0) {
td2->td_dbgflags &= ~TDB_USERWR;
sleepq_abort(td2, EINTR);
} else {
thread_unlock(td2);
}
td2->td_dbgflags &= ~TDB_USERWR;
}
/*