do not let *createlink run on attachments or link nonmod objects

UbitUmarov [2022-09-23 18:26:38]
do not let *createlink run on attachments or link nonmod objects
Filename
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 8054850..ce721f1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -4446,34 +4446,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             if (!UUID.TryParse(target, out UUID targetID) || targetID.IsZero())
                 return;

+            SceneObjectGroup hostgroup = m_host.ParentGroup;
+            if (hostgroup.AttachmentPoint != 0)
+                return; // Fail silently if attached
+            if ((hostgroup.RootPart.OwnerMask & (uint)PermissionMask.Modify) == 0)
+                return;
+
             SceneObjectPart targetPart = World.GetSceneObjectPart(targetID);
             if (targetPart == null)
                 return;

-            if (targetPart.ParentGroup.AttachmentPoint != 0)
-                return; // Fail silently if attached
+            SceneObjectGroup targetgrp = targetPart.ParentGroup;
+
+            if (targetgrp == null || targetgrp.OwnerID.NotEqual(hostgroup.OwnerID))
+                return;

-            if (targetPart.ParentGroup.RootPart.OwnerID.NotEqual(m_host.ParentGroup.RootPart.OwnerID))
+            if (targetgrp.AttachmentPoint != 0)
+                return; // Fail silently if attached
+            if ((targetgrp.RootPart.OwnerMask & (uint)PermissionMask.Modify) == 0)
                 return;

             SceneObjectGroup parentPrim = null, childPrim = null;

             if (parent != 0)
             {
-                parentPrim = m_host.ParentGroup;
-                childPrim = targetPart.ParentGroup;
+                parentPrim = hostgroup;
+                childPrim = targetgrp;
             }
             else
             {
-                parentPrim = targetPart.ParentGroup;
-                childPrim = m_host.ParentGroup;
+                parentPrim = targetgrp;
+                childPrim = hostgroup;
             }

             // Required for linking
             childPrim.RootPart.ClearUpdateSchedule();
             parentPrim.LinkToGroup(childPrim, true);

-
             parentPrim.TriggerScriptChangedEvent(Changed.LINK);
             parentPrim.RootPart.CreateSelected = false;
             parentPrim.HasGroupChanged = true;
@@ -4492,7 +4501,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api

         public void llBreakLink(int linknum)
         {
-
             if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
                 && !m_automaticLinkPermission)
             {
@@ -4512,6 +4520,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api

             if (parentSOG.AttachmentPoint != 0)
                 return; // Fail silently if attached
+
+            if ((parentSOG.RootPart.OwnerMask & (uint)PermissionMask.Modify) == 0)
+                return;
+
             SceneObjectPart childPrim = null;

             switch (linknum)
ViewGit