|
7 | 7 | //
|
8 | 8 | //===----------------------------------------------------------------------===//
|
9 | 9 | //
|
10 |
| -// Information about the process mappings (FreeBSD-specific parts). |
| 10 | +// Information about the process mappings (FreeBSD and NetBSD-specific parts). |
11 | 11 | //===----------------------------------------------------------------------===//
|
12 | 12 |
|
13 | 13 | #include "sanitizer_platform.h"
|
14 |
| -#if SANITIZER_FREEBSD |
| 14 | +#if SANITIZER_FREEBSD || SANITIZER_NETBSD |
15 | 15 | #include "sanitizer_common.h"
|
| 16 | +#if SANITIZER_FREEBSD |
16 | 17 | #include "sanitizer_freebsd.h"
|
| 18 | +#endif |
17 | 19 | #include "sanitizer_procmaps.h"
|
18 | 20 |
|
19 | 21 | #include <unistd.h>
|
20 | 22 | #include <sys/sysctl.h>
|
| 23 | +#if SANITIZER_FREEBSD |
21 | 24 | #include <sys/user.h>
|
| 25 | +#endif |
22 | 26 |
|
23 | 27 | // Fix 'kinfo_vmentry' definition on FreeBSD prior v9.2 in 32-bit mode.
|
24 | 28 | #if SANITIZER_FREEBSD && (SANITIZER_WORDSIZE == 32)
|
|
31 | 35 | namespace __sanitizer {
|
32 | 36 |
|
33 | 37 | void ReadProcMaps(ProcSelfMapsBuff *proc_maps) {
|
34 |
| - const int Mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid() }; |
| 38 | + const int Mib[] = { |
| 39 | +#if SANITIZER_FREEBSD |
| 40 | + CTL_KERN, |
| 41 | + KERN_PROC, |
| 42 | + KERN_PROC_VMMAP, |
| 43 | + getpid() |
| 44 | +#else |
| 45 | + CTL_VM, |
| 46 | + VM_PROC, |
| 47 | + VM_PROC_MAP, |
| 48 | + getpid(), |
| 49 | + sizeof(struct kinfo_vmentry) |
| 50 | +#endif |
| 51 | + }; |
| 52 | + |
35 | 53 | size_t Size = 0;
|
36 |
| - int Err = sysctl(Mib, 4, NULL, &Size, NULL, 0); |
| 54 | + int Err = sysctl(Mib, ARRAY_SIZE(Mib), NULL, &Size, NULL, 0); |
37 | 55 | CHECK_EQ(Err, 0);
|
38 | 56 | CHECK_GT(Size, 0);
|
39 | 57 |
|
40 | 58 | size_t MmapedSize = Size * 4 / 3;
|
41 | 59 | void *VmMap = MmapOrDie(MmapedSize, "ReadProcMaps()");
|
42 | 60 | Size = MmapedSize;
|
43 |
| - Err = sysctl(Mib, 4, VmMap, &Size, NULL, 0); |
| 61 | + Err = sysctl(Mib, ARRAY_SIZE(Mib), VmMap, &Size, NULL, 0); |
44 | 62 | CHECK_EQ(Err, 0);
|
45 | 63 |
|
46 | 64 | proc_maps->data = (char*)VmMap;
|
@@ -71,11 +89,15 @@ bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {
|
71 | 89 | VmEntry->kve_path);
|
72 | 90 | }
|
73 | 91 |
|
| 92 | +#if SANITIZER_FREEBSD |
74 | 93 | current_ += VmEntry->kve_structsize;
|
| 94 | +#else |
| 95 | + current_ += sizeof(*VmEntry); |
| 96 | +#endif |
75 | 97 |
|
76 | 98 | return true;
|
77 | 99 | }
|
78 | 100 |
|
79 | 101 | } // namespace __sanitizer
|
80 | 102 |
|
81 |
| -#endif // SANITIZER_FREEBSD |
| 103 | +#endif // SANITIZER_FREEBSD || SANITIZER_NETBSD |
0 commit comments