svga: check that we don't exceed input/ouput register limits
authorBrian Paul <brianp@vmware.com>
Tue, 19 Jul 2011 20:52:54 +0000 (14:52 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 23 Sep 2011 13:58:47 +0000 (07:58 -0600)
src/gallium/drivers/svga/svga_state_fs.c
src/gallium/drivers/svga/svga_tgsi_decl_sm30.c
src/gallium/drivers/svga/svga_tgsi_insn.c

index 8a50bfd344aaf3bc48aa2fdb6b15016d410f80c7..5b96750bbf1e3180efa2c9e43368ebf14f1ab2dd 100644 (file)
@@ -76,7 +76,7 @@ static enum pipe_error compile_fs( struct svga_context *svga,
 
    result = svga_translate_fragment_program( fs, key );
    if (result == NULL) {
-      ret = PIPE_ERROR_OUT_OF_MEMORY;
+      ret = PIPE_ERROR;  /* some problem during translation */
       goto fail;
    }
 
index 6f162ea7e33d60e321cd3dbd3181c3848e78079b..6f4087048636b25cde8a2c0a19d3787521ead46c 100644 (file)
@@ -124,6 +124,9 @@ ps30_input_emit_depth_fog( struct svga_shader_emitter *emit,
       return TRUE;
    }
 
+   if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX)
+      return FALSE;
+
    reg = src_register( SVGA3DREG_INPUT,
                        emit->ps30_input_count++ );
 
@@ -195,6 +198,9 @@ static boolean ps30_input( struct svga_shader_emitter *emit,
       if (!translate_vs_ps_semantic( semantic, &usage, &index ))
          return FALSE;
 
+      if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX)
+         return FALSE;
+
       reg = dst_register( SVGA3DREG_INPUT, emit->ps30_input_count++ );
 
       if (!emit_decl( emit, reg, usage, index ))
@@ -231,6 +237,9 @@ static boolean ps30_input( struct svga_shader_emitter *emit,
       if (!translate_vs_ps_semantic( semantic, &usage, &index ))
          return FALSE;
 
+      if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX)
+         return FALSE;
+
       emit->input_map[idx] = src_register( SVGA3DREG_INPUT, emit->ps30_input_count++ );
       reg = dst( emit->input_map[idx] );
 
@@ -392,6 +401,9 @@ static boolean vs30_output( struct svga_shader_emitter *emit,
    if (!translate_vs_ps_semantic( semantic, &usage, &index ))
       return FALSE;
 
+   if (emit->vs30_output_count >= SVGA3D_OUTPUTREG_MAX)
+      return FALSE;
+
    dcl.dst = dst_register( SVGA3DREG_OUTPUT, emit->vs30_output_count++ );
    dcl.usage = usage;
    dcl.index = index;
index 6f03e61db550413b03d1dc8295818a3e3b6a7cc7..05531a15eb587a33b9ea36d8ea19ec2b6ae8bac3 100644 (file)
@@ -3184,7 +3184,6 @@ boolean svga_shader_emit_instructions( struct svga_shader_emitter *emit,
       goto done;
 
 done:
-   assert(ret);
    tgsi_parse_free( &parse );
    return ret;
 }