From b6fe0b1c9917d3d188ff8053f5fc3611ef878b3a Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Thu, 22 Dec 2016 15:53:12 +0500 Subject: [PATCH] LP#1652122: fix infinite recursion in opensrf.system.method.all Under certain circumstances, calling opensrf.system.method.all on a Perl service can result in an infinite recursion when attempting to serialize an OpenSRF::Application object to JSON. In particular, this was observed to happen when doing an introspection of the opensrf.settings service. This patch avoids the infinite recursion (and consequent memory leak) by ensuring that the 'session' key is slated for exclusion from serialization from OpenSRF::Application objects during bootstrapping. Note that the problem does not affect all Perl services; if a Perl service declares at least one streaming method, the auto-registration of the .atomic method will result in 'session'-stripping. This patch fixes a regression introduced in bug 1350457. To test ------- [1] Run 'introspect opensrf.settings' via srfsh; observe that it never returns and that the opensrf.settings drone will grow in memory sized until killed. [2] Apply the patch, then repeat step 1. This time, the request should succeed. Signed-off-by: Galen Charlton Signed-off-by: Mike Rylander --- src/perl/lib/OpenSRF/System.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/perl/lib/OpenSRF/System.pm b/src/perl/lib/OpenSRF/System.pm index 39aeaf9..c9534dc 100644 --- a/src/perl/lib/OpenSRF/System.pm +++ b/src/perl/lib/OpenSRF/System.pm @@ -31,7 +31,7 @@ sub load_bootstrap_config { unless $bootstrap_config_file; OpenSRF::Utils::Config->load(config_file => $bootstrap_config_file); - OpenSRF::Utils::JSON->register_class_hint(name => "OpenSRF::Application", hint => "method", type => "hash"); + OpenSRF::Utils::JSON->register_class_hint(name => "OpenSRF::Application", hint => "method", type => "hash", strip => ['session']); OpenSRF::Transport->message_envelope("OpenSRF::Transport::SlimJabber::MessageWrapper"); OpenSRF::Transport::PeerHandle->set_peer_client("OpenSRF::Transport::SlimJabber::PeerConnection"); OpenSRF::Application->server_class('client'); -- 2.43.2