[Piglit] [PATCH v1 2/2] test: fix resources usage for depthstencil-render-miplevels

Sergii Romantsov sergii.romantsov at gmail.com
Wed Nov 21 10:18:53 UTC 2018


Usage test 'depthstencil-render-miplevels 200 s=z24_s8' causes core dump on exit.
Issues:
1. Allocation of memory many times to the same variable
2. Not complete array to store pointers
3. Absence of memory freeing

CC: Eric Anholt <eric at anholt.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108819
Fixes: 7a0e61d7792f (depthstencil-render-miplevels: Present the results in non-auto mode.)
Signed-off-by: Sergii Romantsov <sergii.romantsov at globallogic.com>
---
 tests/texturing/depthstencil-render-miplevels.cpp | 37 ++++++++++++++++++-----
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/tests/texturing/depthstencil-render-miplevels.cpp b/tests/texturing/depthstencil-render-miplevels.cpp
index 87af92f..f3b1d02 100644
--- a/tests/texturing/depthstencil-render-miplevels.cpp
+++ b/tests/texturing/depthstencil-render-miplevels.cpp
@@ -86,6 +86,9 @@
 
 #include "piglit-util-gl.h"
 
+extern "C" void
+piglit_deinit(void);
+
 PIGLIT_GL_TEST_CONFIG_BEGIN
 
 	config.supports_gl_compat_version = 10;
@@ -94,6 +97,7 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
 	config.window_height = 512;
 	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
 	config.khr_no_error_support = PIGLIT_NO_ERRORS;
+	config.deinit = piglit_deinit;
 
 PIGLIT_GL_TEST_CONFIG_END
 
@@ -109,9 +113,28 @@ bool attach_together = false;
 bool attach_stencil_first = false;
 GLenum depth_format;
 int miplevel0_size;
-int max_miplevel;
-float **depth_miplevel_data;
-uint8_t **stencil_miplevel_data;
+int max_miplevel = 0;
+float **depth_miplevel_data = NULL;
+uint8_t **stencil_miplevel_data = NULL;
+
+extern "C" void
+piglit_deinit()
+{
+	if (depth_miplevel_data)
+	{
+		for (int i = 0; i <= max_miplevel; ++i)
+			if (depth_miplevel_data[i])
+				free(depth_miplevel_data[i]);
+		free(depth_miplevel_data);
+	}
+	if (stencil_miplevel_data)
+	{
+		for (int i = 0; i <= max_miplevel; ++i)
+			if (stencil_miplevel_data[i])
+				free(stencil_miplevel_data[i]);
+		free(stencil_miplevel_data);
+	}
+}
 
 /**
  * Check if the given depth/stencil/rgba texture internal format is supported.
@@ -279,7 +302,7 @@ test_miplevel(int level)
 
 		if (!piglit_automatic) {
 			depth_miplevel_data[level] =
-				(float *)malloc(4 * dim * dim);
+				(float *)realloc(depth_miplevel_data[level], 4 * dim * dim);
 			glReadPixels(0, 0, dim, dim,
 				     GL_DEPTH_COMPONENT, GL_FLOAT,
 				     depth_miplevel_data[level]);
@@ -294,7 +317,7 @@ test_miplevel(int level)
 
 		if (!piglit_automatic) {
 			stencil_miplevel_data[level] =
-				(uint8_t *)malloc(dim * dim);
+				(uint8_t *)realloc(stencil_miplevel_data[level], dim * dim);
 			glReadPixels(0, 0, dim, dim,
 				     GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,
 				     stencil_miplevel_data[level]);
@@ -360,8 +383,8 @@ piglit_init(int argc, char **argv)
 	piglit_require_extension("GL_ARB_depth_texture");
 	piglit_require_extension("GL_ARB_texture_non_power_of_two");
 
-	depth_miplevel_data = (float **)calloc(max_miplevel, sizeof(float *));
-	stencil_miplevel_data = (uint8_t **)calloc(max_miplevel,
+	depth_miplevel_data = (float **)calloc(max_miplevel + 1, sizeof(float *));
+	stencil_miplevel_data = (uint8_t **)calloc(max_miplevel + 1,
 						   sizeof(uint8_t *));
 
 	/* argv[2]: buffer combination */
-- 
2.7.4



More information about the Piglit mailing list