[libvirt] [PATCH 5/7] remote generator: Fix XDR sign mismatch for virNodeGet(Cells)FreeMemory

Daniel P. Berrange berrange at redhat.com
Wed May 25 16:16:55 UTC 2011


On Mon, May 23, 2011 at 07:36:08PM +0200, Matthias Bolte wrote:
> virNodeGetFreeMemory used unsigned long long in the public API but
> signed hyper in the XDR protocol. Convert the XDR protocol to use
> unsigned hyper.
> 
> As explained by Eric before, this doesn't affect the on-the-wire protocol.
> ---
>  daemon/remote_generator.pl   |   18 ++++++------------
>  src/remote/remote_protocol.x |    4 ++--
>  src/remote_protocol-structs  |    4 ++--
>  3 files changed, 10 insertions(+), 16 deletions(-)
> 
> diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl
> index c405dc8..9143b3a 100755
> --- a/daemon/remote_generator.pl
> +++ b/daemon/remote_generator.pl
> @@ -501,7 +501,7 @@ elsif ($opt_b) {
>                              $single_ret_check = " < 0";
>                          }
>                      }
> -                } elsif ($ret_member =~ m/^hyper (\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
> +                } elsif ($ret_member =~ m/^(?:unsigned )?hyper (\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
>                      push(@vars_list, "int len");
>                      push(@ret_list, "ret->$1.$1_len = len;");
>                      push(@free_list_on_error, "VIR_FREE(ret->$1.$1_val);");
> @@ -519,7 +519,7 @@ elsif ($opt_b) {
>                          $single_ret_check = " < 0";
>                          splice(@args_list, int($3), 0, ("ret->$1.$1_val"));
>                      }
> -                } elsif ($ret_member =~ m/^hyper (\S+)<\S+>;/) {
> +                } elsif ($ret_member =~ m/^(?:unsigned )?hyper (\S+)<\S+>;/) {
>                      # error out on unannotated arrays
>                      die "hyper array without insert@<offset> annotation: $ret_member";
>                  } elsif ($ret_member =~ m/^(unsigned )?hyper (\S+);/) {
> @@ -1063,20 +1063,14 @@ elsif ($opt_k) {
>                          push(@ret_list, "rv = 0;");
>                          $single_ret_var = "int rv = -1";
>                          $single_ret_type = "int";
> -                    } else {
> -                        push(@ret_list, "rv = ret.$arg_name;");
> -                        $single_ret_var = "unsigned long rv = 0";
> -                        $single_ret_type = "unsigned long";
> -                    }
> -                } elsif ($ret_member =~ m/^hyper (\S+);/) {
> -                    my $arg_name = $1;
> -
> -                    if ($call->{ProcName} eq "NodeGetFreeMemory") {
> +                    } elsif ($call->{ProcName} eq "NodeGetFreeMemory") {
>                          push(@ret_list, "rv = ret.$arg_name;");
>                          $single_ret_var = "unsigned long long rv = 0";
>                          $single_ret_type = "unsigned long long";
>                      } else {
> -                        die "unhandled type for return value: $ret_member";
> +                        push(@ret_list, "rv = ret.$arg_name;");
> +                        $single_ret_var = "unsigned long rv = 0";
> +                        $single_ret_type = "unsigned long";
>                      }
>                  } elsif ($ret_member =~ m/^(\/)?\*/) {
>                      # ignore comments
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 5b9300a..f5218cd 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -449,11 +449,11 @@ struct remote_node_get_cells_free_memory_args {
>  };
>  
>  struct remote_node_get_cells_free_memory_ret {
> -    hyper cells<REMOTE_NODE_MAX_CELLS>; /* insert at 1 */
> +    unsigned hyper cells<REMOTE_NODE_MAX_CELLS>; /* insert at 1 */
>  };
>  
>  struct remote_node_get_free_memory_ret {
> -    hyper freeMem;
> +    unsigned hyper freeMem;
>  };
>  
>  struct remote_domain_get_scheduler_type_args {
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index 5491f73..fd23fa0 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -158,11 +158,11 @@ struct remote_node_get_cells_free_memory_args {
>  struct remote_node_get_cells_free_memory_ret {
>          struct {
>                  u_int              cells_len;
> -                int64_t *          cells_val;
> +                uint64_t *         cells_val;
>          } cells;
>  };
>  struct remote_node_get_free_memory_ret {
> -        int64_t                    freeMem;
> +        uint64_t                   freeMem;
>  };
>  struct remote_domain_get_scheduler_type_args {
>          remote_nonnull_domain      dom;

ACK 


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list