FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
WebKit/Source/JavaScriptCore/tools/Integrity.h at main · WebKit/WebKit · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
WebKit
/
WebKit
Public
Notifications
You must be signed in to change notification settings
Fork
2.1k
Star
10.1k
Code
Pull requests
2.6k
Actions
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
WebKit
/
Source
/
JavaScriptCore
/
tools
/
Integrity.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
233 lines (188 loc) · 7.52 KB
Breadcrumbs
WebKit
/
Source
/
JavaScriptCore
/
tools
/
Integrity.h
Copy path
File metadata and controls
233 lines (188 loc) · 7.52 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/*
* Copyright (C) 2019-2022, 2026 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#
pragma
once
#
include
<
JavaScriptCore/JSExportMacros.h
>
#
include
<
span
>
#
include
<
wtf/AccessibleAddress.h
>
#
include
<
wtf/Assertions.h
>
#
include
<
wtf/Lock.h
>
#
if
OS(DARWIN)
#
include
<
mach/vm_param.h
>
#
endif
//
Force ENABLE_EXTRA_INTEGRITY_CHECKS to 1 for your local build if you want
//
more prolific audits to be enabled.
#
define
ENABLE_EXTRA_INTEGRITY_CHECKS
0
//
From API/JSBase.h
typedef
const
struct
OpaqueJSContextGroup
* JSContextGroupRef;
typedef
const
struct
OpaqueJSContext
* JSContextRef;
typedef
struct
OpaqueJSContext
* JSGlobalContextRef;
typedef
struct
OpaqueJSPropertyNameAccumulator
* JSPropertyNameAccumulatorRef;
typedef
const
struct
OpaqueJSValue
* JSValueRef;
typedef
struct
OpaqueJSValue
* JSObjectRef;
namespace
WTF
{
class
PrintStream
;
}
namespace
JSC
{
class
JSCell
;
class
JSGlobalObject
;
class
JSObject
;
class
JSValue
;
class
Structure
;
class
StructureID
;
class
VM
;
namespace
Integrity
{
enum
class
AuditLevel
{
None,
Minimal,
Full,
Random,
};
#
ifdef
NDEBUG
static
constexpr
AuditLevel DefaultAuditLevel = AuditLevel::None;
#
else
static
constexpr
AuditLevel DefaultAuditLevel = AuditLevel::Random;
#
endif
class
Random
{
public:
Random
(
VM
&);
ALWAYS_INLINE
bool
shouldAudit
(
VM
&);
private:
JS_EXPORT_PRIVATE
bool
reloadAndCheckShouldAuditSlow
(
VM
&);
uint64_t
m_triggerBits;
Lock m_lock;
//
The top bit is reserved as a termination bit. Hence, the number of
//
trigger bits is always 1 less than will fit in m_triggerBits.
static
constexpr
int
numberOfTriggerBits = (
sizeof
(m_triggerBits) *
CHAR_BIT
) -
1
;
};
ALWAYS_INLINE
bool
isSanePointer
(
const
void
* pointer)
{
uintptr_t
pointerAsInt = std::bit_cast<
uintptr_t
>(pointer);
#
if
CPU(ARM64) && CPU(ADDRESS64)
//
On ARM64, top byte ignore means we can ignore these bits for addresses.
pointerAsInt &= std::numeric_limits<
uintptr_t
>::
max
() >>
CHAR_BIT
;
#
endif
if
(pointerAsInt <
lowestAccessibleAddress
())
return
false
;
#
if
CPU(ADDRESS64)
uintptr_t
canonicalPointerBits = pointerAsInt << (
64
-
OS_CONSTANT
(
EFFECTIVE_ADDRESS_WIDTH
));
uintptr_t
nonCanonicalPointerBits = pointerAsInt >>
OS_CONSTANT
(
EFFECTIVE_ADDRESS_WIDTH
);
return
!nonCanonicalPointerBits && canonicalPointerBits;
#
else
return
true
;
#
endif
//
CPU(ADDRESS64)
}
template
<
typename
T>
ALWAYS_INLINE
bool
isSanePointer
(
const
T* pointer)
{
return
isSanePointer
(
static_cast
<
const
void
*>(pointer)) && !(std::bit_cast<
uintptr_t
>(pointer) & (
alignof
(T) -
1
));
}
class
Analyzer
{
public:
enum
Action { LogOnly, LogAndCrash };
static
bool
analyzeVM
(
VM
&, Action);
static
bool
analyzeCell
(
VM
&, JSCell*, Action);
static
bool
analyzeCell
(JSCell*, Action);
};
JS_EXPORT_PRIVATE
JSContextRef
doAudit
(JSContextRef);
JS_EXPORT_PRIVATE
JSGlobalContextRef
doAudit
(JSGlobalContextRef);
JS_EXPORT_PRIVATE
JSObjectRef
doAudit
(JSObjectRef);
JS_EXPORT_PRIVATE
JSValueRef
doAudit
(JSValueRef);
JS_EXPORT_PRIVATE
JSValue
doAudit
(JSValue);
JS_EXPORT_PRIVATE
JSCell*
doAudit
(JSCell*);
JS_EXPORT_PRIVATE
JSCell*
doAudit
(
VM
&, JSCell*);
JS_EXPORT_PRIVATE
JSObject*
doAudit
(JSObject*);
JS_EXPORT_PRIVATE
JSGlobalObject*
doAudit
(JSGlobalObject*);
VM
*
doAudit
(
VM
*);
//
see IntegrityInlines.h
//
These are used for debugging queries, and will not crash.
JS_EXPORT_PRIVATE
bool
verifyCell
(JSCell*);
JS_EXPORT_PRIVATE
bool
verifyCell
(
VM
&, JSCell*);
ALWAYS_INLINE
void
auditCellRandomly
(
VM
&, JSCell*);
ALWAYS_INLINE
void
auditCellMinimally
(
VM
&, JSCell*);
JS_EXPORT_PRIVATE
void
auditCellMinimallySlow
(
VM
&, JSCell*);
ALWAYS_INLINE
void
auditCellFully
(
VM
&, JSCell*);
template
<AuditLevel = AuditLevel::Random,
typename
T>
ALWAYS_INLINE
void
auditCell
(
VM
&, T) { }
template
<AuditLevel auditLevel = DefaultAuditLevel>
ALWAYS_INLINE
void
auditCell
(
VM
& vm, JSCell* cell)
{
static_assert
(auditLevel == AuditLevel::None || auditLevel == AuditLevel::Minimal || auditLevel == AuditLevel::Full || auditLevel == AuditLevel::Random);
UNUSED_PARAM
(vm);
UNUSED_PARAM
(cell);
if
constexpr
(auditLevel == AuditLevel::None)
return
;
if
constexpr
(auditLevel == AuditLevel::Minimal)
return
auditCellMinimally
(vm, cell);
if
constexpr
(auditLevel == AuditLevel::Full)
return
auditCellFully
(vm, cell);
if
constexpr
(auditLevel == AuditLevel::Random)
return
auditCellRandomly
(vm, cell);
}
template
<AuditLevel auditLevel = DefaultAuditLevel>
ALWAYS_INLINE
void
auditCell
(
VM
&, JSValue);
ALWAYS_INLINE
void
auditStructureID
(StructureID);
#
if
ENABLE(EXTRA_INTEGRITY_CHECKS)
template
<
typename
T>
ALWAYS_INLINE
T
audit
(T value) {
return
std::bit_cast<T>(
doAudit
(value)); }
template
<>
std::span<JSValue>
audit
(std::span<JSValue>);
#
else
template
<
typename
T>
ALWAYS_INLINE
T
audit
(T value) {
return
value; }
#
endif
#
if
!VA_OPT_SUPPORTED
#
define
IA_LOG
(assertion, format, ...)
do
{ \
Integrity::logLnF
(
"
ERROR: %s @ %s:%d
"
, #assertion, __FILE__, __LINE__); \
}
while
(
false
)
#
define
IA_ASSERT_WITH_ACTION
(assertion, action, ...)
do
{ \
if
(!(assertion))
[[unlikely]]
{ \
IA_LOG
(assertion, __VA_ARGS__); \
WTFReportBacktraceWithPrefixAndPrintStream
(
Integrity::logFile
(),
"
"
); \
action; \
} \
}
while
(
false
)
#
define
IA_ASSERT
(assertion, ...) \
IA_ASSERT_WITH_ACTION
(assertion, { \
RELEASE_ASSERT
((assertion)); \
})
#
else
//
not !VA_OPT_SUPPORTED
#
define
IA_LOG
(assertion, format, ...)
do
{ \
Integrity::logLnF
(
"
ERROR: %s @ %s:%d
"
, #assertion, __FILE__, __LINE__); \
Integrity::logLnF
(
"
"
format
__VA_OPT__
(,) __VA_ARGS__); \
}
while
(
false
)
#
define
IA_ASSERT_WITH_ACTION
(assertion, action, ...)
do
{ \
if
(!(assertion))
[[unlikely]]
{ \
IA_LOG
(assertion, __VA_ARGS__); \
WTFReportBacktraceWithPrefixAndPrintStream
(
Integrity::logFile
(),
"
"
); \
action; \
} \
}
while
(
false
)
#
define
IA_ASSERT
(assertion, ...) \
IA_ASSERT_WITH_ACTION
(assertion, { \
RELEASE_ASSERT
((assertion)
__VA_OPT__
(,) __VA_ARGS__); \
} __VA_OPT__(,) __VA_ARGS__)
#
endif
//
!VA_OPT_SUPPORTED
JS_EXPORT_PRIVATE
WTF
::PrintStream&
logFile
();
JS_EXPORT_PRIVATE
void
logF
(
const
char
* format, ...) WTF_ATTRIBUTE_PRINTF(
1
,
2
);
JS_EXPORT_PRIVATE
void
logLnF
(
const
char
* format, ...) WTF_ATTRIBUTE_PRINTF(
1
,
2
);
}
//
namespace Integrity
}
//
namespace JSC
Back
|
FazBrowse Home
|
New Git URL