mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 10:19:03 +03:00
LibJS: Seal Bytecode Blocks and munmap them (#7919)
This commit is contained in:
parent
064ed8279e
commit
c6ce7c9326
Notes:
sideshowbarker
2024-07-18 12:37:41 +09:00
Author: https://github.com/Hendiadyoin1 Commit: https://github.com/SerenityOS/serenity/commit/c6ce7c9326f Pull-request: https://github.com/SerenityOS/serenity/pull/7919
@ -28,19 +28,31 @@ Block::Block()
|
||||
|
||||
Block::~Block()
|
||||
{
|
||||
unseal();
|
||||
Bytecode::InstructionStreamIterator it(instruction_stream());
|
||||
while (!it.at_end()) {
|
||||
auto& to_destroy = (*it);
|
||||
++it;
|
||||
Instruction::destroy(const_cast<Instruction&>(to_destroy));
|
||||
}
|
||||
|
||||
munmap(m_buffer, m_buffer_capacity);
|
||||
}
|
||||
|
||||
void Block::seal()
|
||||
void Block::seal() const
|
||||
{
|
||||
// FIXME: mprotect the instruction stream as PROT_READ
|
||||
// This is currently not possible because instructions can have destructors (that clean up strings)
|
||||
// Instructions should instead be destructor-less and refer to strings in a string table on the Bytecode::Block.
|
||||
if (mprotect(m_buffer, m_buffer_capacity, PROT_READ) < 0) {
|
||||
perror("ByteCode::Block::seal: mprotect");
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
void Block::unseal()
|
||||
{
|
||||
if (mprotect(m_buffer, m_buffer_capacity, PROT_READ | PROT_WRITE) < 0) {
|
||||
perror("ByteCode::Block::unseal: mprotect");
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
void Block::dump() const
|
||||
|
@ -42,7 +42,9 @@ public:
|
||||
static NonnullOwnPtr<Block> create();
|
||||
~Block();
|
||||
|
||||
void seal();
|
||||
void seal() const;
|
||||
void unseal();
|
||||
|
||||
void dump() const;
|
||||
ReadonlyBytes instruction_stream() const { return ReadonlyBytes { m_buffer, m_buffer_size }; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user