tgsi: Validate instruction opcode and operand counts.
authorMichal Krol <michal@tungstengraphics.com>
Wed, 13 Aug 2008 15:31:26 +0000 (17:31 +0200)
committerMichal Krol <michal@tungstengraphics.com>
Wed, 13 Aug 2008 15:35:20 +0000 (17:35 +0200)
src/gallium/auxiliary/tgsi/tgsi_sanity.c

index 2e3ec96b5b5c91e9727d40d83500902708d589b5..0b5bdd6ba1c1df8fe493354e01652698f60560af 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "pipe/p_debug.h"
 #include "tgsi_sanity.h"
+#include "tgsi_info.h"
 #include "tgsi_iterate.h"
 
 #define MAX_REGISTERS 256
@@ -170,6 +171,7 @@ iter_instruction(
    struct tgsi_full_instruction *inst )
 {
    struct sanity_check_ctx *ctx = (struct sanity_check_ctx *) iter;
+   const struct tgsi_opcode_info *info;
    uint i;
 
    /* There must be no other instructions after END.
@@ -181,6 +183,19 @@ iter_instruction(
       ctx->index_of_END = ctx->num_instructions;
    }
 
+   info = tgsi_get_opcode_info( inst->Instruction.Opcode );
+   if (info == NULL) {
+      report_error( ctx, "Invalid instruction opcode" );
+      return TRUE;
+   }
+
+   if (info->num_dst != inst->Instruction.NumDstRegs) {
+      report_error( ctx, "Invalid number of destination operands" );
+   }
+   if (info->num_src != inst->Instruction.NumSrcRegs) {
+      report_error( ctx, "Invalid number of source operands" );
+   }
+
    /* Check destination and source registers' validity.
     * Mark the registers as used.
     */