From 182302c3e75014ead9de65986139d088185b9606 Mon Sep 17 00:00:00 2001
From: Dale Glass <dale@daleglass.net>
Date: Sat, 28 Nov 2020 02:07:08 +0100
Subject: [PATCH] GL_TEXTURE_FREE_MEMORY_ATI returns 4 values, not just 1

This should fix a buffer overflow that happens on ATI cards.
---
 libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
index ef247b0835..38aca093cd 100644
--- a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
+++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
@@ -219,19 +219,21 @@ void GLBackend::init() {
 }
 
 size_t GLBackend::getAvailableMemory() {
-    GLint mem;
+    // GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX returns 1 value
+    // GL_TEXTURE_FREE_MEMORY_ATI returns 4 values, we only need the first
+    GLint mem[4] = {0,0,0,0};
 
     switch( _videoCard ) {
         case NVIDIA:
 #if !defined(Q_OS_ANDROID)
-            glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &mem);
+            glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &mem[0]);
 #endif
-            return mem * BYTES_PER_KIB;
+            return mem[0] * BYTES_PER_KIB;
         case ATI:
 #if !defined(Q_OS_ANDROID)
-            glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &mem);
+            glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &mem[0]);
 #endif
-            return mem * BYTES_PER_KIB;
+            return mem[0] * BYTES_PER_KIB;
         case MESA:
             return 0; // Don't know the current value
         case Unknown:
@@ -1002,4 +1004,4 @@ void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevRend
 
 void GLBackend::syncProgram(const gpu::ShaderPointer& program) {
     gpu::gl::GLShader::sync(*this, *program);
-}
\ No newline at end of file
+}