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