From 2978a16c859dafab2bb75e95fc66229ffc8c4571 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 26 Jan 2016 13:59:10 +0300 Subject: [PATCH] core: preserve sizes values (fixes #5991) _sizes can point to internal structure which is destroyed by release() call --- modules/core/src/matrix.cpp | 15 +++++++++++++++ modules/core/src/umatrix.cpp | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 4a260eb646..08c5501e4e 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -397,6 +397,14 @@ void Mat::create(int d, const int* _sizes, int _type) return; } + int _sizes_backup[CV_MAX_DIM]; // #5991 + if (_sizes == (this->size.p)) + { + for(i = 0; i < d; i++ ) + _sizes_backup[i] = _sizes[i]; + _sizes = _sizes_backup; + } + release(); if( d == 0 ) return; @@ -4899,6 +4907,13 @@ void SparseMat::create(int d, const int* _sizes, int _type) return; } } + int _sizes_backup[CV_MAX_DIM]; // #5991 + if (_sizes == hdr->size) + { + for(i = 0; i < d; i++ ) + _sizes_backup[i] = _sizes[i]; + _sizes = _sizes_backup; + } release(); flags = MAGIC_VAL | _type; hdr = new Hdr(d, _sizes, _type); diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp index 98d6b8c589..958723b7b5 100644 --- a/modules/core/src/umatrix.cpp +++ b/modules/core/src/umatrix.cpp @@ -345,6 +345,14 @@ void UMat::create(int d, const int* _sizes, int _type, UMatUsageFlags _usageFlag return; } + int _sizes_backup[CV_MAX_DIM]; // #5991 + if (_sizes == (this->size.p)) + { + for(i = 0; i < d; i++ ) + _sizes_backup[i] = _sizes[i]; + _sizes = _sizes_backup; + } + release(); if( d == 0 ) return;