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; |