Skip to content
Snippets Groups Projects
Commit 39cc88e7 authored by Moritz Angermann's avatar Moritz Angermann Committed by Ben Gamari
Browse files

[rts] Untag bq->bh prior to reading the info table

In `checkBlockingQueues` we must always untag the `bh` field of an `StgBlockingQueue`.
While at first glance it might seem a sensible assumption that `bh` will
always be a blackhole and therefore never be tagged, the GC could
shortcut the indirection and put a tagged pointer into the indirection.

This blew up on aarch64-darwin with a misaligned access. `bh` pointed
to an address that always ended in 0xa. On architectures that
are a little less strict about alignment, this would have read
a garbage info table pointer, which very, very unlikely would have been equal to
`stg_BLACKHOLE_info` and therefore things accidentally worked. However,
on AArch64, the read of the info table pointer resulted in a SIGBUS due
to misaligned read.

Fixes #20093.

(cherry picked from commit 1832676a)
parent 8848c398
2 merge requests!7224Draft: Don't panic in Parser.rs,!6293Backports for 9.2.1
......@@ -423,7 +423,18 @@ checkBlockingQueues (Capability *cap, StgTSO *tso)
continue;
}
p = bq->bh;
// We need to always ensure we untag bh. While it might seem a
// sensible assumption that bh will never be tagged, the GC could
// shortcut the indirection and put a tagged pointer into the
// indirection.
//
// This blew up on aarch64-darwin with misaligned access. bh pointing
// to an address that always ended in 0xa. Thus on architectures that
// are a little less strict about alignment, this would have read a
// garbage pinfo, which very, very unlikely would have been equal to
// stg_BLACKHOLE_info. Thus while the code would have done the wrong
// thing the result would be the same in almost all cases. See #20093.
p = UNTAG_CLOSURE(bq->bh);
const StgInfoTable *pinfo = ACQUIRE_LOAD(&p->header.info);
if (pinfo != &stg_BLACKHOLE_info ||
((StgInd *)p)->indirectee != (StgClosure*)bq)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment