LibC: Implement _setjmp and _longjmp

These are aliases to `setjmp()` and `longjmp()` on our system,
as our implementations don't modify the signal mask.

This is required for the syzkaller executor process.
This commit is contained in:
Brian Gianforcaro 2021-12-24 03:28:06 -08:00 committed by Brian Gianforcaro
parent eefe471dce
commit 49749e279a
Notes: sideshowbarker 2024-07-17 23:07:41 +09:00
2 changed files with 16 additions and 0 deletions

View file

@ -14,7 +14,9 @@
mov (%esp), %ebx
ret
.global _setjmp
.global setjmp
_setjmp:
setjmp:
xor %eax, %eax // Grab val argument (hardcoded to zero)
jmp .Lsigset_common
@ -57,7 +59,9 @@ sigsetjmp:
xor %eax, %eax
ret
.global _longjmp
.global longjmp
_longjmp:
longjmp:
mov 4(%esp), %ecx // Grab jmp_buf argument
mov 8(%esp), %eax // Grab val argument

View file

@ -79,4 +79,16 @@ __attribute__((noreturn)) void longjmp(jmp_buf, int val);
int sigsetjmp(sigjmp_buf, int savesigs);
__attribute__((noreturn)) void siglongjmp(sigjmp_buf, int val);
/**
* _setjmp() and _longjmp() are specified as behaving the exactly the same as
* setjmp() and longjmp(), except they are not supposed to modify the signal mask.
*
* Our implementations already follow this restriction, so we just map them directly
* to the same functions.
*
* https://pubs.opengroup.org/onlinepubs/9699969599/functions/_setjmp.html
*/
int _setjmp(jmp_buf);
__attribute__((noreturn)) void _longjmp(jmp_buf, int val);
__END_DECLS