annotate libsanitizer/sanitizer_common/sanitizer_procmaps_linux.cc @ 118:fd00160c1b76

ifdef TARGET_64BIT
author mir3636
date Tue, 27 Feb 2018 15:01:35 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 //===-- sanitizer_procmaps_linux.cc ---------------------------------------===//
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // This file is distributed under the University of Illinois Open Source
kono
parents:
diff changeset
4 // License. See LICENSE.TXT for details.
kono
parents:
diff changeset
5 //
kono
parents:
diff changeset
6 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
7 //
kono
parents:
diff changeset
8 // Information about the process mappings (Linux-specific parts).
kono
parents:
diff changeset
9 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 #include "sanitizer_platform.h"
kono
parents:
diff changeset
12 #if SANITIZER_LINUX
kono
parents:
diff changeset
13 #include "sanitizer_common.h"
kono
parents:
diff changeset
14 #include "sanitizer_procmaps.h"
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 namespace __sanitizer {
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 void ReadProcMaps(ProcSelfMapsBuff *proc_maps) {
kono
parents:
diff changeset
19 ReadFileToBuffer("/proc/self/maps", &proc_maps->data, &proc_maps->mmaped_size,
kono
parents:
diff changeset
20 &proc_maps->len);
kono
parents:
diff changeset
21 }
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 static bool IsOneOf(char c, char c1, char c2) {
kono
parents:
diff changeset
24 return c == c1 || c == c2;
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {
kono
parents:
diff changeset
28 char *last = data_.proc_self_maps.data + data_.proc_self_maps.len;
kono
parents:
diff changeset
29 if (data_.current >= last) return false;
kono
parents:
diff changeset
30 char *next_line =
kono
parents:
diff changeset
31 (char *)internal_memchr(data_.current, '\n', last - data_.current);
kono
parents:
diff changeset
32 if (next_line == 0)
kono
parents:
diff changeset
33 next_line = last;
kono
parents:
diff changeset
34 // Example: 08048000-08056000 r-xp 00000000 03:0c 64593 /foo/bar
kono
parents:
diff changeset
35 segment->start = ParseHex(&data_.current);
kono
parents:
diff changeset
36 CHECK_EQ(*data_.current++, '-');
kono
parents:
diff changeset
37 segment->end = ParseHex(&data_.current);
kono
parents:
diff changeset
38 CHECK_EQ(*data_.current++, ' ');
kono
parents:
diff changeset
39 CHECK(IsOneOf(*data_.current, '-', 'r'));
kono
parents:
diff changeset
40 segment->protection = 0;
kono
parents:
diff changeset
41 if (*data_.current++ == 'r') segment->protection |= kProtectionRead;
kono
parents:
diff changeset
42 CHECK(IsOneOf(*data_.current, '-', 'w'));
kono
parents:
diff changeset
43 if (*data_.current++ == 'w') segment->protection |= kProtectionWrite;
kono
parents:
diff changeset
44 CHECK(IsOneOf(*data_.current, '-', 'x'));
kono
parents:
diff changeset
45 if (*data_.current++ == 'x') segment->protection |= kProtectionExecute;
kono
parents:
diff changeset
46 CHECK(IsOneOf(*data_.current, 's', 'p'));
kono
parents:
diff changeset
47 if (*data_.current++ == 's') segment->protection |= kProtectionShared;
kono
parents:
diff changeset
48 CHECK_EQ(*data_.current++, ' ');
kono
parents:
diff changeset
49 segment->offset = ParseHex(&data_.current);
kono
parents:
diff changeset
50 CHECK_EQ(*data_.current++, ' ');
kono
parents:
diff changeset
51 ParseHex(&data_.current);
kono
parents:
diff changeset
52 CHECK_EQ(*data_.current++, ':');
kono
parents:
diff changeset
53 ParseHex(&data_.current);
kono
parents:
diff changeset
54 CHECK_EQ(*data_.current++, ' ');
kono
parents:
diff changeset
55 while (IsDecimal(*data_.current)) data_.current++;
kono
parents:
diff changeset
56 // Qemu may lack the trailing space.
kono
parents:
diff changeset
57 // https://github.com/google/sanitizers/issues/160
kono
parents:
diff changeset
58 // CHECK_EQ(*data_.current++, ' ');
kono
parents:
diff changeset
59 // Skip spaces.
kono
parents:
diff changeset
60 while (data_.current < next_line && *data_.current == ' ') data_.current++;
kono
parents:
diff changeset
61 // Fill in the filename.
kono
parents:
diff changeset
62 if (segment->filename) {
kono
parents:
diff changeset
63 uptr len =
kono
parents:
diff changeset
64 Min((uptr)(next_line - data_.current), segment->filename_size - 1);
kono
parents:
diff changeset
65 internal_strncpy(segment->filename, data_.current, len);
kono
parents:
diff changeset
66 segment->filename[len] = 0;
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 data_.current = next_line + 1;
kono
parents:
diff changeset
70 return true;
kono
parents:
diff changeset
71 }
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 } // namespace __sanitizer
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 #endif // SANITIZER_LINUX