mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 06:28:22 +00:00
futex: fix use after free
This commit is contained in:
@@ -79,6 +79,7 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
|||||||
|
|
||||||
uint32_t *physical = vmm_getphysical(futexp);
|
uint32_t *physical = vmm_getphysical(futexp);
|
||||||
futex_t *futex = getfutex(physical);
|
futex_t *futex = getfutex(physical);
|
||||||
|
bool doleave = true;
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case FUTEX_WAKE:
|
case FUTEX_WAKE:
|
||||||
@@ -145,6 +146,7 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
|||||||
|
|
||||||
// clean up if needed
|
// clean up if needed
|
||||||
if (futex->waiting == 0) {
|
if (futex->waiting == 0) {
|
||||||
|
doleave = false;
|
||||||
free(futex);
|
free(futex);
|
||||||
removefutex(physical);
|
removefutex(physical);
|
||||||
}
|
}
|
||||||
@@ -157,7 +159,9 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
|||||||
ret.errno = ENOSYS;
|
ret.errno = ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
poll_leave(&desc);
|
if (doleave)
|
||||||
|
poll_leave(&desc);
|
||||||
|
|
||||||
poll_destroydesc(&desc);
|
poll_destroydesc(&desc);
|
||||||
|
|
||||||
MUTEX_RELEASE(&futexmutex);
|
MUTEX_RELEASE(&futexmutex);
|
||||||
|
|||||||
Reference in New Issue
Block a user