summaryrefslogtreecommitdiff
path: root/mach_dep.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-07-15 07:57:51 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-07-15 07:57:51 +0300
commit41d41c30957a952e2a6d93023cf08188f8df949e (patch)
tree1321832f213e257fbc51e90871b7d9dd5fc5efe5 /mach_dep.c
parent713fbad083e1f00fbd711cce7ff0fe9031c2fcdd (diff)
downloadbdwgc-41d41c30957a952e2a6d93023cf08188f8df949e.tar.gz
Fix EINVAL returned by E2K_READ_PROCEDURE_STACK_EX sub-function
(fix of commit d3f5bdc3e) * mach_dep.c [E2K] (GC_get_procedure_stack): Remove assertion that buf_sz is multiple of word size (because new_size is passed to the syscall); call E2K_GET_PROCEDURE_STACK_SIZE sub-function of the syscall right before E2K_READ_PROCEDURE_STACK_EX one to check that the procedure stack size has not changed since the previous call of GC_get_procedure_stack(NULL,0); add comment.
Diffstat (limited to 'mach_dep.c')
-rw-r--r--mach_dep.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/mach_dep.c b/mach_dep.c
index 4cb49209..1fc1b587 100644
--- a/mach_dep.c
+++ b/mach_dep.c
@@ -37,27 +37,28 @@
word new_sz;
GC_ASSERT(0 == buf_sz || buf != NULL);
- GC_ASSERT(buf_sz % sizeof(word) == 0);
for (;;) {
- if (NULL == buf) {
- new_sz = 0;
- if (syscall(__NR_access_hw_stacks, E2K_GET_PROCEDURE_STACK_SIZE,
- NULL, NULL, 0, &new_sz) != -1) {
- GC_ASSERT(new_sz > 0 && new_sz % sizeof(word) == 0);
- break;
- }
- } else {
- word stack_ofs = 0;
-
- if (syscall(__NR_access_hw_stacks, E2K_READ_PROCEDURE_STACK_EX,
- &stack_ofs, buf, buf_sz, NULL) != -1) {
- new_sz = buf_sz;
- break;
- }
+ word stack_ofs;
+
+ new_sz = 0;
+ if (syscall(__NR_access_hw_stacks, E2K_GET_PROCEDURE_STACK_SIZE,
+ NULL, NULL, 0, &new_sz) == -1) {
+ if (errno != EAGAIN)
+ ABORT_ARG1("Cannot get size of procedure stack",
+ ": errno= %d", errno);
+ continue;
}
+ GC_ASSERT(new_sz > 0 && new_sz % sizeof(word) == 0);
+ if (new_sz > buf_sz)
+ break;
+ /* Immediately read the stack right after checking its size. */
+ stack_ofs = 0;
+ if (syscall(__NR_access_hw_stacks, E2K_READ_PROCEDURE_STACK_EX,
+ &stack_ofs, buf, new_sz, NULL) != -1)
+ break;
if (errno != EAGAIN)
ABORT_ARG2("Cannot read procedure stack",
- ": buf_sz= %lu, errno= %d", (unsigned long)buf_sz, errno);
+ ": new_sz= %lu, errno= %d", (unsigned long)new_sz, errno);
}
return (size_t)new_sz;
}