View | Details | Raw Unified | Return to bug 242533 | Differences between
and this patch

Collapse All | Expand All

(-)files/patch-sysdeps_freebsd_procmap.c (-28 / +106 lines)
Lines 1-31 Link Here
1
--- sysdeps/freebsd/procmap.c.orig	2015-08-17 18:59:37 UTC
1
--- sysdeps/freebsd/procmap.c.orig	2017-08-07 18:43:41.000000000 -0400
2
+++ sysdeps/freebsd/procmap.c
2
+++ sysdeps/freebsd/procmap.c	2019-12-17 19:20:59.044661000 -0500
3
@@ -52,6 +52,8 @@
3
@@ -231,6 +231,33 @@
4
 #include <sys/mount.h>
4
         server->sysdeps.proc_map = _glibtop_sysdeps_proc_map;
5
 #include <ufs/ufs/quota.h>
5
 }
6
 #include <ufs/ufs/inode.h>
7
+#include <ufs/ufs/extattr.h>
8
+#include <ufs/ufs/ufsmount.h>
9
 #include <fs/devfs/devfs.h>
10
 #if (__FreeBSD_version >= 600006) || defined(__FreeBSD_kernel__)
11
 #include <fs/devfs/devfs_int.h>
12
@@ -86,6 +88,8 @@ _glibtop_sysdeps_freebsd_dev_inode (glib
13
         struct cdev_priv priv;
14
 #if __FreeBSD_version < 800039
15
         struct cdev si;
16
+#else
17
+        struct ufsmount um;
18
 #endif
19
 
6
 
20
         *inum = 0;
7
+static int
21
@@ -167,7 +171,9 @@ _glibtop_sysdeps_freebsd_dev_inode (glib
8
+vm_map_reader(void *token, vm_map_entry_t addr, vm_map_entry_t dest)
9
+{
10
+	kvm_t kd;
11
+
12
+	kd = (kvm_t *)token;
13
+	return (kvm_read(kd, (gulong)addr, dest, sizeof(*dest)) ==
14
+	    sizeof(*dest));
15
+}
16
+
17
+#if	FREEBSDV<1300062
18
+typedef int vm_map_entry_reader(void *token, vm_map_entry_t addr,
19
+    vm_map_entry_t dest);
20
+
21
+static inline vm_map_entry_t
22
+vm_map_entry_read_succ(void *token, struct vm_map_entry *const clone,
23
+     vm_map_entry_reader reader)
24
+{
25
+	vm_map_entry_t next;
26
+
27
+	next = clone->next;
28
+	if (!reader(token, next, clone))
29
+		return (NULL);
30
+	return (next);
31
+}
32
+#endif	/* FREEBSD<1300062 */
33
+
34
 /* Provides detailed information about a process. */
22
 
35
 
36
 glibtop_map_entry *
37
@@ -238,13 +265,12 @@
38
                         pid_t pid)
39
 {
40
         struct kinfo_proc *pinfo;
41
-        struct vm_map_entry entry, *first;
42
+        struct vm_map_entry entry;
43
         struct vmspace vmspace;
44
         struct vm_object object;
45
         GArray *maps;
46
         struct vnode vnode;
47
-        int count;
48
-        int update = 0;
49
+        int i, count;
23
 
50
 
24
 #if (__FreeBSD_version >= 800039) || (__FreeBSD_kernel_version >= 800039)
51
         memset (buf, 0, sizeof (glibtop_proc_map));
25
-        if (kvm_read (server->machine->kd, (gulong) cdev2priv(inode.i_dev), (char *) &priv,
52
 
26
+        if (kvm_read (server->machine->kd, (gulong) inode.i_ump, (char *) &um,
53
@@ -273,16 +299,6 @@
27
+		      sizeof (um)) != sizeof (um) ||
54
                 return NULL;
28
+            kvm_read (server->machine->kd, (gulong) cdev2priv(um.um_dev), (char *) &priv,
55
         }
29
 		      sizeof (priv))
56
 
30
 #else
57
-        first = vmspace.vm_map.header.next;
31
         if (kvm_read (server->machine->kd, (gulong) inode.i_dev, (char *) &si,
58
-
59
-        if (kvm_read (server->machine->kd,
60
-                        (gulong) vmspace.vm_map.header.next,
61
-                        (char *) &entry, sizeof (entry)) != sizeof (entry)) {
62
-                glibtop_warn_io_r (server, "kvm_read (entry)");
63
-		glibtop_suid_leave (server);
64
-                return NULL;
65
-        }
66
-
67
         /* Walk through the `vm_map_entry' list ... */
68
 
69
         /* I tested this a few times with `mmap'; as soon as you write
70
@@ -292,21 +308,17 @@
71
         maps = g_array_sized_new(FALSE, FALSE, sizeof(glibtop_map_entry),
72
                                  vmspace.vm_map.nentries);
73
 
74
-        do {
75
+	entry = vmspace.vm_map.header;
76
+        for (i = 0; i < vmspace.vm_map.nentries; i++) {
77
                 glibtop_map_entry *mentry;
78
                 guint64 inum, dev;
79
                 guint len;
80
 
81
-                if (update) {
82
-                        if (kvm_read (server->machine->kd,
83
-                                        (gulong) entry.next,
84
-                                        (char *) &entry, sizeof (entry)) != sizeof (entry)) {
85
-                                glibtop_warn_io_r (server, "kvm_read (entry)");
86
-                                continue;
87
-                        }
88
-                } else {
89
-                        update = 1;
90
-                }
91
+		if (!vm_map_entry_read_succ(server->machine->kd, &entry, vm_map_reader)) {
92
+			glibtop_warn_io_r (server, "kvm_read (entry)");
93
+			glibtop_suid_leave (server);
94
+			return NULL;
95
+		}
96
 
97
                 if (entry.eflags & (MAP_ENTRY_IS_SUB_MAP))
98
                         continue;
99
@@ -376,9 +388,7 @@
100
                         mentry->perm |= GLIBTOP_MAP_PERM_WRITE;
101
                 if (entry.protection & VM_PROT_EXECUTE)
102
                         mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE;
103
-
104
-        } while (entry.next != first);
105
-
106
+	}
107
         glibtop_suid_leave (server);
108
 
109
         buf->flags = _glibtop_sysdeps_proc_map;

Return to bug 242533