Fixed a bug in FLANN resulting in uninitialized accesses.
authorRoman Donchenko <roman.donchenko@itseez.com>
Wed, 4 Sep 2013 10:06:34 +0000 (14:06 +0400)
committerRoman Donchenko <roman.donchenko@itseez.com>
Wed, 4 Sep 2013 10:06:34 +0000 (14:06 +0400)
This is fixed upstream in mariusmuja/flann@b615f26, but that fix
would break binary compatibility, so I had to make a different one.

Since the bug isn't quite obvious, here's an explanation. In the const
version of any::cast, if policy is a small_any_policy, its get_value
returns its input argument. So r becomes a pointer to obj, and the
return value is a reference to a local variable, which is invalidated
when the function exits.

modules/flann/include/opencv2/flann/any.h

index 89189c6..7140b2a 100644 (file)
@@ -255,8 +255,7 @@ public:
     const T& cast() const
     {
         if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
-        void* obj = const_cast<void*>(object);
-        T* r = reinterpret_cast<T*>(policy->get_value(&obj));
+        T* r = reinterpret_cast<T*>(policy->get_value(const_cast<void **>(&object)));
         return *r;
     }