From 62e9caa164305a18d7d1f037ab27d14ac933d3cf Mon Sep 17 00:00:00 2001
From: Craig Heffner <heffnercj@gmail.com>
Date: Thu, 16 Mar 2017 19:30:30 -0400
Subject: [PATCH] Improved MPFS and CramFS false positive detection

---
 src/binwalk/magic/filesystems    | 31 ++++++++++++++++++-------------
 src/binwalk/modules/extractor.py |  6 ++++++
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/binwalk/magic/filesystems b/src/binwalk/magic/filesystems
index 1a69254..c1ca8d8 100644
--- a/src/binwalk/magic/filesystems
+++ b/src/binwalk/magic/filesystems
@@ -73,7 +73,10 @@
 # MPFS file system
 0       string      MPFS     MPFS filesystem, Microchop,
 >4      byte        <0       {invalid}
+>4      byte        >10      {invalid}
 >5      byte        <0       {invalid}
+>4      byte        0
+>>5     byte        0        {invalid}
 >4      byte        x        version %d.
 >5      byte        x        \b%d,
 >6      leshort     <0       {invalid}
@@ -81,33 +84,35 @@
 
 # cramfs filesystem - russell@coker.com.au
 0       lelong      0x28cd3d45      CramFS filesystem, little endian,
->4      lelong      <0              invalid size,{invalid}
+>4      lelong      <1              invalid size,{invalid}
 >4      lelong      >1073741824     invalid size,{invalid}
->4      ulelong     x               size: %u
->8      lelong      &1              version 2
->8      lelong      &2              sorted_dirs
->8      lelong      &4              hole_support
+>4      ulelong     x               size: %u,
+>8      lelong      &1              version 2,
+>8      lelong      &2              sorted_dirs,
+>8      lelong      &4              hole_support,
+>32     ulelong     0               invalid{invalid}
 >32     ulelong     x               CRC 0x%.8X,
 >36     ulelong     x               edition %u,
 >40     lelong      <0              invalid blocks,{invalid}
 >40     ulelong     x               %u blocks,
->44     lelong      <0              invalid file count,{invalid}
+>44     lelong      <1              invalid file count,{invalid}
 >44     ulelong     x               %u files
 >4      ulelong     x               {jump:%u}
 >4      ulelong     x               {size:%u}
 
 0       belong      0x28cd3d45      CramFS filesystem, big endian
->4      belong      <0              {invalid}
+>4      belong      <1              {invalid}
 >4      belong      >1073741824     {invalid}
->4      belong      x               size %u
->8      belong      &1              version 2
->8      belong      &2              sorted_dirs
->8      belong      &4              hole_support
+>4      belong      x               size %u,
+>8      belong      &1              version 2,
+>8      belong      &2              sorted_dirs,
+>8      belong      &4              hole_support,
+>32     ubelong     0               invalid{invalid}
 >32     ubelong     x               CRC 0x%.8X,
 >36     belong      x               edition %u,
->40     belong      <0              {invalid}
+>40     belong      <0              invalid blocks,{invalid}
 >40     ubelong     x               %u blocks,
->44     belong      <0              {invalid}
+>44     belong      <1              invalid file count,{invalid}
 >44     ubelong     x               %u files
 >4      ubelong     x               {jump:%u}
 >4      ubelong     x               {size:%u}
diff --git a/src/binwalk/modules/extractor.py b/src/binwalk/modules/extractor.py
index faf5977..ee1d9b2 100644
--- a/src/binwalk/modules/extractor.py
+++ b/src/binwalk/modules/extractor.py
@@ -82,6 +82,11 @@ class Extractor(Module):
                type=int,
                kwargs={'max_count': 0},
                description='Limit the number of extracted files'),
+        #Option(short='u',
+        #       long='limit',
+        #       type=int,
+        #       kwargs={'recursive_max_size': 0},
+        #       description="Limit the total size of all extracted files"),
         Option(short='r',
                long='rm',
                kwargs={'remove_after_execute': True},
@@ -94,6 +99,7 @@ class Extractor(Module):
 
     KWARGS = [
         Kwarg(name='max_size', default=None),
+        Kwarg(name='recursive_max_size', default=None),
         Kwarg(name='max_count', default=None),
         Kwarg(name='base_directory', default=None),
         Kwarg(name='remove_after_execute', default=False),
--
libgit2 0.26.0