Skip to content

Commit b681232

Browse files
authored
Merge pull request scala#5295 from varming/cvarming/nepotism
SI-8774 Null link fields in mutable LinkedHashMap (and friends) on remove
2 parents 1a3a612 + 9a24860 commit b681232

File tree

3 files changed

+8
-1
lines changed

3 files changed

+8
-1
lines changed

src/library/scala/collection/mutable/HashTable.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ trait HashTable[A, Entry >: Null <: HashEntry[A, Entry]] extends HashTable.HashU
183183
table(h) = e.next
184184
tableSize = tableSize - 1
185185
nnSizeMapRemove(h)
186+
e.next = null
186187
return e
187188
} else {
188189
var e1 = e.next
@@ -194,6 +195,7 @@ trait HashTable[A, Entry >: Null <: HashEntry[A, Entry]] extends HashTable.HashU
194195
e.next = e1.next
195196
tableSize = tableSize - 1
196197
nnSizeMapRemove(h)
198+
e1.next = null
197199
return e1
198200
}
199201
}
@@ -227,8 +229,9 @@ trait HashTable[A, Entry >: Null <: HashEntry[A, Entry]] extends HashTable.HashU
227229
var es = iterTable(idx)
228230

229231
while (es != null) {
232+
val next = es.next // Cache next in case f removes es.
230233
f(es.asInstanceOf[Entry])
231-
es = es.next
234+
es = next
232235

233236
while (es == null && idx > 0) {
234237
idx -= 1

src/library/scala/collection/mutable/LinkedHashMap.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ class LinkedHashMap[A, B] extends AbstractMap[A, B]
8181
else e.earlier.later = e.later
8282
if (e.later eq null) lastEntry = e.earlier
8383
else e.later.earlier = e.earlier
84+
e.earlier = null // Null references to prevent nepotism
85+
e.later = null
8486
Some(e.value)
8587
}
8688
}

src/library/scala/collection/mutable/LinkedHashSet.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class LinkedHashSet[A] extends AbstractSet[A]
7373
else e.earlier.later = e.later
7474
if (e.later eq null) lastEntry = e.earlier
7575
else e.later.earlier = e.earlier
76+
e.earlier = null // Null references to prevent nepotism
77+
e.later = null
7678
true
7779
}
7880
}

0 commit comments

Comments
 (0)