Alexandre Julliard : tools: Keep track of requests sizes and alignments in make_requests.

Alexandre Julliard julliard at winehq.org
Thu Dec 11 07:50:38 CST 2008


Module: wine
Branch: master
Commit: f4ec583d0a9584f136c4eb3426813182950e95bf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f4ec583d0a9584f136c4eb3426813182950e95bf

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Dec 10 17:15:51 2008 +0100

tools: Keep track of requests sizes and alignments in make_requests.

---

 tools/make_requests |   76 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/tools/make_requests b/tools/make_requests
index 2c06813..214ade4 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -22,31 +22,31 @@
 use strict;
 
 my %formats =
-(
-    "int"           => "%d",
-    "short int"     => "%d",
-    "char"          => "%c",
-    "unsigned char" => "%02x",
-    "unsigned short"=> "%04x",
-    "unsigned int"  => "%08x",
-    "unsigned long" => "%lx",
-    "void*"         => "%p",
-    "data_size_t"   => "%u",
-    "obj_handle_t"  => "%04x",
-    "atom_t"        => "%04x",
-    "user_handle_t" => "%08x",
-    "process_id_t"  => "%04x",
-    "thread_id_t"   => "%04x",
-    "lparam_t"      => "%lx",
-    "timeout_t"     => "&dump_timeout",
-    "rectangle_t"   => "&dump_rectangle",
-    "char_info_t"   => "&dump_char_info",
-    "apc_call_t"    => "&dump_apc_call",
-    "apc_result_t"  => "&dump_apc_result",
-    "async_data_t"  => "&dump_async_data",
-    "luid_t"        => "&dump_luid",
-    "ioctl_code_t"  => "&dump_ioctl_code",
-    "file_pos_t"    => "&dump_file_pos",
+(                     # size align format
+    "int"           => [  4,   4,  "%d" ],
+    "short int"     => [  2,   2,  "%d" ],
+    "char"          => [  1,   1,  "%c" ],
+    "unsigned char" => [  1,   1,  "%02x" ],
+    "unsigned short"=> [  2,   2,  "%04x" ],
+    "unsigned int"  => [  4,   4,  "%08x" ],
+    "unsigned long" => [  4,   4,  "%lx" ],
+    "void*"         => [  4,   4,  "%p" ],
+    "data_size_t"   => [  4,   4,  "%u" ],
+    "obj_handle_t"  => [  4,   4,  "%04x" ],
+    "atom_t"        => [  2,   2,  "%04x" ],
+    "user_handle_t" => [  4,   4,  "%08x" ],
+    "process_id_t"  => [  4,   4,  "%04x" ],
+    "thread_id_t"   => [  4,   4,  "%04x" ],
+    "lparam_t"      => [  4,   4,  "%lx" ],
+    "timeout_t"     => [  8,   8,  "&dump_timeout" ],
+    "rectangle_t"   => [  16,  4,  "&dump_rectangle" ],
+    "char_info_t"   => [  4,   2,  "&dump_char_info" ],
+    "apc_call_t"    => [  32,  4,  "&dump_apc_call" ],
+    "apc_result_t"  => [  28,  4,  "&dump_apc_result" ],
+    "async_data_t"  => [  28,  4,  "&dump_async_data" ],
+    "luid_t"        => [  8,   4,  "&dump_luid" ],
+    "ioctl_code_t"  => [  4,   4,  "&dump_ioctl_code" ],
+    "file_pos_t"    => [  8,   8,  "&dump_file_pos" ],
 );
 
 my @requests = ();
@@ -54,7 +54,9 @@ my %replies = ();
 
 my @trace_lines = ();
 
+my $max_req_size = 64;
 
+my $warnings = scalar(@ARGV) && $ARGV[0] eq "-w";
 
 ### Generate a dumping function
 
@@ -69,14 +71,15 @@ sub DO_DUMP_FUNC($$@)
 	my $var = shift;
 	if (defined($formats{$type}))
 	{
-            if ($formats{$type} =~ /^&(.*)/)
+            my $fmt = ${$formats{$type}}[2];
+            if ($fmt =~ /^&(.*)/)
             {
                 my $func = $1;
                 push @trace_lines, "    fprintf( stderr, \" $var=\" );\n";
                 push @trace_lines, "    $func( &req->$var );\n";
                 push @trace_lines, "    fprintf( stderr, \",\" );\n" if ($#_ > 0);
             }
-            elsif ($formats{$type} =~ /^(%.*)\s+\((.*)\)/)
+            elsif ($fmt =~ /^(%.*)\s+\((.*)\)/)
             {
                 my ($format, $cast) = ($1, $2);
                 push @trace_lines, "    fprintf( stderr, \" $var=$format";
@@ -85,7 +88,7 @@ sub DO_DUMP_FUNC($$@)
             }
             else
             {
-                push @trace_lines, "    fprintf( stderr, \" $var=$formats{$type}";
+                push @trace_lines, "    fprintf( stderr, \" $var=$fmt";
                 push @trace_lines, "," if ($#_ > 0);
                 push @trace_lines, "\", req->$var );\n";
             }
@@ -107,6 +110,7 @@ sub PARSE_REQUESTS()
 {
     # states: 0 = header 1 = declarations 2 = inside @REQ 3 = inside @REPLY
     my $state = 0;
+    my $offset = 0;
     my $name = "";
     my @in_struct = ();
     my @out_struct = ();
@@ -138,6 +142,7 @@ sub PARSE_REQUESTS()
             # start a new request
             @in_struct = ();
             @out_struct = ();
+            $offset = 12;
             print SERVER_PROT "struct ${name}_request\n{\n";
             print SERVER_PROT "    struct request_header __header;\n";
             $state++;
@@ -150,6 +155,8 @@ sub PARSE_REQUESTS()
             print SERVER_PROT "};\n";
             print SERVER_PROT "struct ${name}_reply\n{\n";
             print SERVER_PROT "    struct reply_header __header;\n";
+            die "request $name too large ($offset)" if ($offset > $max_req_size);
+            $offset = 8;
             $state++;
             next;
         }
@@ -161,11 +168,15 @@ sub PARSE_REQUESTS()
 
             if ($state == 2)  # build dummy reply struct
             {
+                die "request $name too large ($offset)" if ($offset > $max_req_size);
                 print SERVER_PROT "struct ${name}_reply\n{\n";
                 print SERVER_PROT "    struct reply_header __header;\n";
                 print SERVER_PROT "};\n";
             }
-
+            else
+            {
+                die "reply $name too large ($offset)" if ($offset > $max_req_size);
+            }
             # got a complete request
             push @requests, $name;
             DO_DUMP_FUNC( $name, "request", @in_struct);
@@ -204,6 +215,13 @@ sub PARSE_REQUESTS()
                 $type = $1;
                 $var = $3;
                 die "Unrecognized type $type" unless defined($formats{$type});
+                my @fmt = @{$formats{$type}};
+                if ($offset & ($fmt[1] - 1))
+                {
+                    print "protocol.def:$.: warning: $name $offset $type $var needs padding\n" if $warnings;
+                }
+                $offset = ($offset + $fmt[1] - 1) & ~($fmt[1] - 1);
+                $offset += $fmt[0];
             }
             else
             {




More information about the wine-cvs mailing list