[Piglit] [PATCH] util: use piglit_load_text_file() in piglit_compile_shader()

Brian Paul brianp at vmware.com
Mon Apr 28 14:13:23 PDT 2014


The old code had a problem on MinGW.  If the shader/text file had
DOS-style \r\n line endings, fread() would convert them to Unix-style
\n line endings.  Since the actual number of chars read by fread()
was less than the stat()'d size, we put the terminating '\0' in the
wrong place, possibly after some garbage characters in the buffer.

This sometimes caused the GLSL compiler to generate an error when it
found those garbage chars.

A Heisenbug:  I was seeing failures w/out gdb but success w/ gdb. Ugh!
---
 tests/util/piglit-shader.c |   16 +++-------------
 1 file changed, 3 insertions(+), 13 deletions(-)

diff --git a/tests/util/piglit-shader.c b/tests/util/piglit-shader.c
index b326abd..0aa4d02 100644
--- a/tests/util/piglit-shader.c
+++ b/tests/util/piglit-shader.c
@@ -69,7 +69,6 @@ piglit_compile_shader(GLenum target, const char *filename)
 	struct stat st;
 	int err;
 	GLchar *prog_string;
-	FILE *f;
 	const char *source_dir;
 	char filename_with_path[FILENAME_MAX];
 
@@ -89,21 +88,12 @@ piglit_compile_shader(GLenum target, const char *filename)
 		exit(1);
 	}
 
-	prog_string = malloc(st.st_size + 1);
-	if (prog_string == NULL) {
-		fprintf(stderr, "malloc\n");
+	prog_string = piglit_load_text_file(filename_with_path, NULL);
+	if (!prog_string) {
+		fprintf(stderr, "Unable to read %s\n", filename_with_path);
 		exit(1);
 	}
 
-	f = fopen(filename_with_path, "r");
-	if (f == NULL) {
-		fprintf(stderr, "Couldn't open program: %s\n", strerror(errno));
-		exit(1);
-	}
-	fread(prog_string, 1, st.st_size, f);
-	prog_string[st.st_size] = '\0';
-	fclose(f);
-
 	prog = piglit_compile_shader_text(target, prog_string);
 
 	free(prog_string);
-- 
1.7.10.4



More information about the Piglit mailing list