RT #117878: handle invalid image objects for write_multi()
authorTony Cook <tony@develop-help.com>
Mon, 19 Sep 2016 04:08:35 +0000 (14:08 +1000)
committerTony Cook <tony@develop-help.com>
Mon, 19 Sep 2016 04:08:35 +0000 (14:08 +1000)
write_multi() now returns an error result instead of crashing
if called with a string scalar, an unblessed reference or a
reference to non-Imager object.

Imager.pm
t/200-file/100-files.t

index 706eb6d..e5690b5 100644 (file)
--- a/Imager.pm
+++ b/Imager.pm
@@ -637,6 +637,9 @@ sub _combine {
 sub _valid_image {
   my ($self, $method) = @_;
 
+  ref $self
+    or return Imager->_set_error("$method needs an image object");
+
   $self->{IMG} && Scalar::Util::blessed($self->{IMG}) and return 1;
 
   my $msg = $self->{IMG} ? "images do not cross threads" : "empty input image";
@@ -1949,6 +1952,10 @@ sub write_multi {
   # translate to ImgRaw
   my $index = 1;
   for my $img (@images) {
+    unless (ref $img && Scalar::Util::blessed($img) && $img->isa("Imager")) {
+      $class->_set_error("write_multi: image $index is not an Imager image object");
+      return;
+    }
     unless ($img->_valid_image("write_multi")) {
       $class->_set_error($img->errstr . " (image $index)");
       return;
index f937019..bc602f1 100644 (file)
@@ -4,7 +4,7 @@
 # the file format
 
 use strict;
-use Test::More tests => 89;
+use Test::More tests => 93;
 use Imager;
 
 -d "testout" or mkdir "testout";
@@ -156,6 +156,16 @@ is(Imager->errstr, "check_file_limits: width must be a positive integer",
   ok(!Imager->write_multi({ data => \$data, type => "pnm" }, $good, $empty),
      "fail to write_multi an empty image");
   is(Imager->errstr, "write_multi: empty input image (image 2)");
+  Imager->_set_error("");
+  my $not_imager = bless {}, "Foo";
+  ok(!Imager->write_multi({ data => \$data, type => "pnm" }, $not_imager),
+     "fail to write_multi() a non-Imager object");
+  is(Imager->errstr, "write_multi: image 1 is not an Imager image object",
+     "check message");
+  ok(!Imager->write_multi({ data => \$data, type => "pnm" }, "Imager"),
+     "fail to write_multi() 'Imager' string");
+  is(Imager->errstr, "write_multi: image 1 is not an Imager image object",
+     "check message");
 }
 
 # check file type probe