Skip to content

Commit e41efcc

Browse files
committed
Add asan functions
1 parent f439fea commit e41efcc

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

Zend/zend_fibers.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,13 +238,15 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_context *to) /* {{{ */
238238
}
239239
/* }}} */
240240

241-
ZEND_API void zend_fiber_suspend_context(zend_fiber_context *current) /* {{{ */
241+
ZEND_API zend_fiber_context *zend_fiber_suspend_context(zend_fiber_context *current) /* {{{ */
242242
{
243243
ZEND_ASSERT(current && current->caller && current->stack.pointer && "Invalid fiber context");
244244

245245
transfer_t transfer = jump_fcontext(current->caller, NULL);
246246

247247
current->caller = transfer.context;
248+
249+
return transfer.data;
248250
}
249251
/* }}} */
250252

@@ -258,7 +260,16 @@ static void zend_fiber_suspend(zend_fiber *fiber) /* {{{ */
258260

259261
ZEND_FIBER_BACKUP_EG(stack, stack_page_size, execute_data, error_reporting, jit_trace_num);
260262

261-
zend_fiber_suspend_context(&fiber->context);
263+
#if defined(VARIANT_SANITIZE)
264+
void *fake_stack = NULL;
265+
__sanitizer_start_switch_fiber(&fake_stack, fiber->context->stack.pointer, fiber->context->stack.size);
266+
#endif
267+
268+
zend_fiber_context *from = zend_fiber_suspend_context(&fiber->context);
269+
270+
#if defined(VARIANT_SANITIZE)
271+
__sanitizer_finish_switch_fiber(&fake_stack, from->context->stack.pointer, from->context->stack.size);
272+
#endif
262273

263274
ZEND_FIBER_RESTORE_EG(stack, stack_page_size, execute_data, error_reporting, jit_trace_num);
264275
}
@@ -281,8 +292,17 @@ static void zend_fiber_switch_to(zend_fiber *fiber) /* {{{ */
281292

282293
EG(current_fiber) = fiber;
283294

295+
#if defined(VARIANT_SANITIZE)
296+
void *fake_stack = NULL;
297+
__sanitizer_start_switch_fiber(&fake_stack, fiber->context->stack.pointer, fiber->context->stack.size);
298+
#endif
299+
284300
zend_fiber_switch_context(&fiber->context);
285301

302+
#if defined(VARIANT_SANITIZE)
303+
__sanitizer_finish_switch_fiber(fake_stack, NULL, NULL);
304+
#endif
305+
286306
EG(current_fiber) = previous;
287307

288308
ZEND_FIBER_RESTORE_EG(stack, stack_page_size, execute_data, error_reporting, jit_trace_num);

Zend/zend_fibers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ ZEND_COLD ZEND_NORETURN void zend_error_suspend_fiber(
130130
int orig_type, const char *error_filename, uint32_t error_lineno, zend_string *message);
131131

132132
ZEND_API void zend_fiber_switch_context(zend_fiber_context *to);
133-
ZEND_API void zend_fiber_suspend_context(zend_fiber_context *current);
133+
ZEND_API zend_fiber_context *zend_fiber_suspend_context(zend_fiber_context *current);
134134

135135
#define ZEND_FIBER_VM_STACK_SIZE (1024 * sizeof(zval))
136136

0 commit comments

Comments
 (0)