From 2d810a89e499e4a1db8894e28924432529f8b6eb Mon Sep 17 00:00:00 2001 From: Berthold Krevert <berthold.krevert@basyskom.com> Date: Mon, 27 Oct 2014 14:03:22 +0100 Subject: [PATCH] Don't crash if CanvasUniformLocation is 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CanvasContext::getUniformLocation returns 0, if the shader program does not declare the requested uniform (as defined in the WebGL spec). That does mean, we have to check for 0 in the uniform* functions to avoid crashes. This is already done for most of the uniform* functions. This commit introduces the remaining checks. Change-Id: If123b5026e9a878913621c0bbba81bf77e5a433f Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com> Reviewed-by: Pasi Keränen <pasi.keranen@digia.com> --- src/context3d.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/context3d.cpp b/src/context3d.cpp index 6d351cc..45aef2c 100644 --- a/src/context3d.cpp +++ b/src/context3d.cpp @@ -2786,6 +2786,9 @@ void CanvasContext::uniform1fva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + float *arrayData = new float[array.length()]; ArrayUtils::fillFloatArrayFromVariantList(array, arrayData); glUniform1fv(location->id(), array.count(), arrayData); @@ -2805,6 +2808,9 @@ void CanvasContext::uniform2fva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + float *arrayData = new float[array.length()]; ArrayUtils::fillFloatArrayFromVariantList(array, arrayData); glUniform2fv(location->id(), array.count() / 2, arrayData); @@ -2824,6 +2830,9 @@ void CanvasContext::uniform3fva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + float *arrayData = new float[array.length()]; ArrayUtils::fillFloatArrayFromVariantList(array, arrayData); glUniform3fv(location->id(), array.count() / 3, arrayData); @@ -2843,6 +2852,9 @@ void CanvasContext::uniform4fva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + float *arrayData = new float[array.count()]; ArrayUtils::fillFloatArrayFromVariantList(array, arrayData); glUniform4fv(location->id(), array.count() / 4, arrayData); @@ -2862,6 +2874,9 @@ void CanvasContext::uniform1iva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + int *arrayData = new int[array.length()]; ArrayUtils::fillIntArrayFromVariantList(array, arrayData); glUniform1iv(location->id(), array.count(), arrayData); @@ -2882,6 +2897,9 @@ void CanvasContext::uniform2iva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + int *arrayData = new int[array.length()]; ArrayUtils::fillIntArrayFromVariantList(array, arrayData); glUniform2iv(location->id(), array.count() / 2, arrayData); @@ -2902,6 +2920,9 @@ void CanvasContext::uniform3iva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + int *arrayData = new int[array.length()]; ArrayUtils::fillIntArrayFromVariantList(array, arrayData); glUniform3iv(location->id(), array.count() / 3, arrayData); @@ -2922,6 +2943,9 @@ void CanvasContext::uniform4iva(CanvasUniformLocation *location, QVariantList ar << "(location:" << location << ", array:" << array << ")"; + if (!location) + return; + int *arrayData = new int[array.length()]; ArrayUtils::fillIntArrayFromVariantList(array, arrayData); glUniform4iv(location->id(), array.length() / 4, arrayData); -- GitLab