소스 검색

fix #2063

In #2058 we introduced two bugs:

* A nil dereference when an outside user attempts to speak
* Ordinary copy of a modes.ModeSet (which should only be accessed via atomics)

This fixes both issues.
tags/v2.12.0-rc1
Shivaram Lingamneni 1 년 전
부모
커밋
e84793d7ee
1개의 변경된 파일10개의 추가작업 그리고 4개의 파일을 삭제
  1. 10
    4
      irc/channel.go

+ 10
- 4
irc/channel.go 파일 보기

1228
 	channel.stateMutex.RLock()
1228
 	channel.stateMutex.RLock()
1229
 	memberData, hasClient := channel.members[client]
1229
 	memberData, hasClient := channel.members[client]
1230
 	channel.stateMutex.RUnlock()
1230
 	channel.stateMutex.RUnlock()
1231
-	clientModes := memberData.modes
1231
+
1232
+	highestMode := func() modes.Mode {
1233
+		if !hasClient {
1234
+			return modes.Mode(0)
1235
+		}
1236
+		return memberData.modes.HighestChannelUserMode()
1237
+	}
1232
 
1238
 
1233
 	if !hasClient && channel.flags.HasMode(modes.NoOutside) {
1239
 	if !hasClient && channel.flags.HasMode(modes.NoOutside) {
1234
 		// TODO: enforce regular +b bans on -n channels?
1240
 		// TODO: enforce regular +b bans on -n channels?
1235
 		return false, modes.NoOutside
1241
 		return false, modes.NoOutside
1236
 	}
1242
 	}
1237
-	if channel.isMuted(client) && clientModes.HighestChannelUserMode() == modes.Mode(0) {
1243
+	if channel.isMuted(client) && highestMode() == modes.Mode(0) {
1238
 		return false, modes.BanMask
1244
 		return false, modes.BanMask
1239
 	}
1245
 	}
1240
-	if channel.flags.HasMode(modes.Moderated) && clientModes.HighestChannelUserMode() == modes.Mode(0) {
1246
+	if channel.flags.HasMode(modes.Moderated) && highestMode() == modes.Mode(0) {
1241
 		return false, modes.Moderated
1247
 		return false, modes.Moderated
1242
 	}
1248
 	}
1243
 	if channel.flags.HasMode(modes.RegisteredOnlySpeak) && client.Account() == "" &&
1249
 	if channel.flags.HasMode(modes.RegisteredOnlySpeak) && client.Account() == "" &&
1244
-		clientModes.HighestChannelUserMode() == modes.Mode(0) {
1250
+		highestMode() == modes.Mode(0) {
1245
 		return false, modes.RegisteredOnlySpeak
1251
 		return false, modes.RegisteredOnlySpeak
1246
 	}
1252
 	}
1247
 	return true, modes.Mode('?')
1253
 	return true, modes.Mode('?')

Loading…
취소
저장