forked from WebKit/WebKit-http
-
Notifications
You must be signed in to change notification settings - Fork 157
Expand file tree
/
Copy pathConservativeScanStackGuards.h
More file actions
65 lines (51 loc) · 2.09 KB
/
ConservativeScanStackGuards.h
File metadata and controls
65 lines (51 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#pragma once
#include "Logging.h"
#include <atomic>
#include <deque>
namespace WTF {
class ConservativeScanStackGuards {
public:
struct ConservativeScanStackGuard {
ConservativeScanStackGuard() {
ConservativeScanStackGuards::setStackGuard(this);
}
~ConservativeScanStackGuard() {
ConservativeScanStackGuards::resetStackGuard(this);
}
private:
// Prevent heap allocation
void *operator new (size_t);
void *operator new[] (size_t);
void operator delete (void *);
void operator delete[] (void*);
};
friend struct ConservativeScanStackGuard;
static void* updatedStackOrigin(void *stackTop, void *stackOrigin) {
if (!active.load() || guard_ptr_stack.empty()) {
return stackOrigin;
}
void *ret = stackOrigin;
void *guard_ptr = guard_ptr_stack.back();
if (guard_ptr > stackTop && guard_ptr < stackOrigin) {
WTFLogAlways("ConservativeScanStackGuards: guard IN RANGE: stackTop: %p guard: %p stackOrigin: %p; correcting stackOrigin\n", stackTop, guard_ptr, stackOrigin);
ret = guard_ptr;
}
return ret;
}
static void setActive(bool act) {
active.store(act);
}
private:
static thread_local std::deque<void*> guard_ptr_stack;
static std::atomic_bool active;
static void setStackGuard(void *ptr) {
guard_ptr_stack.push_back(ptr);
}
static void resetStackGuard(void *ptr) {
if (ptr != guard_ptr_stack.back()) {
WTFLogAlways("ConservativeScanStackGuards::resetStackGuard expected %p, had: %p", guard_ptr_stack.back(), ptr);
}
guard_ptr_stack.pop_back();
}
};
}