Fix T44616: Cycles crashes loading 42k by 21k textures
Simple integer overflow issue. TODO(sergey): Check on CPU cubic sampling, it might also need size_t.
This commit is contained in:
@@ -407,7 +407,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
int scanlinesize = width*components*sizeof(uchar);
|
||||
|
||||
in->read_image(TypeDesc::UINT8,
|
||||
(uchar*)pixels + (height-1)*scanlinesize,
|
||||
(uchar*)pixels + (((size_t)height)-1)*scanlinesize,
|
||||
AutoStride,
|
||||
-scanlinesize,
|
||||
AutoStride);
|
||||
@@ -425,9 +425,10 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
builtin_image_pixels_cb(img->filename, img->builtin_data, pixels);
|
||||
}
|
||||
|
||||
size_t num_pixels = ((size_t)width) * height * depth;
|
||||
if(cmyk) {
|
||||
/* CMYK */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+2] = (pixels[i*4+2]*pixels[i*4+3])/255;
|
||||
pixels[i*4+1] = (pixels[i*4+1]*pixels[i*4+3])/255;
|
||||
pixels[i*4+0] = (pixels[i*4+0]*pixels[i*4+3])/255;
|
||||
@@ -436,7 +437,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
}
|
||||
else if(components == 2) {
|
||||
/* grayscale + alpha */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = pixels[i*2+1];
|
||||
pixels[i*4+2] = pixels[i*2+0];
|
||||
pixels[i*4+1] = pixels[i*2+0];
|
||||
@@ -445,7 +446,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
}
|
||||
else if(components == 3) {
|
||||
/* RGB */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 255;
|
||||
pixels[i*4+2] = pixels[i*3+2];
|
||||
pixels[i*4+1] = pixels[i*3+1];
|
||||
@@ -454,7 +455,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
}
|
||||
else if(components == 1) {
|
||||
/* grayscale */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 255;
|
||||
pixels[i*4+2] = pixels[i];
|
||||
pixels[i*4+1] = pixels[i];
|
||||
@@ -463,7 +464,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
}
|
||||
|
||||
if(img->use_alpha == false) {
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 255;
|
||||
}
|
||||
}
|
||||
@@ -529,7 +530,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
vector<float> tmppixels;
|
||||
|
||||
if(components > 4) {
|
||||
tmppixels.resize(width*height*components);
|
||||
tmppixels.resize(((size_t)width)*height*components);
|
||||
readpixels = &tmppixels[0];
|
||||
}
|
||||
|
||||
@@ -547,7 +548,8 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
}
|
||||
|
||||
if(components > 4) {
|
||||
for(int i = width*height-1; i >= 0; i--) {
|
||||
size_t dimensions = ((size_t)width)*height;
|
||||
for(size_t i = dimensions-1, pixel = 0; pixel < dimensions; pixel++, i--) {
|
||||
pixels[i*4+3] = tmppixels[i*components+3];
|
||||
pixels[i*4+2] = tmppixels[i*components+2];
|
||||
pixels[i*4+1] = tmppixels[i*components+1];
|
||||
@@ -566,9 +568,10 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
builtin_image_float_pixels_cb(img->filename, img->builtin_data, pixels);
|
||||
}
|
||||
|
||||
size_t num_pixels = ((size_t)width) * height * depth;
|
||||
if(cmyk) {
|
||||
/* CMYK */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 255;
|
||||
pixels[i*4+2] = (pixels[i*4+2]*pixels[i*4+3])/255;
|
||||
pixels[i*4+1] = (pixels[i*4+1]*pixels[i*4+3])/255;
|
||||
@@ -577,7 +580,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
}
|
||||
else if(components == 2) {
|
||||
/* grayscale + alpha */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = pixels[i*2+1];
|
||||
pixels[i*4+2] = pixels[i*2+0];
|
||||
pixels[i*4+1] = pixels[i*2+0];
|
||||
@@ -586,7 +589,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
}
|
||||
else if(components == 3) {
|
||||
/* RGB */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 1.0f;
|
||||
pixels[i*4+2] = pixels[i*3+2];
|
||||
pixels[i*4+1] = pixels[i*3+1];
|
||||
@@ -595,7 +598,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
}
|
||||
else if(components == 1) {
|
||||
/* grayscale */
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 1.0f;
|
||||
pixels[i*4+2] = pixels[i];
|
||||
pixels[i*4+1] = pixels[i];
|
||||
@@ -604,7 +607,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
|
||||
}
|
||||
|
||||
if(img->use_alpha == false) {
|
||||
for(int i = width*height*depth-1; i >= 0; i--) {
|
||||
for(size_t i = num_pixels-1, pixel = 0; pixel < num_pixels; pixel++, i--) {
|
||||
pixels[i*4+3] = 1.0f;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user