diff --git a/third_party/lcms/src/cmsopt.c b/third_party/lcms/src/cmsopt.c index e3212fb4d..a5475709b 100644 --- a/third_party/lcms/src/cmsopt.c +++ b/third_party/lcms/src/cmsopt.c @@ -100,6 +100,15 @@ typedef struct { } Curves16Data; +// A simple adapter to prevent _cmsPipelineEval16Fn vs. _cmsInterpFn16 +// confusion, which trips up UBSAN. +static +void Lerp16Adapter(CMSREGISTER const cmsUInt16Number in[], + CMSREGISTER cmsUInt16Number out[], + const void* data) { + cmsInterpParams* params = (cmsInterpParams*)data; + params->Interpolation.Lerp16(in, out, params); +} // Simple optimizations ---------------------------------------------------------------------------------------------------------- @@ -805,7 +814,7 @@ Error: if (DataSetIn == NULL && DataSetOut == NULL) { - _cmsPipelineSetOptimizationParameters(Dest, (_cmsPipelineEval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL); + _cmsPipelineSetOptimizationParameters(Dest, Lerp16Adapter, DataCLUT->Params, NULL, NULL); } else {