File: hashref_crash.patch

package info (click to toggle)
libsoap-lite-perl 1.20-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,060 kB
  • ctags: 940
  • sloc: perl: 8,889; makefile: 21; cs: 16
file content (47 lines) | stat: -rw-r--r-- 2,003 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Author: Ashish Shukla <wahjava@members.fsf.org>
Subject: use 'ref' rather than 'UNIVERSAL::isa'
Reviewed-by: Xavier Guimard <x.guimard@free.fr>
Bug: https://rt.cpan.org/Ticket/Display.html?id=62667
Bug-Debian: https://bugs.debian.org/602056
Last-Update: 2013-05-18

--- a/lib/SOAP/Lite.pm
+++ b/lib/SOAP/Lite.pm
@@ -3852,15 +3852,28 @@
                 my($value) = $_->value; # take first value
 
                 # fillup parameters
-                UNIVERSAL::isa($_[$param] => 'SOAP::Data')
-                    ? $_[$param]->SOAP::Data::value($value)
-                    : UNIVERSAL::isa($_[$param] => 'ARRAY')
-                        ? (@{$_[$param]} = @$value)
-                        : UNIVERSAL::isa($_[$param] => 'HASH')
-                            ? (%{$_[$param]} = %$value)
-                            : UNIVERSAL::isa($_[$param] => 'SCALAR')
-                                ? (${$_[$param]} = $$value)
-                                : ($_[$param] = $value)
+                use Scalar::Util 'reftype';
+                if ( reftype( $_[$param] ) ) {
+                    if ( reftype( $_[$param] ) eq 'SCALAR' ) {
+                        ${ $_[$param] } = $$value;
+                    }
+                    elsif ( reftype( $_[$param] ) eq 'ARRAY' ) {
+                        @{ $_[$param] } = @$value;
+                    }
+                    elsif ( reftype( $_[$param] ) eq 'HASH' ) {
+                        if ( eval { $_[$param]->isa('SOAP::Data') } ) {
+                            $_[$param]->SOAP::Data::value($value);
+                        }
+                        elsif ( reftype($value) eq 'REF' ) {
+                            %{ $_[$param] } = %$$value;
+                        }
+                        else { %{ $_[$param] } = %$value; }
+                    }
+                    else { $_[$param] = $value; }
+                }
+                else {
+                    $_[$param] = $value;
+                }
             }
         }
     }