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;

Reply via email to