From 402266e3e46a81921caca6855fa4c268ee7c9ae0 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Sun, 11 Mar 2018 12:56:48 -0600
Subject: [PATCH] Check length on more objects

---
 src/acpi/aml/namedobj.rs | 91 ++++++++++++++++++++++++++++------------
 1 file changed, 65 insertions(+), 26 deletions(-)

diff --git a/src/acpi/aml/namedobj.rs b/src/acpi/aml/namedobj.rs
index 7b4b73d7..f0067d47 100644
--- a/src/acpi/aml/namedobj.rs
+++ b/src/acpi/aml/namedobj.rs
@@ -113,8 +113,11 @@ pub fn parse_named_obj(data: &[u8],
     Err(AmlError::AmlInvalidOpCode)
 }
 
-fn parse_def_bank_field(data: &[u8],
-                        ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_bank_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 3 {
+        return Err(AmlError::AmlParseError("DefBankField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -168,8 +171,11 @@ fn parse_def_bank_field(data: &[u8],
     })
 }
 
-fn parse_def_create_bit_field(data: &[u8],
-                              ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_create_bit_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefCreateBitField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -198,8 +204,11 @@ fn parse_def_create_bit_field(data: &[u8],
     })
 }
 
-fn parse_def_create_byte_field(data: &[u8],
-                               ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_create_byte_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefCreateByteField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -228,8 +237,11 @@ fn parse_def_create_byte_field(data: &[u8],
     })
 }
 
-fn parse_def_create_word_field(data: &[u8],
-                               ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_create_word_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefCreateWordField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -258,8 +270,11 @@ fn parse_def_create_word_field(data: &[u8],
     })
 }
 
-fn parse_def_create_dword_field(data: &[u8],
-                                ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_create_dword_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefCreateDwordField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -288,8 +303,11 @@ fn parse_def_create_dword_field(data: &[u8],
     })
 }
 
-fn parse_def_create_qword_field(data: &[u8],
-                                ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_create_qword_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefCreateQwordField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -318,8 +336,11 @@ fn parse_def_create_qword_field(data: &[u8],
     })
 }
 
-fn parse_def_create_field(data: &[u8],
-                          ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_create_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefCreateField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -349,8 +370,11 @@ fn parse_def_create_field(data: &[u8],
     })
 }
 
-fn parse_def_data_region(data: &[u8],
-                         ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_data_region(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefDataRegion - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -386,8 +410,11 @@ fn parse_def_data_region(data: &[u8],
     })
 }
 
-fn parse_def_event(data: &[u8],
-                   ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_event(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefEvent - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -409,8 +436,11 @@ fn parse_def_event(data: &[u8],
     })
 }
 
-fn parse_def_device(data: &[u8],
-                    ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_device(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 2 {
+        return Err(AmlError::AmlParseError("DefDevice - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -441,8 +471,11 @@ fn parse_def_device(data: &[u8],
     })
 }
 
-fn parse_def_op_region(data: &[u8],
-                       ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_op_region(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 3 {
+        return Err(AmlError::AmlParseError("DefOpRegion - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -490,8 +523,11 @@ fn parse_def_op_region(data: &[u8],
     })
 }
 
-fn parse_def_field(data: &[u8],
-                   ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 3 {
+        return Err(AmlError::AmlParseError("DefField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
@@ -535,8 +571,11 @@ fn parse_def_field(data: &[u8],
     })
 }
 
-fn parse_def_index_field(data: &[u8],
-                         ctx: &mut AmlExecutionContext) -> ParseResult {
+fn parse_def_index_field(data: &[u8], ctx: &mut AmlExecutionContext) -> ParseResult {
+    if data.len() < 3 {
+        return Err(AmlError::AmlParseError("DefIndexField - data truncated"))
+    }
+
     match ctx.state {
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
-- 
GitLab