From 3d68959f4b88e0dc5b7d9ee1c53fc59a3d4fe40b Mon Sep 17 00:00:00 2001
From: Yuriy Nevinitsin <nevinitsin@corp.mail.ru>
Date: Fri, 26 Nov 2010 15:34:17 +0300
Subject: [PATCH] [box] [client] [perl] Fix _validate_params() not to clobber a
 param. Fix update/splice for compatiblity with older perls.

---
 mod/silverbox/client/perl/lib/MR/SilverBox.pm | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/mod/silverbox/client/perl/lib/MR/SilverBox.pm b/mod/silverbox/client/perl/lib/MR/SilverBox.pm
index 76d350d7ad..d8dd642cc4 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]] },
-- 
GitLab