Fix T93310: crash due to broken image paths

The crash was caused by allocating an uninitialized amount of memory.
This fix initializes a bunch of variables that could cause the error.

It should be possible to also fix this in the function that actually uses
the uninitialized memory, but that could cause unknown consequences
that are a bit too risky for 3.0. Just initializing some variables should
be safe though. For more details see D13369.

Differential Revision: https://developer.blender.org/D13369
This commit is contained in:
Jacques Lucke 2021-11-29 19:23:43 +01:00
parent aa7051c8f2
commit e7ae9f493a
Notes: blender-bot 2023-02-14 09:02:40 +01:00
Referenced by issue #93527, Toggling Collection Viewlayer visibility messes up the visibility of children objects
Referenced by issue #93310, Compositor: Crash due to broken image paths
13 changed files with 18 additions and 18 deletions

View File

@ -150,7 +150,7 @@ void NodeOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
modify_determined_canvas_fn_(r_area);
}
rcti unused_area;
rcti unused_area = COM_AREA_NONE;
const rcti &local_preferred_area = r_area;
for (unsigned int index = 0; index < inputs_.size(); index++) {
if (index == used_canvas_index) {

View File

@ -351,7 +351,7 @@ class NodeOperation {
*/
eExecutionModel execution_model_;
rcti canvas_;
rcti canvas_ = COM_AREA_NONE;
/**
* Flags how to evaluate this operation.

View File

@ -52,7 +52,7 @@ void MathBaseOperation::deinit_execution()
void MathBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
{
NodeOperationInput *socket;
rcti temp_area;
rcti temp_area = COM_AREA_NONE;
socket = this->get_input_socket(0);
const bool determined = socket->determine_canvas(COM_AREA_NONE, temp_area);
if (determined) {

View File

@ -70,7 +70,7 @@ void MixBaseOperation::execute_pixel_sampled(float output[4],
void MixBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
{
NodeOperationInput *socket;
rcti temp_area;
rcti temp_area = COM_AREA_NONE;
socket = this->get_input_socket(1);
bool determined = socket->determine_canvas(COM_AREA_NONE, temp_area);

View File

@ -81,7 +81,7 @@ class PlaneTrackMaskOperation : public PlaneDistortMaskOperation, public PlaneTr
{
PlaneTrackCommon::determine_canvas(preferred_area, r_area);
rcti unused;
rcti unused = COM_AREA_NONE;
rcti &preferred = r_area;
NodeOperation::determine_canvas(preferred, unused);
}
@ -102,7 +102,7 @@ class PlaneTrackWarpImageOperation : public PlaneDistortWarpImageOperation,
{
PlaneTrackCommon::determine_canvas(preferred_area, r_area);
rcti unused;
rcti unused = COM_AREA_NONE;
rcti &preferred = r_area;
NodeOperation::determine_canvas(preferred, unused);
}

View File

@ -227,7 +227,7 @@ void RotateOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
get_input_socket(IMAGE_INPUT_INDEX)->determine_canvas(preferred_area, r_area);
if (image_determined) {
rcti input_canvas = r_area;
rcti unused;
rcti unused = COM_AREA_NONE;
get_input_socket(DEGREE_INPUT_INDEX)->determine_canvas(input_canvas, unused);
ensure_degree();

View File

@ -223,7 +223,7 @@ void ScaleOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
get_input_socket(IMAGE_INPUT_INDEX)->determine_canvas(preferred_area, r_area);
if (image_determined) {
rcti image_canvas = r_area;
rcti unused;
rcti unused = COM_AREA_NONE;
NodeOperationInput *x_socket = get_input_socket(X_INPUT_INDEX);
NodeOperationInput *y_socket = get_input_socket(Y_INPUT_INDEX);
x_socket->determine_canvas(image_canvas, unused);
@ -503,7 +503,7 @@ void ScaleFixedSizeOperation::determine_canvas(const rcti &preferred_area, rcti
rcti local_preferred = preferred_area;
local_preferred.xmax = local_preferred.xmin + new_width_;
local_preferred.ymax = local_preferred.ymin + new_height_;
rcti input_canvas;
rcti input_canvas = COM_AREA_NONE;
const bool input_determined = get_input_socket(0)->determine_canvas(local_preferred,
input_canvas);
if (input_determined) {

View File

@ -60,7 +60,7 @@ void SplitOperation::execute_pixel_sampled(float output[4],
void SplitOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
{
rcti unused_area;
rcti unused_area = COM_AREA_NONE;
const bool determined = this->get_input_socket(0)->determine_canvas(COM_AREA_NONE, unused_area);
this->set_canvas_input_index(determined ? 0 : 1);

View File

@ -80,7 +80,7 @@ void TextureBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_
if (execution_model_ == eExecutionModel::FullFrame) {
/* Determine inputs. */
rcti temp;
rcti temp = COM_AREA_NONE;
NodeOperation::determine_canvas(r_area, temp);
}
}

View File

@ -126,7 +126,7 @@ void TransformOperation::determine_canvas(const rcti &preferred_area, rcti &r_ar
get_input_socket(IMAGE_INPUT_INDEX)->determine_canvas(preferred_area, r_area);
if (image_determined) {
rcti image_canvas = r_area;
rcti unused;
rcti unused = COM_AREA_NONE;
get_input_socket(X_INPUT_INDEX)->determine_canvas(image_canvas, unused);
get_input_socket(Y_INPUT_INDEX)->determine_canvas(image_canvas, unused);
get_input_socket(DEGREE_INPUT_INDEX)->determine_canvas(image_canvas, unused);

View File

@ -35,9 +35,9 @@ class TransformOperation : public MultiThreadedOperation {
int translate_x_;
int translate_y_;
float scale_;
rcti scale_canvas_;
rcti rotate_canvas_;
rcti translate_canvas_;
rcti scale_canvas_ = COM_AREA_NONE;
rcti rotate_canvas_ = COM_AREA_NONE;
rcti translate_canvas_ = COM_AREA_NONE;
/* Set variables. */
PixelSampler sampler_;

View File

@ -158,7 +158,7 @@ void TranslateCanvasOperation::determine_canvas(const rcti &preferred_area, rcti
if (determined) {
NodeOperationInput *x_socket = get_input_socket(X_INPUT_INDEX);
NodeOperationInput *y_socket = get_input_socket(Y_INPUT_INDEX);
rcti unused;
rcti unused = COM_AREA_NONE;
x_socket->determine_canvas(r_area, unused);
y_socket->determine_canvas(r_area, unused);

View File

@ -69,7 +69,7 @@ void *VariableSizeBokehBlurOperation::initialize_tile_data(rcti *rect)
data->bokeh = (MemoryBuffer *)input_bokeh_program_->initialize_tile_data(rect);
data->size = (MemoryBuffer *)input_size_program_->initialize_tile_data(rect);
rcti rect2;
rcti rect2 = COM_AREA_NONE;
this->determine_depending_area_of_interest(
rect, (ReadBufferOperation *)input_size_program_, &rect2);
@ -398,7 +398,7 @@ void VariableSizeBokehBlurOperation::update_memory_buffer_partial(MemoryBuffer *
p.image_width = this->get_width();
p.image_height = this->get_height();
rcti scalar_area;
rcti scalar_area = COM_AREA_NONE;
this->get_area_of_interest(SIZE_INPUT_INDEX, area, scalar_area);
BLI_rcti_isect(&scalar_area, &p.size_input->get_rect(), &scalar_area);
const float max_size = p.size_input->get_max_value(scalar_area);