The branch main has been updated by dchagin:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=fe894a370556e5b173a8893cdcde6323ff79cc57

commit fe894a370556e5b173a8893cdcde6323ff79cc57
Author:     Dmitry Chagin <[email protected]>
AuthorDate: 2022-04-25 07:21:51 +0000
Commit:     Dmitry Chagin <[email protected]>
CommitDate: 2022-04-25 07:21:51 +0000

    linux(4): Check that the thread tid in the thread group pid in 
linux_tdfind().
    
    MFC after:              2 weeks
---
 sys/compat/linux/linux_misc.c | 48 +++++++++++++++++++++----------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 0579ac1a03ce..252c6e0737c0 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -2710,34 +2710,34 @@ linux_tdfind(struct thread *td, lwpid_t tid, pid_t pid)
 
        tdt = NULL;
        if (tid == 0 || tid == td->td_tid) {
-               tdt = td;
-               PROC_LOCK(tdt->td_proc);
+               if (pid != -1 && td->td_proc->p_pid != pid)
+                       return (NULL);
+               PROC_LOCK(td->td_proc);
+               return (td);
        } else if (tid > PID_MAX)
-               tdt = tdfind(tid, pid);
-       else {
-               /*
-                * Initial thread where the tid equal to the pid.
-                */
-               p = pfind(tid);
-               if (p != NULL) {
-                       if (SV_PROC_ABI(p) != SV_ABI_LINUX) {
-                               /*
-                                * p is not a Linuxulator process.
-                                */
-                               PROC_UNLOCK(p);
-                               return (NULL);
-                       }
-                       FOREACH_THREAD_IN_PROC(p, tdt) {
-                               em = em_find(tdt);
-                               if (tid == em->em_tid)
-                                       return (tdt);
-                       }
+               return (tdfind(tid, pid));
+
+       /*
+        * Initial thread where the tid equal to the pid.
+        */
+       p = pfind(tid);
+       if (p != NULL) {
+               if (SV_PROC_ABI(p) != SV_ABI_LINUX ||
+                   (pid != -1 && tid != pid)) {
+                       /*
+                        * p is not a Linuxulator process.
+                        */
                        PROC_UNLOCK(p);
+                       return (NULL);
                }
-               return (NULL);
+               FOREACH_THREAD_IN_PROC(p, tdt) {
+                       em = em_find(tdt);
+                       if (tid == em->em_tid)
+                               return (tdt);
+               }
+               PROC_UNLOCK(p);
        }
-
-       return (tdt);
+       return (NULL);
 }
 
 void

Reply via email to