summaryrefslogtreecommitdiffstats
path: root/lib/Spreadsheet/ParseXLSX.pm
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-12-04 01:59:27 -0500
committerJesse Luehrs <doy@tozt.net>2015-12-04 02:03:22 -0500
commitb8484d0c483a75140fb1afeab66984f0ae48d4eb (patch)
tree1f2adb2bad9ae9797afaf0bec6054e6651fa3dd2 /lib/Spreadsheet/ParseXLSX.pm
parent97e713249292eb4eb7ac6ba9fd05abbd1eb00fa5 (diff)
downloadspreadsheet-parsexlsx-b8484d0c483a75140fb1afeab66984f0ae48d4eb.tar.gz
spreadsheet-parsexlsx-b8484d0c483a75140fb1afeab66984f0ae48d4eb.zip
be a bit safer about files
don't use two-arg open, don't use File::Temp::tempfile
Diffstat (limited to 'lib/Spreadsheet/ParseXLSX.pm')
-rw-r--r--lib/Spreadsheet/ParseXLSX.pm47
1 files changed, 21 insertions, 26 deletions
diff --git a/lib/Spreadsheet/ParseXLSX.pm b/lib/Spreadsheet/ParseXLSX.pm
index 3d1ebd6..6e84e3e 100644
--- a/lib/Spreadsheet/ParseXLSX.pm
+++ b/lib/Spreadsheet/ParseXLSX.pm
@@ -63,41 +63,36 @@ sub parse {
my $self = shift;
my ($file, $formatter) = @_;
+ my $zip = Archive::Zip->new;
my $workbook = Spreadsheet::ParseExcel::Workbook->new;
- my $tempfile;
if ($self->_check_signature($file)) {
- $tempfile = $file = Spreadsheet::ParseXLSX::Decryptor->open(
+ $file = Spreadsheet::ParseXLSX::Decryptor->open(
$file,
$self->{Password}
);
}
- eval {
- my $zip = Archive::Zip->new;
- if (openhandle($file)) {
- bless $file, 'IO::File' if ref($file) eq 'GLOB'; # sigh
- $zip->readFromFileHandle($file) == Archive::Zip::AZ_OK
- or die "Can't open filehandle as a zip file";
- $workbook->{File} = undef;
- }
- elsif (!ref($file)) {
- $zip->read($file) == Archive::Zip::AZ_OK
- or die "Can't open file '$file' as a zip file";
- $workbook->{File} = $file;
- }
- else {
- die "Argument to 'new' must be a filename or open filehandle";
- }
-
- $self->_parse_workbook($zip, $workbook, $formatter);
- };
- if ($tempfile) {
- unlink $tempfile;
- };
- die $@ if $@;
+ if (openhandle($file)) {
+ bless $file, 'IO::File' if ref($file) eq 'GLOB'; # sigh
+ my $fh = ref($file) eq 'File::Temp'
+ ? IO::File->new("<&=" . fileno($file))
+ : $file;
+ $zip->readFromFileHandle($fh) == Archive::Zip::AZ_OK
+ or die "Can't open filehandle as a zip file";
+ $workbook->{File} = undef;
+ $workbook->{__tempfile} = $file;
+ }
+ elsif (!ref($file)) {
+ $zip->read($file) == Archive::Zip::AZ_OK
+ or die "Can't open file '$file' as a zip file";
+ $workbook->{File} = $file;
+ }
+ else {
+ die "Argument to 'new' must be a filename or open filehandle";
+ }
- return $workbook;
+ return $self->_parse_workbook($zip, $workbook, $formatter);
}
sub _check_signature {