]> granicus.if.org Git - icinga2/commitdiff
FilterUtility::EvaluateFilter(): ensure not to modify the global namespace
authorAlexander A. Klimov <alexander.klimov@icinga.com>
Tue, 16 Apr 2019 13:53:44 +0000 (15:53 +0200)
committerMichael Friedrich <michael.friedrich@icinga.com>
Thu, 16 May 2019 14:16:51 +0000 (16:16 +0200)
(cherry picked from commit bdadb53940f1187d60a4679675af164dbb63f37c)

lib/remote/filterutility.cpp

index 8bcebfafb0c9451786fe468072dc65cc884e3bc9..8a7605ad8accba75b5196b4fddca9582c0d8253a 100644 (file)
@@ -106,6 +106,8 @@ bool FilterUtility::EvaluateFilter(ScriptFrame& frame, Expression *filter,
                ASSERT(frame.Self.IsObjectType<Namespace>());
 
                frameNS = frame.Self;
+
+               ASSERT(frameNS != ScriptGlobal::GetGlobals());
        }
 
        frameNS->Set("obj", target);
@@ -256,9 +258,9 @@ std::vector<Value> FilterUtility::GetFilterTargets(const QueryDescription& qd, c
                if (qd.Types.find(type) == qd.Types.end())
                        BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid type specified for this query."));
 
-               ScriptFrame frame(true);
-               frame.Sandboxed = true;
                Namespace::Ptr frameNS = new Namespace();
+               ScriptFrame frame(true, frameNS);
+               frame.Sandboxed = true;
 
                if (query->Contains("filter")) {
                        String filter = HttpUtility::GetLastParameter(query, "filter");
@@ -272,8 +274,6 @@ std::vector<Value> FilterUtility::GetFilterTargets(const QueryDescription& qd, c
                                }
                        }
 
-                       frame.Self = frameNS;
-
                        provider->FindTargets(type, std::bind(&FilteredAddTarget,
                                std::ref(permissionFrame), permissionFilter,
                                std::ref(frame), &*ufilter, std::ref(result), variableName, _1));