浏览代码

LibJS: Seal Bytecode Blocks and munmap them (#7919)

Leon Albrecht 4 年之前
父节点
当前提交
c6ce7c9326
共有 2 个文件被更改,包括 19 次插入5 次删除
  1. 16 4
      Userland/Libraries/LibJS/Bytecode/Block.cpp
  2. 3 1
      Userland/Libraries/LibJS/Bytecode/Block.h

+ 16 - 4
Userland/Libraries/LibJS/Bytecode/Block.cpp

@@ -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() const
+{
+    if (mprotect(m_buffer, m_buffer_capacity, PROT_READ) < 0) {
+        perror("ByteCode::Block::seal: mprotect");
+        VERIFY_NOT_REACHED();
+    }
 }
 
-void Block::seal()
+void Block::unseal()
 {
-    // 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 | PROT_WRITE) < 0) {
+        perror("ByteCode::Block::unseal: mprotect");
+        VERIFY_NOT_REACHED();
+    }
 }
 
 void Block::dump() const

+ 3 - 1
Userland/Libraries/LibJS/Bytecode/Block.h

@@ -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 }; }