[WINED3D 3/3] Fix NULL dereference in gen. function

Ivan Gyurdiev ivg2 at cornell.edu
Tue Jun 6 22:40:16 CDT 2006


Handle curOpcode == NULL properly

Also move hw_arg fields that don't need
to be set at every opcode out of the opcode loop.

This fixes the next crash in nfsmw (and yet it crashes again after that 
- IndexBuffer issue)

-------------- next part --------------
---

 dlls/wined3d/baseshader.c |   18 +++++++++---------
 1 files changed, 9 insertions(+), 9 deletions(-)

f2386f486f02e6fc2e6e642c3eb2e50ee64e5314
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index ee54a5e..1968a11 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -623,6 +623,9 @@ void generate_base_shader(
     shader_reg_maps reg_maps;
 
     /* Initialize current parsing state */
+    SHADER_OPCODE_ARG hw_arg;
+    hw_arg.shader = iface;
+    hw_arg.buffer = buffer;
     This->baseShader.parse_state.current_row = 0;
 
     /* First pass: figure out which temporary and texture registers are used */
@@ -662,22 +665,19 @@ void generate_base_shader(
             /* Read opcode */
             opcode_token = *pToken++;
             curOpcode = shader_get_opcode(iface, opcode_token);
-            hw_fct = (wined3d_settings.shader_mode == 
-                    SHADER_GLSL ? curOpcode->hw_glsl_fct : curOpcode->hw_fct);
+            hw_fct = (curOpcode == NULL)? NULL:
+                     (wined3d_settings.shader_mode == SHADER_GLSL)?
+                         curOpcode->hw_glsl_fct : curOpcode->hw_fct;
 
             /* Unknown opcode and its parameters */
-           if (NULL == curOpcode) {
-              FIXME("Unrecognized opcode: token=%08lX\n", opcode_token);
-              pToken += shader_skip_unrecognized(iface, pToken); 
+            if (NULL == curOpcode) {
+                FIXME("Unrecognized opcode: token=%08lX\n", opcode_token);
+                pToken += shader_skip_unrecognized(iface, pToken); 
 
             /* If a generator function is set for current shader target, use it */
             } else if (hw_fct != NULL) {
 
-                SHADER_OPCODE_ARG hw_arg;
-
-                hw_arg.shader = iface;
                 hw_arg.opcode = curOpcode;
-                hw_arg.buffer = buffer;
 
                 if (curOpcode->num_params > 0) {
 
-- 
1.3.3



More information about the wine-patches mailing list