Module Name: src Committed By: mrg Date: Thu Dec 14 07:18:44 UTC 2023
Modified Files: src/external/bsd/top/dist/machine: m_netbsd.c Log Message: avoid crashes when proc_from_thread() returns NULL. XXX: pullup-10, ... To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/external/bsd/top/dist/machine/m_netbsd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/top/dist/machine/m_netbsd.c diff -u src/external/bsd/top/dist/machine/m_netbsd.c:1.28 src/external/bsd/top/dist/machine/m_netbsd.c:1.29 --- src/external/bsd/top/dist/machine/m_netbsd.c:1.28 Sun Oct 22 14:44:09 2023 +++ src/external/bsd/top/dist/machine/m_netbsd.c Thu Dec 14 07:18:44 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: m_netbsd.c,v 1.28 2023/10/22 14:44:09 simonb Exp $ */ +/* $NetBSD: m_netbsd.c,v 1.29 2023/12/14 07:18:44 mrg Exp $ */ /* * top - a top users display for Unix @@ -45,12 +45,12 @@ * Andrew Doran <a...@netbsd.org> * * - * $Id: m_netbsd.c,v 1.28 2023/10/22 14:44:09 simonb Exp $ + * $Id: m_netbsd.c,v 1.29 2023/12/14 07:18:44 mrg Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: m_netbsd.c,v 1.28 2023/10/22 14:44:09 simonb Exp $"); +__RCSID("$NetBSD: m_netbsd.c,v 1.29 2023/12/14 07:18:44 mrg Exp $"); #endif #include <sys/param.h> @@ -825,18 +825,20 @@ get_lwp_info(struct system_info *si, str * status field. threads with L_SYSTEM set are system * threads---these get ignored unless show_sysprocs is set. */ - if (lp->l_stat != 0 && (show_system || ((lp->l_flag & LW_SYSTEM) == 0))) { + if (lp->l_stat != 0 && + (show_system || ((lp->l_flag & LW_SYSTEM) == 0))) { total_lwps++; process_states[(unsigned char) lp->l_stat]++; if (lp->l_stat != LSZOMB && (show_idle || (lp->l_pctcpu != 0) || - (lp->l_stat == LSRUN || lp->l_stat == LSONPROC)) && + (lp->l_stat == LSRUN || lp->l_stat == LSONPROC)) && (!show_uid || uid_from_thread(lp) == sel->uid) && (!show_command || - strstr(get_command(sel, proc_from_thread(lp)), - show_command) != NULL)) { - *lrefp++ = lp; - active_lwps++; + ((pp = proc_from_thread(lp)) != NULL && + strstr(get_command(sel, pp), + show_command) != NULL))) { + *lrefp++ = lp; + active_lwps++; } } } @@ -1215,6 +1217,8 @@ compare_pid(pp1, pp2) struct kinfo_lwp *l2 = *(struct kinfo_lwp **) pp2; struct kinfo_proc2 *p1 = proc_from_thread(l1); struct kinfo_proc2 *p2 = proc_from_thread(l2); + if (p1 == NULL || p2 == NULL) + return -1; return p2->p_pid - p1->p_pid; } else { struct kinfo_proc2 *p1 = *(struct kinfo_proc2 **) pp1; @@ -1232,6 +1236,8 @@ compare_command(pp1, pp2) struct kinfo_lwp *l2 = *(struct kinfo_lwp **) pp2; struct kinfo_proc2 *p1 = proc_from_thread(l1); struct kinfo_proc2 *p2 = proc_from_thread(l2); + if (p1 == NULL || p2 == NULL) + return -1; return strcmp(p2->p_comm, p1->p_comm); } else { struct kinfo_proc2 *p1 = *(struct kinfo_proc2 **) pp1; @@ -1249,6 +1255,8 @@ compare_username(pp1, pp2) struct kinfo_lwp *l2 = *(struct kinfo_lwp **) pp2; struct kinfo_proc2 *p1 = proc_from_thread(l1); struct kinfo_proc2 *p2 = proc_from_thread(l2); + if (p1 == NULL || p2 == NULL) + return -1; return strcmp(p2->p_login, p1->p_login); } else { struct kinfo_proc2 *p1 = *(struct kinfo_proc2 **) pp1;