summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorichlubna <43234438+ichlubna@users.noreply.github.com>2018-11-16 09:40:31 +0100
committerEven Rouault <even.rouault@mines-paris.org>2018-11-16 09:40:31 +0100
commitc196b23b90321b5c7e3238294607a2e8626c503f (patch)
tree8ca93ad9c5f6fef6bc7aeb415f67c09e9bdf8c6f /src/lib
parent948332e6ed17565100d1df5f6fdbf66865218e36 (diff)
openjp3d: Int overflow fixed (#1159)
When compressing a lot of slices (starting from 44 FullHD slices with 3 8bit components in our experiments) the rate values are high enough to cause an int overflow that leads to negative lengths and wrong results. The cast happens too late.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/openjp3d/tcd.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/lib/openjp3d/tcd.c b/src/lib/openjp3d/tcd.c
index 013a9f1a..714a0565 100644
--- a/src/lib/openjp3d/tcd.c
+++ b/src/lib/openjp3d/tcd.c
@@ -226,10 +226,10 @@ void tcd_malloc_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp,
if (tcp->rates[j] <= 1) {
tcp->rates[j] = 0;
} else {
- float num = (float)(tile->numcomps * (tile->x1 - tile->x0) *
- (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec);
- float den = (float)(8 * volume->comps[0].dx * volume->comps[0].dy *
- volume->comps[0].dz);
+ float num = (float)tile->numcomps * (tile->x1 - tile->x0) *
+ (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec;
+ float den = 8.0f * volume->comps[0].dx * volume->comps[0].dy *
+ volume->comps[0].dz;
den = tcp->rates[j] * den;
tcp->rates[j] = (num + den - 1) / den;
}
@@ -537,10 +537,10 @@ void tcd_init_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp,
if (tcp->rates[j] <= 1) {
tcp->rates[j] = 0;
} else {
- float num = (float)(tile->numcomps * (tile->x1 - tile->x0) *
- (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec);
- float den = (float)(8 * volume->comps[0].dx * volume->comps[0].dy *
- volume->comps[0].dz);
+ float num = (float)tile->numcomps * (tile->x1 - tile->x0) *
+ (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec;
+ float den = 8.0f * volume->comps[0].dx * volume->comps[0].dy *
+ volume->comps[0].dz;
den = tcp->rates[j] * den;
tcp->rates[j] = (num + den - 1) / den;
}