В методе ThemeRegistryService.importThemeFile есть классический баг Time-Of-Check to Time-Of-Use при проверке существования директории:
var finalExtDir = Directory(p.join(extensionsDir.path, preferredBaseName));
while (await finalExtDir.exists()) {
// ... увеличение счетчика ...
}
await finalExtDir.create(recursive: true);
Если произойдут два мгновенных параллельных вызова импорта одной и той же темы, обе корутины могут одновременно проверить await finalExtDir.exists(), получить false, и обе попытаются создать директорию и записать туда свои theme.json.
Краша не происходит из-за recursive: true, но возможна молчаливая перезапись. Требуется добавить блокировку (мьютекс) или обрабатывать FileExistsException при recursive: false.
В методе
ThemeRegistryService.importThemeFileесть классический баг Time-Of-Check to Time-Of-Use при проверке существования директории:Если произойдут два мгновенных параллельных вызова импорта одной и той же темы, обе корутины могут одновременно проверить
await finalExtDir.exists(), получитьfalse, и обе попытаются создать директорию и записать туда своиtheme.json.Краша не происходит из-за
recursive: true, но возможна молчаливая перезапись. Требуется добавить блокировку (мьютекс) или обрабатыватьFileExistsExceptionприrecursive: false.