- validate chan_count for chans == NULL for each of the i_gsamp()
authorTony Cook <tony@develop=help.com>
Tue, 30 Oct 2007 07:34:55 +0000 (07:34 +0000)
committerTony Cook <tony@develop=help.com>
Tue, 30 Oct 2007 07:34:55 +0000 (07:34 +0000)
   implementations.

Changes
TODO
image.c
img16.c
imgdouble.c
palimg.c

diff --git a/Changes b/Changes
index 9427270..ea0ad28 100644 (file)
--- a/Changes
+++ b/Changes
@@ -40,6 +40,10 @@ Bug fixes:
    under 0x10000.  This was most noticable when writing large RLE images.
    http://rt.cpan.org/Ticket/Display.html?id=30335
 
+ - validate chan_count for chans == NULL for each of the i_gsamp()
+   implementations.
+   http://rt.cpan.org/Ticket/Display.html?id=28985
+
 Imager 0.60 - 30 August 2007
 ===========
 
diff --git a/TODO b/TODO
index fe2350b..583b2e0 100644 (file)
--- a/TODO
+++ b/TODO
@@ -36,7 +36,7 @@ read DIBS (#29055)
 
 library search path on 64-bit centos (#29045)
 
-i_gsamp() chan_count validation (#28985)
+i_gsamp() chan_count validation (#28985) (done)
 
 Imager::Font::Wrap doesn't correctly set savepos (#29771)
 
diff --git a/image.c b/image.c
index 76cdaf9..85cbb2b 100644 (file)
--- a/image.c
+++ b/image.c
@@ -1689,6 +1689,11 @@ i_gsamp_d(i_img *im, int l, int r, int y, i_sample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         for (ch = 0; ch < chan_count; ++ch) {
           *samps++ = data[ch];
@@ -1751,6 +1756,11 @@ i_gsampf_d(i_img *im, int l, int r, int y, i_fsample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         for (ch = 0; ch < chan_count; ++ch) {
           *samps++ = Sample8ToF(data[ch]);
diff --git a/img16.c b/img16.c
index 4be3416..e17d40d 100644 (file)
--- a/img16.c
+++ b/img16.c
@@ -452,6 +452,11 @@ static int i_gsamp_d16(i_img *im, int l, int r, int y, i_sample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         for (ch = 0; ch < chan_count; ++ch) {
           *samps++ = GET16as8(im->idata, off+ch);
@@ -497,6 +502,11 @@ static int i_gsampf_d16(i_img *im, int l, int r, int y, i_fsample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         for (ch = 0; ch < chan_count; ++ch) {
           *samps++ = Sample16ToF(GET16(im->idata, off+ch));
index 435fac7..b9df1e3 100644 (file)
@@ -345,6 +345,11 @@ static int i_gsamp_ddoub(i_img *im, int l, int r, int y, i_sample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         for (ch = 0; ch < chan_count; ++ch) {
           *samps++ = SampleFTo8(((double *)im->idata)[off+ch]);
@@ -390,6 +395,11 @@ static int i_gsampf_ddoub(i_img *im, int l, int r, int y, i_fsample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         for (ch = 0; ch < chan_count; ++ch) {
           *samps++ = ((double *)im->idata)[off+ch];
index 8849833..75c56cc 100644 (file)
--- a/palimg.c
+++ b/palimg.c
@@ -426,6 +426,11 @@ static int i_gsamp_p(i_img *im, int l, int r, int y, i_sample_t *samps,
       }
     }
     else {
+      if (chan_count <= 0 || chan_count > im->channels) {
+       i_push_errorf(0, "chan_count %d out of range, must be >0, <= channels", 
+                     chan_count);
+       return 0;
+      }
       for (i = 0; i < w; ++i) {
         i_palidx which = *data++;
         if (which < palsize) {