Color management: fix crashes and memory leaks when using custom OCIO configuration
[blender.git] / intern / opencolorio / ocio_capi.cpp
index d67cea618368b2dee0582c0122c715cd5ed81d65..2fa66e5d2f5de06e23983654a3cc9a8b7c7bb5e4 100644 (file)
 #endif
 
 #define MEM_NEW(type) new(MEM_mallocN(sizeof(type), __func__)) type()
-#define MEM_DELETE(what, type) { what->~type(); MEM_freeN(what); } (void)0
+#define MEM_DELETE(what, type) if(what) { what->~type(); MEM_freeN(what); } (void)0
 
 static void OCIO_reportError(const char *err)
 {
        std::cerr << "OpenColorIO Error: " << err << std::endl;
 
-       OCIO_abort();
+       // OCIO_abort();
 }
 
 static void OCIO_reportException(Exception &exception)
@@ -75,6 +75,8 @@ ConstConfigRcPtr *OCIO_getCurrentConfig(void)
                OCIO_reportException(exception);
        }
 
+       MEM_DELETE(config, ConstConfigRcPtr);
+
        return NULL;
 }
 
@@ -107,6 +109,8 @@ ConstConfigRcPtr *OCIO_configCreateFromEnv(void)
                OCIO_reportException(exception);
        }
 
+       MEM_DELETE(config, ConstConfigRcPtr);
+
        return NULL;
 }
 
@@ -125,6 +129,8 @@ ConstConfigRcPtr *OCIO_configCreateFromFile(const char *filename)
                OCIO_reportException(exception);
        }
 
+       MEM_DELETE(config, ConstConfigRcPtr);
+
        return NULL;
 }
 
@@ -169,9 +175,10 @@ ConstColorSpaceRcPtr *OCIO_configGetColorSpace(ConstConfigRcPtr *config, const c
        }
        catch (Exception &exception) {
                OCIO_reportException(exception);
-               MEM_DELETE(cs, ConstColorSpaceRcPtr);
        }
 
+       MEM_DELETE(cs, ConstColorSpaceRcPtr);
+
        return NULL;
 }
 
@@ -314,6 +321,8 @@ ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(ConstConfigRcPtr *config,
                OCIO_reportException(exception);
        }
 
+       MEM_DELETE(p, ConstProcessorRcPtr);
+
        return 0;
 }
 
@@ -331,6 +340,8 @@ ConstProcessorRcPtr *OCIO_configGetProcessor(ConstConfigRcPtr *config, ConstTran
                OCIO_reportException(exception);
        }
 
+       MEM_DELETE(p, ConstProcessorRcPtr);
+
        return NULL;
 }