$OpenBSD: patch-sysdeps_openbsd_procmap_c,v 1.15 2014/02/08 10:55:31 ajacoutot Exp $

RM at next release.

--- sysdeps/openbsd/procmap.c.orig	Sat Jul 27 14:40:23 2013
+++ sysdeps/openbsd/procmap.c	Sat Feb  8 11:25:52 2014
@@ -184,7 +184,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
 
 	/* Get the process data */
 	pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, sizeof(struct kinfo_proc), &count);
-	if ((pinfo == NULL) || (count < 1)) {
+	if (pinfo == NULL) {
 		glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid);
 		return (glibtop_map_entry*) g_array_free(maps, TRUE);
 	}
@@ -193,8 +193,11 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
 
 	if (kvm_read (server->machine.kd,
 		      (unsigned long) pinfo [0].p_vmspace,
-		      (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace))
-		glibtop_error_io_r (server, "kvm_read (vmspace)");
+		      (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace)) {
+			glibtop_warn_io_r (server, "kvm_read (vmspace)");
+			glibtop_suid_leave (server);
+			return NULL;
+	}
 
 	RB_INIT(&root);
 	nentries = load_vmmap_entries(server,
@@ -238,6 +241,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
 			      &vnode, sizeof (vnode)) != sizeof (vnode)) {
 			glibtop_warn_io_r (server, "kvm_read (vnode)");
 			unload_vmmap_entries(RB_ROOT(&root));
+			glibtop_suid_leave (server);
 			return (glibtop_map_entry*) g_array_free(maps, TRUE);
 		}
 
@@ -250,8 +254,12 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
 
 		if (kvm_read (server->machine.kd,
 			      (unsigned long) vnode.v_data,
-			      &inode, sizeof (inode)) != sizeof (inode))
-			glibtop_error_io_r (server, "kvm_read (inode)");
+			      &inode, sizeof (inode)) != sizeof (inode)) {
+			glibtop_warn_io_r (server, "kvm_read (inode)");
+			unload_vmmap_entries(RB_ROOT(&root));
+			glibtop_suid_leave (server);
+			return (glibtop_map_entry*) g_array_free(maps, TRUE);
+		}
 
 		inum  = inode.i_number;
 		dev = inode.i_dev;
@@ -277,6 +285,8 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_
 		if (entry->protection & VM_PROT_EXECUTE)
 			mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE;
 	}
+
+	glibtop_suid_leave (server);
 
 	buf->flags = _glibtop_sysdeps_proc_map;
 
