Skip to content

Commit e3a8847

Browse files
committed
compeltely rework hook data structures
motiviation is discovering a crash in reign of giants, caused by removing a hook, then having a nested call to the same function invalidate the iterator
1 parent e5bad41 commit e3a8847

File tree

5 files changed

+392
-164
lines changed

5 files changed

+392
-164
lines changed

src/unrealsdk/game/bl1/hooks.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void __fastcall process_event_hook(UObject* obj,
6262
.ret = {func->find_return_param()},
6363
.func = {.func = func, .object = obj}};
6464

65-
const bool block_execution = run_hooks_of_type(*data, hook_manager::Type::PRE, hook);
65+
const bool block_execution = run_hooks_of_type(data, hook_manager::Type::PRE, hook);
6666

6767
if (!block_execution) {
6868
process_event_ptr(obj, edx, func, params, null);
@@ -72,7 +72,7 @@ void __fastcall process_event_hook(UObject* obj,
7272
hook.ret.copy_to(reinterpret_cast<uintptr_t>(params));
7373
}
7474

75-
if (!has_post_hooks(*data)) {
75+
if (!has_post_hooks(data)) {
7676
return;
7777
}
7878

@@ -81,10 +81,10 @@ void __fastcall process_event_hook(UObject* obj,
8181
}
8282

8383
if (!block_execution) {
84-
run_hooks_of_type(*data, hook_manager::Type::POST, hook);
84+
run_hooks_of_type(data, hook_manager::Type::POST, hook);
8585
}
8686

87-
run_hooks_of_type(*data, hook_manager::Type::POST_UNCONDITIONAL, hook);
87+
run_hooks_of_type(data, hook_manager::Type::POST_UNCONDITIONAL, hook);
8888

8989
return;
9090
}
@@ -158,7 +158,7 @@ void __fastcall call_function_hook(UObject* obj,
158158
.ret = {func->find_return_param()},
159159
.func = {.func = func, .object = obj}};
160160

161-
const bool block_execution = run_hooks_of_type(*data, hook_manager::Type::PRE, hook);
161+
const bool block_execution = run_hooks_of_type(data, hook_manager::Type::PRE, hook);
162162

163163
if (block_execution) {
164164
stack->Code++;
@@ -173,7 +173,7 @@ void __fastcall call_function_hook(UObject* obj,
173173
- hook.ret.prop->Offset_Internal());
174174
}
175175

176-
if (!has_post_hooks(*data)) {
176+
if (!has_post_hooks(data)) {
177177
return;
178178
}
179179

@@ -183,10 +183,10 @@ void __fastcall call_function_hook(UObject* obj,
183183
}
184184

185185
if (!block_execution) {
186-
run_hooks_of_type(*data, hook_manager::Type::POST, hook);
186+
run_hooks_of_type(data, hook_manager::Type::POST, hook);
187187
}
188188

189-
run_hooks_of_type(*data, hook_manager::Type::POST_UNCONDITIONAL, hook);
189+
run_hooks_of_type(data, hook_manager::Type::POST_UNCONDITIONAL, hook);
190190

191191
return;
192192
}

src/unrealsdk/game/bl2/hooks.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void __fastcall process_event_hook(UObject* obj,
7979
.func = {.func = func, .object = obj}};
8080

8181
const bool block_execution =
82-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::PRE, hook);
82+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::PRE, hook);
8383

8484
if (!block_execution) {
8585
process_event_ptr(obj, edx, func, params, null);
@@ -89,7 +89,7 @@ void __fastcall process_event_hook(UObject* obj,
8989
hook.ret.copy_to(reinterpret_cast<uintptr_t>(params));
9090
}
9191

92-
if (!hook_manager::impl::has_post_hooks(*data)) {
92+
if (!hook_manager::impl::has_post_hooks(data)) {
9393
return;
9494
}
9595

@@ -98,10 +98,10 @@ void __fastcall process_event_hook(UObject* obj,
9898
}
9999

100100
if (!block_execution) {
101-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST, hook);
101+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST, hook);
102102
}
103103

104-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST_UNCONDITIONAL,
104+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST_UNCONDITIONAL,
105105
hook);
106106

107107
return;
@@ -191,7 +191,7 @@ void __fastcall call_function_hook(UObject* obj,
191191
.func = {.func = func, .object = obj}};
192192

193193
const bool block_execution =
194-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::PRE, hook);
194+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::PRE, hook);
195195

196196
if (block_execution) {
197197
stack->Code++;
@@ -206,7 +206,7 @@ void __fastcall call_function_hook(UObject* obj,
206206
- hook.ret.prop->Offset_Internal());
207207
}
208208

209-
if (!hook_manager::impl::has_post_hooks(*data)) {
209+
if (!hook_manager::impl::has_post_hooks(data)) {
210210
return;
211211
}
212212

@@ -216,10 +216,10 @@ void __fastcall call_function_hook(UObject* obj,
216216
}
217217

218218
if (!block_execution) {
219-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST, hook);
219+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST, hook);
220220
}
221221

222-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST_UNCONDITIONAL,
222+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST_UNCONDITIONAL,
223223
hook);
224224

225225
return;

src/unrealsdk/game/bl3/hooks.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void process_event_hook(UObject* obj, UFunction* func, void* params) {
4848
.func = {.func = func, .object = obj}};
4949

5050
const bool block_execution =
51-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::PRE, hook);
51+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::PRE, hook);
5252

5353
if (!block_execution) {
5454
process_event_ptr(obj, func, params);
@@ -58,7 +58,7 @@ void process_event_hook(UObject* obj, UFunction* func, void* params) {
5858
hook.ret.copy_to(reinterpret_cast<uintptr_t>(params));
5959
}
6060

61-
if (!hook_manager::impl::has_post_hooks(*data)) {
61+
if (!hook_manager::impl::has_post_hooks(data)) {
6262
return;
6363
}
6464

@@ -67,10 +67,10 @@ void process_event_hook(UObject* obj, UFunction* func, void* params) {
6767
}
6868

6969
if (!block_execution) {
70-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST, hook);
70+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST, hook);
7171
}
7272

73-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST_UNCONDITIONAL,
73+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST_UNCONDITIONAL,
7474
hook);
7575

7676
return;
@@ -161,7 +161,7 @@ void call_function_hook(UObject* obj, FFrame* stack, void* result, UFunction* fu
161161
.func = {.func = func, .object = obj}};
162162

163163
const bool block_execution =
164-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::PRE, hook);
164+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::PRE, hook);
165165

166166
if (block_execution) {
167167
stack->Code++;
@@ -176,7 +176,7 @@ void call_function_hook(UObject* obj, FFrame* stack, void* result, UFunction* fu
176176
- hook.ret.prop->Offset_Internal());
177177
}
178178

179-
if (!hook_manager::impl::has_post_hooks(*data)) {
179+
if (!hook_manager::impl::has_post_hooks(data)) {
180180
return;
181181
}
182182

@@ -186,10 +186,10 @@ void call_function_hook(UObject* obj, FFrame* stack, void* result, UFunction* fu
186186
}
187187

188188
if (!block_execution) {
189-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST, hook);
189+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST, hook);
190190
}
191191

192-
hook_manager::impl::run_hooks_of_type(*data, hook_manager::Type::POST_UNCONDITIONAL,
192+
hook_manager::impl::run_hooks_of_type(data, hook_manager::Type::POST_UNCONDITIONAL,
193193
hook);
194194

195195
return;

0 commit comments

Comments
 (0)