From e50ec2c3501c3264cf52b1690f6087f587de8e8c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Dec 2017 09:14:19 -0800 Subject: [PATCH] GLES: Validate shader cache filesize on preload. --- GPU/GLES/ShaderManagerGLES.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index fe1525ddf0..017232ec7b 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -957,6 +957,7 @@ struct CacheHeader { void ShaderManagerGLES::LoadAndPrecompile(const std::string &filename) { File::IOFile f(filename, "rb"); + u64 sz = f.GetSize(); if (!f.IsOpen()) { return; } @@ -971,8 +972,20 @@ void ShaderManagerGLES::LoadAndPrecompile(const std::string &filename) { double start = time_now_d(); // Sanity check the file contents - if (header.numFragmentShaders > 1000 || header.numVertexShaders > 1000 || header.numLinkedPrograms > 1000) + if (header.numFragmentShaders > 1000 || header.numVertexShaders > 1000 || header.numLinkedPrograms > 1000) { + ERROR_LOG(G3D, "Corrupt shader cache file header, aborting."); return; + } + + // Also make sure the size makes sense, in case there's corruption. + u64 expectedSize = sizeof(header); + expectedSize += header.numVertexShaders * sizeof(VShaderID); + expectedSize += header.numFragmentShaders * sizeof(FShaderID); + expectedSize += header.numLinkedPrograms * (sizeof(VShaderID) + sizeof(FShaderID)); + if (sz != expectedSize) { + ERROR_LOG(G3D, "Shader cache file is too large, aborting."); + return; + } for (int i = 0; i < header.numVertexShaders; i++) { VShaderID id;