Fix a race condition where an object update for a hud could be sent to non-owner avatars if the hud was attached directly from within the region.
If this happens, then the non-owners would see unremovable huds that they did not own until relog, and sometimes even beyond that. This was due to a race between the entity update and the attachment code when moving an object from within scene to a hud.0.7.4.1
							parent
							
								
									a4290048e5
								
							
						
					
					
						commit
						917d753f1c
					
				|  | @ -3722,8 +3722,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|                         } | ||||
|                     } | ||||
|      | ||||
|                     ++updatesThisCall; | ||||
|      | ||||
|                     #region UpdateFlags to packet type conversion | ||||
|      | ||||
|                     PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; | ||||
|  | @ -3788,7 +3786,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             updateBlock = CreatePrimUpdateBlock((SceneObjectPart)update.Entity, AgentId); | ||||
|                             SceneObjectPart part = (SceneObjectPart)update.Entity; | ||||
|                             updateBlock = CreatePrimUpdateBlock(part, AgentId); | ||||
| 
 | ||||
|                             // If the part has become a private hud since the update was scheduled then we do not | ||||
|                             // want to send it to other avatars. | ||||
|                             if (part.ParentGroup.IsAttachment | ||||
|                                 && part.ParentGroup.HasPrivateAttachmentPoint | ||||
|                                 && part.ParentGroup.AttachedAvatar != AgentId) | ||||
|                                 continue; | ||||
|                         } | ||||
| 
 | ||||
|                         objectUpdateBlocks.Value.Add(updateBlock); | ||||
|  | @ -3811,6 +3817,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|                         { | ||||
|                             // Everything else goes here | ||||
|                             terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures))); | ||||
| 
 | ||||
|                             if (update.Entity is SceneObjectPart) | ||||
|                             { | ||||
|                                 SceneObjectPart part = (SceneObjectPart)update.Entity; | ||||
| 
 | ||||
|                                 // If the part has become a private hud since the update was scheduled then we do not | ||||
|                                 // want to send it to other avatars. | ||||
|                                 if (part.ParentGroup.IsAttachment | ||||
|                                     && part.ParentGroup.HasPrivateAttachmentPoint | ||||
|                                     && part.ParentGroup.AttachedAvatar != AgentId) | ||||
|                                     continue; | ||||
|                             } | ||||
| 
 | ||||
|                             terseUpdates.Value.Add(update); | ||||
|                         } | ||||
|                     } | ||||
|  | @ -3880,6 +3899,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|                     // If any of the packets created from this call go unacknowledged, all of the updates will be resent | ||||
|                     OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | ||||
|                 } | ||||
| 
 | ||||
|                 ++updatesThisCall; | ||||
|             } | ||||
| 
 | ||||
|             #endregion Packet Sending | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)