diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-05-12 16:33:31 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-05-12 16:48:55 +0300 |
commit | f0f481031cc5eb57e848ca11a6989565c74a0e56 (patch) | |
tree | bf3b06b359107d19a8f717393d94607dc56a95d6 /intern/cycles/render | |
parent | 7c2905b8ec6fb2a8f4929c1f0b631a8b9d391c03 (diff) |
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.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/image.cpp | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index f0608965d09..c62afcd7719 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -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; } } |