فهرست منبع

Acquire roomCreateLock when updating puppet info to prevent race conditions

Tulir Asokan 3 سال پیش
والد
کامیت
5ef66496d6
1فایلهای تغییر یافته به همراه4 افزوده شده و 0 حذف شده
  1. 4 0
      puppet.go

+ 4 - 0
puppet.go

@@ -245,6 +245,7 @@ func (puppet *Puppet) UpdateName(source *User, contact types.ContactInfo) bool {
 	if puppet.Displayname != newName && quality >= puppet.NameQuality {
 	if puppet.Displayname != newName && quality >= puppet.NameQuality {
 		err := puppet.DefaultIntent().SetDisplayName(newName)
 		err := puppet.DefaultIntent().SetDisplayName(newName)
 		if err == nil {
 		if err == nil {
+			puppet.log.Debugln("Updated name", puppet.Displayname, "->", newName)
 			puppet.Displayname = newName
 			puppet.Displayname = newName
 			puppet.NameQuality = quality
 			puppet.NameQuality = quality
 			go puppet.updatePortalName()
 			go puppet.updatePortalName()
@@ -260,7 +261,10 @@ func (puppet *Puppet) UpdateName(source *User, contact types.ContactInfo) bool {
 func (puppet *Puppet) updatePortalMeta(meta func(portal *Portal)) {
 func (puppet *Puppet) updatePortalMeta(meta func(portal *Portal)) {
 	if puppet.bridge.Config.Bridge.PrivateChatPortalMeta {
 	if puppet.bridge.Config.Bridge.PrivateChatPortalMeta {
 		for _, portal := range puppet.bridge.GetAllPortalsByJID(puppet.JID) {
 		for _, portal := range puppet.bridge.GetAllPortalsByJID(puppet.JID) {
+			// Get room create lock to prevent races between receiving contact info and room creation.
+			portal.roomCreateLock.Lock()
 			meta(portal)
 			meta(portal)
+			portal.roomCreateLock.Unlock()
 		}
 		}
 	}
 	}
 }
 }