Fix mem leak in SSE code generation path (Michel Dänzer) and don't crash if _mesa_exe...
authorBrian <brian.paul@tungstengraphics.com>
Sat, 3 Nov 2007 14:50:55 +0000 (08:50 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Sat, 3 Nov 2007 14:50:55 +0000 (08:50 -0600)
(picked from mesa_7_0_branch)

src/mesa/tnl/t_vertex_sse.c
src/mesa/x86/rtasm/x86sse.c
src/mesa/x86/rtasm/x86sse.h

index ad4cc62d5f7d8f586602e6229a193c2bd1297435..9515d9f81f53192820825d369d9fed12ebec9bba 100644 (file)
 #include "x86/common_x86_asm.h"
 
 
+/**
+ * Number of bytes to allocate for generated SSE functions
+ */
+#define MAX_SSE_CODE_SIZE 1024
+
+
 #define X    0
 #define Y    1
 #define Z    2
@@ -348,8 +354,6 @@ static GLboolean build_vertex_emit( struct x86_program *p )
    struct x86_reg vp1 = x86_make_reg(file_XMM, 2);
    GLubyte *fixup, *label;
 
-   x86_init_func(&p->func);
-   
    /* Push a few regs?
     */
    x86_push(&p->func, countEBP);
@@ -621,7 +625,10 @@ static GLboolean build_vertex_emit( struct x86_program *p )
    x86_pop(&p->func, countEBP);
    x86_ret(&p->func);
 
+   assert(!vtx->emit);
    vtx->emit = (tnl_emit_func)x86_get_func(&p->func);
+
+   assert( (char *) p->func.csr - (char *) p->func.store <= MAX_SSE_CODE_SIZE );
    return GL_TRUE;
 }
 
@@ -646,7 +653,10 @@ void _tnl_generate_sse_emit( GLcontext *ctx )
    p.identity = x86_make_reg(file_XMM, 6);
    p.chan0 = x86_make_reg(file_XMM, 7);
 
-   x86_init_func(&p.func);
+   if (!x86_init_func(&p.func, MAX_SSE_CODE_SIZE)) {
+      vtx->emit = NULL;
+      return;
+   }
 
    if (build_vertex_emit(&p)) {
       _tnl_register_fastpath( vtx, GL_TRUE );
index 3ea37bb5e76137673d6b92ef91a70fcff7432bf0..612cd51a6eeda4f5a9ab2bb5180ce4acb4d4cc5b 100644 (file)
@@ -1063,20 +1063,29 @@ struct x86_reg x86_fn_arg( struct x86_function *p,
 }
 
 
-void x86_init_func( struct x86_function *p )
-{
-   x86_init_func_size(p, 1024);
-}
-
-void x86_init_func_size( struct x86_function *p, GLuint code_size )
+/**
+ * Initialize an x86_function object, allocating space for up to
+ * 'code_size' bytes of code.
+ */
+GLboolean x86_init_func( struct x86_function *p, GLuint code_size )
 {
+   assert(!p->store);
    p->store = _mesa_exec_malloc(code_size);
-   p->csr = p->store;
+   if (p->store) {
+      p->csr = p->store;
+      return GL_TRUE;
+   }
+   else {
+      p->csr = NULL;
+      return GL_FALSE;
+   }
 }
 
 void x86_release_func( struct x86_function *p )
 {
-   _mesa_exec_free(p->store);
+   if (p->store)
+      _mesa_exec_free(p->store);
+   p->store = p->csr = NULL;
 }
 
 
index 66fb852ac98cc89d3008ffe741de2b48d86acc6c..42b09937bca2cb80a65a3c644f88cda8a637a15a 100644 (file)
@@ -80,8 +80,7 @@ enum sse_cc {
  */
 
 
-void x86_init_func( struct x86_function *p );
-void x86_init_func_size( struct x86_function *p, GLuint code_size );
+GLboolean x86_init_func( struct x86_function *p, GLuint code_size );
 void x86_release_func( struct x86_function *p );
 void (*x86_get_func( struct x86_function *p ))( void );