Skip to content

Commit cedbe4d

Browse files
committed
[Bug] Fix TOCTOU race condition and unsafe lazy init in CacheItem.initConfigGrayIfEmpty()
1 parent 0321d83 commit cedbe4d

1 file changed

Lines changed: 8 additions & 5 deletions

File tree

  • config/src/main/java/com/alibaba/nacos/config/server/model

config/src/main/java/com/alibaba/nacos/config/server/model/CacheItem.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
import com.alibaba.nacos.config.server.utils.SimpleReadWriteLock;
2020
import com.alibaba.nacos.core.utils.StringPool;
2121

22-
import java.util.HashMap;
2322
import java.util.List;
2423
import java.util.Map;
24+
import java.util.concurrent.ConcurrentHashMap;
2525
import java.util.stream.Collectors;
2626

2727
/**
@@ -80,7 +80,11 @@ public String getGroupKey() {
8080
*/
8181
public void initConfigGrayIfEmpty() {
8282
if (this.configCacheGray == null) {
83-
this.configCacheGray = new HashMap<>(4);
83+
synchronized (this) {
84+
if (this.configCacheGray == null) {
85+
this.configCacheGray = new ConcurrentHashMap<>(4);
86+
}
87+
}
8488
}
8589
}
8690

@@ -91,9 +95,8 @@ public void initConfigGrayIfEmpty() {
9195
*/
9296
public void initConfigGrayIfEmpty(String grayName) {
9397
initConfigGrayIfEmpty();
94-
if (!this.configCacheGray.containsKey(grayName)) {
95-
this.configCacheGray.put(grayName, ConfigCacheFactoryDelegate.getInstance().createConfigCacheGray(grayName));
96-
}
98+
this.configCacheGray.computeIfAbsent(grayName,
99+
k -> ConfigCacheFactoryDelegate.getInstance().createConfigCacheGray(k));
97100
}
98101

99102
public List<ConfigCacheGray> getSortConfigGrays() {

0 commit comments

Comments
 (0)