diff --git a/mod/silverbox/client/perl/lib/MR/SilverBox.pm b/mod/silverbox/client/perl/lib/MR/SilverBox.pm
index 76d350d7adc1888782bf2ac16981a87b8c680b5f..d8dd642cc43b2601805bd3510df59dbb41f8d30c 100644
--- a/mod/silverbox/client/perl/lib/MR/SilverBox.pm
+++ b/mod/silverbox/client/perl/lib/MR/SilverBox.pm
@@ -195,7 +195,7 @@ sub _raise {
 
 sub _validate_param {
     my ($self, $args, @pnames) = @_;
-    my $param = ref $args->[-1] eq 'HASH' ? pop @$args: {};
+    my $param = ref $args->[-1] eq 'HASH' ? {%{pop @$args}}: {};
 
     foreach my $pname (keys %$param) {
         confess "$self->{name}: unknown param $pname\n" if 0 == grep { $_ eq $pname } @pnames;
@@ -354,6 +354,7 @@ sub _PackSelect {
         my $f = $namespace->{byfield_unpack_format};
         $param->{unpack_format} = join '', map { $f->[$_->{field}] } @{$param->{format}};
         $format = pack 'l*', scalar @{$param->{format}}, map {
+            $_ = { %$_ };
             if($_->{full}) {
                 $_->{offset} = 0;
                 $_->{length} = 'max';
@@ -504,7 +505,7 @@ my %update_ops = (
         $_[0]->[0] = pack 'l', $_[0]->[0];
         $_[0]->[1] = defined $_[0]->[1] ? pack 'l', $_[0]->[1] : '';
         $_[0]->[2] = '' unless defined $_[0]->[2];
-        return (OP_SPLICE, [ pack '(w/a)*', @{$_[0]} ]);
+        return (OP_SPLICE, [ pack '(w/a*)*', @{$_[0]} ]);
     },
     append      => sub { splice => [undef,  0,     $_[0]] },
     prepend     => sub { splice => [0,      0,     $_[0]] },