[Mesa-dev] [PATCH 2/2] glsl: free or reuse memory allocated for TF varying
Gert Wollny
gert.wollny at collabora.com
Fri Nov 23 08:29:55 UTC 2018
Hello Tapani,
since you wrote the original code, could you have a look at this patch?
Many thanks,
Gert
Am Freitag, den 16.11.2018, 19:12 +0100 schrieb Gert Wollny:
> From: Gert Wollny <gert.wollny at collabora.com>
>
> When a shader program is de-serialized the gl_shader_program passed
> in
> may actually still hold memory allocations for the transform feedback
> varyings. If that is the case, free the varying names and reallocate
> the new storage for the names array.
>
> This fixes a memory leak:
> Direct leak of 48 byte(s) in 6 object(s) allocated from:
> in malloc (/usr/lib64/gcc/x86_64-pc-linux-
> gnu/7.3.0/libasan.so+0xdb880)
> in transform_feedback_varyings
> ../../samba/mesa/src/mesa/main/transformfeedback.c:875
> in _mesa_TransformFeedbackVaryings
> ../../samba/mesa/src/mesa/main/transformfeedback.c:985
> ...
> Indirect leak of 42 byte(s) in 6 object(s) allocated from:
> in __interceptor_strdup (/usr/lib64/gcc/x86_64-pc-linux-
> gnu/7.3.0/libasan.so+0x761c8)
> in transform_feedback_varyings
> ../../samba/mesa/src/mesa/main/transformfeedback.c:887
> in _mesa_TransformFeedbackVaryings
> ../../samba/mesa/src/mesa/main/transformfeedback.c:985
>
> Fixes: ab2643e4b06f63c93a57624003679903442634a8
> glsl: serialize data from glTransformFeedbackVaryings
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
> src/compiler/glsl/serialize.cpp | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/glsl/serialize.cpp
> b/src/compiler/glsl/serialize.cpp
> index 267700e7e7..26d8ec4b75 100644
> --- a/src/compiler/glsl/serialize.cpp
> +++ b/src/compiler/glsl/serialize.cpp
> @@ -360,13 +360,20 @@ read_xfb(struct blob_reader *metadata, struct
> gl_shader_program *shProg)
> if (xfb_stage == ~0u)
> return;
>
> + if (shProg->TransformFeedback.VaryingNames) {
> + for (unsigned i = 0; i < shProg->TransformFeedback.NumVarying;
> ++i)
> + free(shProg->TransformFeedback.VaryingNames[i]);
> + }
> +
> /* Data set by glTransformFeedbackVaryings. */
> shProg->TransformFeedback.BufferMode =
> blob_read_uint32(metadata);
> blob_copy_bytes(metadata, &shProg-
> >TransformFeedback.BufferStride,
> sizeof(shProg->TransformFeedback.BufferStride));
> shProg->TransformFeedback.NumVarying =
> blob_read_uint32(metadata);
> +
> shProg->TransformFeedback.VaryingNames = (char **)
> - malloc(shProg->TransformFeedback.NumVarying * sizeof(GLchar
> *));
> + realloc(shProg->TransformFeedback.VaryingNames,
> + shProg->TransformFeedback.NumVarying * sizeof(GLchar
> *));
> /* Note, malloc used with VaryingNames. */
> for (unsigned i = 0; i < shProg->TransformFeedback.NumVarying;
> i++)
> shProg->TransformFeedback.VaryingNames[i] =
More information about the mesa-dev
mailing list