Robert Shearman : widl: Fix SEGVs with client and server code generation when an

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 26 11:46:36 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 86c3a2e76a76c430dca2f4024700c22538511b6a
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=86c3a2e76a76c430dca2f4024700c22538511b6a

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Dec 26 13:08:51 2005 +0100

widl: Fix SEGVs with client and server code generation when an
interface has no methods.

---

 tools/widl/client.c  |   54 ++++++++++++++++++++++------------------
 tools/widl/server.c  |   52 +++++++++++++++++++++------------------
 tools/widl/typegen.c |   67 ++++++++++++++++++++++++++------------------------
 3 files changed, 92 insertions(+), 81 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index 2d33496..ba73b35 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -403,32 +403,33 @@ static void write_formatdesc( const char
 
 static void write_formatstringsdecl(type_t *iface)
 {
-    func_t *func;
-    var_t *var;
     int byte_count = 1;
 
     print_client("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */
 
     /* determine the proc format string size */
-    func = iface->funcs;
-    while (NEXT_LINK(func)) func = NEXT_LINK(func);
-    while (func)
+    if (iface->funcs)
     {
-        /* argument list size */
-        if (func->args)
+        func_t *func = iface->funcs;
+        while (NEXT_LINK(func)) func = NEXT_LINK(func);
+        while (func)
         {
-            var = func->args;
-            while (NEXT_LINK(var)) var = NEXT_LINK(var);
-            while (var)
+            /* argument list size */
+            if (func->args)
             {
-                byte_count += 2; /* FIXME: determine real size */
-                var = PREV_LINK(var);
+                var_t *var = func->args;
+                while (NEXT_LINK(var)) var = NEXT_LINK(var);
+                while (var)
+                {
+                    byte_count += 2; /* FIXME: determine real size */
+                    var = PREV_LINK(var);
+                }
             }
+    
+            /* return value size */
+            byte_count += 2; /* FIXME: determine real size */
+            func = PREV_LINK(func);
         }
-
-        /* return value size */
-        byte_count += 2; /* FIXME: determine real size */
-        func = PREV_LINK(func);
     }
     print_client("#define PROC_FORMAT_STRING_SIZE %d\n", byte_count);
 
@@ -492,15 +493,18 @@ void write_client(ifref_t *ifaces)
         fprintf(client, " */\n");
         fprintf(client, "\n");
 
-        write_formatstringsdecl(iface->iface);
-        write_implicithandledecl(iface->iface);
-
-        write_clientinterfacedecl(iface->iface);
-        write_stubdescdecl(iface->iface);
-        write_bindinghandledecl(iface->iface);
-
-        write_function_stubs(iface->iface);
-        write_stubdescriptor(iface->iface);
+        if (iface->iface->funcs)
+        {
+            write_formatstringsdecl(iface->iface);
+            write_implicithandledecl(iface->iface);
+    
+            write_clientinterfacedecl(iface->iface);
+            write_stubdescdecl(iface->iface);
+            write_bindinghandledecl(iface->iface);
+    
+            write_function_stubs(iface->iface);
+            write_stubdescriptor(iface->iface);
+        }
 
         print_client("#if !defined(__RPC_WIN32__)\n");
         print_client("#error  Invalid build platform for this stub.\n");
diff --git a/tools/widl/server.c b/tools/widl/server.c
index b007a8f..319094c 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -428,32 +428,33 @@ static void write_formatdesc( const char
 
 static void write_formatstringsdecl(type_t *iface)
 {
-    func_t *func;
-    var_t *var;
     int byte_count = 1;
 
     print_server("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */
 
     /* determine the proc format string size */
-    func = iface->funcs;
-    while (NEXT_LINK(func)) func = NEXT_LINK(func);
-    while (func)
+    if (iface->funcs)
     {
-        /* argument list size */
-        if (func->args)
+        func_t *func = iface->funcs;
+        while (NEXT_LINK(func)) func = NEXT_LINK(func);
+        while (func)
         {
-            var = func->args;
-            while (NEXT_LINK(var)) var = NEXT_LINK(var);
-            while (var)
+            /* argument list size */
+            if (func->args)
             {
-                byte_count += 2; /* FIXME: determine real size */
-                var = PREV_LINK(var);
+                var_t *var = func->args;
+                while (NEXT_LINK(var)) var = NEXT_LINK(var);
+                while (var)
+                {
+                    byte_count += 2; /* FIXME: determine real size */
+                    var = PREV_LINK(var);
+                }
             }
+    
+            /* return value size */
+            byte_count += 2; /* FIXME: determine real size */
+            func = PREV_LINK(func);
         }
-
-        /* return value size */
-        byte_count += 2; /* FIXME: determine real size */
-        func = PREV_LINK(func);
     }
     print_server("#define PROC_FORMAT_STRING_SIZE %d\n", byte_count);
 
@@ -503,14 +504,17 @@ void write_server(ifref_t *ifaces)
         fprintf(server, " */\n");
         fprintf(server, "\n");
 
-        write_formatstringsdecl(iface->iface);
-        write_serverinterfacedecl(iface->iface);
-        write_stubdescdecl(iface->iface);
-
-        write_function_stubs(iface->iface);
-
-        write_stubdescriptor(iface->iface);
-        write_dispatchtable(iface->iface);
+        if (iface->iface->funcs)
+        {
+            write_formatstringsdecl(iface->iface);
+            write_serverinterfacedecl(iface->iface);
+            write_stubdescdecl(iface->iface);
+    
+            write_function_stubs(iface->iface);
+    
+            write_stubdescriptor(iface->iface);
+            write_dispatchtable(iface->iface);
+        }
 
         print_server("#if !defined(__RPC_WIN32__)\n");
         print_server("#error  Invalid build platform for this stub.\n");
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 09420dc..5f5eb3d 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -119,7 +119,6 @@ static size_t write_procformatstring_var
 void write_procformatstring(FILE *file, type_t *iface)
 {
     int indent = 0;
-    func_t *func = iface->funcs;
     var_t *var;
     unsigned int type_offset = 2;
 
@@ -130,32 +129,34 @@ void write_procformatstring(FILE *file, 
     print_file(file, indent, "{\n");
     indent++;
 
-    while (NEXT_LINK(func)) func = NEXT_LINK(func);
-    while (func)
+    if (iface->funcs)
     {
-        /* emit argument data */
-        if (func->args)
+        func_t *func = iface->funcs;
+        while (NEXT_LINK(func)) func = NEXT_LINK(func);
+        for (; func; func = PREV_LINK(func))
         {
-            var = func->args;
-            while (NEXT_LINK(var)) var = NEXT_LINK(var);
-            while (var)
+            /* emit argument data */
+            if (func->args)
             {
-                write_procformatstring_var(file, indent, var, FALSE, &type_offset);
-                var = PREV_LINK(var);
+                var = func->args;
+                while (NEXT_LINK(var)) var = NEXT_LINK(var);
+                while (var)
+                {
+                    write_procformatstring_var(file, indent, var, FALSE, &type_offset);
+                    var = PREV_LINK(var);
+                }
             }
+    
+            /* emit return value data */
+            var = func->def;
+            if (is_void(var->type, NULL))
+            {
+                print_file(file, indent, "0x5b,    /* FC_END */\n");
+                print_file(file, indent, "0x5c,    /* FC_PAD */\n");
+            }
+            else
+                write_procformatstring_var(file, indent, var, TRUE, &type_offset);
         }
-
-        /* emit return value data */
-        var = func->def;
-        if (is_void(var->type, NULL))
-        {
-            print_file(file, indent, "0x5b,    /* FC_END */\n");
-            print_file(file, indent, "0x5c,    /* FC_PAD */\n");
-        }
-        else
-            write_procformatstring_var(file, indent, var, TRUE, &type_offset);
-
-        func = PREV_LINK(func);
     }
 
     print_file(file, indent, "0x0\n");
@@ -214,7 +215,6 @@ static size_t write_typeformatstring_var
 void write_typeformatstring(FILE *file, type_t *iface)
 {
     int indent = 0;
-    func_t *func = iface->funcs;
     var_t *var;
 
     print_file(file, indent, "static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =\n");
@@ -225,20 +225,23 @@ void write_typeformatstring(FILE *file, 
     indent++;
     print_file(file, indent, "NdrFcShort(0x0),\n");
 
-    while (NEXT_LINK(func)) func = NEXT_LINK(func);
-    while (func)
+    if (iface->funcs)
     {
-        if (func->args)
+        func_t *func = iface->funcs;
+        while (NEXT_LINK(func)) func = NEXT_LINK(func);
+        for (; func; func = PREV_LINK(func))
         {
-            var = func->args;
-            while (NEXT_LINK(var)) var = NEXT_LINK(var);
-            while (var)
+            if (func->args)
             {
-                write_typeformatstring_var(file, indent, var);
-                var = PREV_LINK(var);
+                var = func->args;
+                while (NEXT_LINK(var)) var = NEXT_LINK(var);
+                while (var)
+                {
+                    write_typeformatstring_var(file, indent, var);
+                    var = PREV_LINK(var);
+                }
             }
         }
-        func = PREV_LINK(func);
     }
 
     print_file(file, indent, "0x0\n");




More information about the wine-cvs mailing list