Module Name:    src
Committed By:   martin
Date:           Mon Dec 18 14:06:44 UTC 2023

Modified Files:
        src/external/bsd/top/dist/machine [netbsd-10]: m_netbsd.c

Log Message:
Pull up following revision(s) (requested by mrg in ticket #502):

        external/bsd/top/dist/machine/m_netbsd.c: revision 1.29

avoid crashes when proc_from_thread() returns NULL.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.26.2.1 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.26 src/external/bsd/top/dist/machine/m_netbsd.c:1.26.2.1
--- src/external/bsd/top/dist/machine/m_netbsd.c:1.26	Fri Jul 15 06:39:06 2022
+++ src/external/bsd/top/dist/machine/m_netbsd.c	Mon Dec 18 14:06:44 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: m_netbsd.c,v 1.26 2022/07/15 06:39:06 mrg Exp $	*/
+/*	$NetBSD: m_netbsd.c,v 1.26.2.1 2023/12/18 14:06:44 martin Exp $	*/
 
 /*
  * top - a top users display for Unix
@@ -37,12 +37,12 @@
  *		Andrew Doran <a...@netbsd.org>
  *
  *
- * $Id: m_netbsd.c,v 1.26 2022/07/15 06:39:06 mrg Exp $
+ * $Id: m_netbsd.c,v 1.26.2.1 2023/12/18 14:06:44 martin Exp $
  */
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: m_netbsd.c,v 1.26 2022/07/15 06:39:06 mrg Exp $");
+__RCSID("$NetBSD: m_netbsd.c,v 1.26.2.1 2023/12/18 14:06:44 martin Exp $");
 #endif
 
 #include <sys/param.h>
@@ -762,18 +762,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++;
 			}
 		}
 	}
@@ -1152,6 +1154,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;
@@ -1169,6 +1173,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;
@@ -1186,6 +1192,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