[PATCH] Because of the is-binary heuristic in decrypt_file_if_needed, slurp still needs to decompress sometimes

Alex Vandiver alexmv at bestpractical.com
Tue Apr 27 05:29:37 UTC 2010


Unless we decompress files when slurping in decrypt_file_if_needed,
our binary check get a false positive, and we try to decrypt content
which is merely compressed, not encrypted.
---
 lib/Brackup/Decrypt.pm |    2 +-
 lib/Brackup/Util.pm    |   11 +++++++++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/lib/Brackup/Decrypt.pm b/lib/Brackup/Decrypt.pm
index 3f45bcf..8bfa614 100644
--- a/lib/Brackup/Decrypt.pm
+++ b/lib/Brackup/Decrypt.pm
@@ -38,7 +38,7 @@ sub write_to_file {
 sub decrypt_file_if_needed {
     my ($filename) = @_;
 
-    my $meta = slurp($filename);
+    my $meta = slurp($filename, decompress => 1);
     if ($meta =~ /[\x00-\x08]/) {  # silly is-binary heuristic
         my $new_file = decrypt_file($filename,no_batch => 1);
         if (defined $new_file) {
diff --git a/lib/Brackup/Util.pm b/lib/Brackup/Util.pm
index 98a86e0..9e864dd 100644
--- a/lib/Brackup/Util.pm
+++ b/lib/Brackup/Util.pm
@@ -51,8 +51,15 @@ sub tempdir {
 
 sub slurp {
     my $file = shift;
-    sysopen(my $fh, $file, O_RDONLY) or die "Failed to open $file: $!";
-    return do { local $/; <$fh>; }
+    my %opts = @_;
+    my $fh;
+    if ($opts{decompress} and eval { require IO::Uncompress::AnyUncompress }) {
+        $fh = IO::Uncompress::AnyUncompress->new($file)
+            or die "Failed to open file $file: $IO::Uncompress::AnyUncompress::AnyUncompressError";
+    } else {
+        sysopen($fh, $file, O_RDONLY) or die "Failed to open $file: $!";
+    }
+    return do { local $/; <$fh>; };
 }
 
 sub valid_params {
-- 
1.7.0.5



More information about the brackup mailing list