From 2ba9d8ebaaafe7dbac754f6f7e066c7db6411a4b Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Tue, 17 Mar 2020 03:24:53 -0400
Subject: [PATCH] Prevent invalid malloc and file handle leak in
 LLPreviewScript

---
 indra/newview/llpreviewscript.cpp | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index f499f14846e..102e9393745 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -599,18 +599,25 @@ bool LLScriptEdCore::loadScriptText(const std::string& filename)
 	fseek(file, 0L, SEEK_END);
 	size_t file_length = (size_t) ftell(file);
 	fseek(file, 0L, SEEK_SET);
-	char* buffer = new char[file_length+1];
-	size_t nread = fread(buffer, 1, file_length, file);
-	if (nread < file_length)
-	{
-		LL_WARNS() << "Short read" << LL_ENDL;
-	}
-	buffer[nread] = '\0';
-	fclose(file);
-
-	mEditor->setText(LLStringExplicit(buffer));
-	delete[] buffer;
-
+    if (file_length > 0)
+    {
+		auto buffer = std::make_unique<char[]>(file_length + 1);
+        size_t nread = fread(buffer.get(), 1, file_length, file);
+        if (nread < file_length)
+        {
+            LL_WARNS() << "Short read" << LL_ENDL;
+        }
+        buffer[nread] = '\0';
+        fclose(file);
+        
+        mEditor->setText(LLStringExplicit(buffer.get()));
+    }
+    else
+    {
+        LL_WARNS() << "Error getting file size " << filename << LL_ENDL;
+		fclose(file);
+        return false;
+    }
 	return true;
 }
 
-- 
GitLab