diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java index bf05ecf8948..dbb5f954000 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java @@ -184,6 +184,32 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { // test passes if no exception was thrown } + /** + */ + public void testProjectDescription_PreventBackDoorAccess() throws Exception { + // create a project + IProject project = ResourceHelper.createCDTProjectWithConfig(getName()); + + // get project descriptions + ICProjectDescription writableProjDescription = coreModel.getProjectDescription(project); + assertNotNull(writableProjDescription); + ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations(); + assertEquals(1, cfgDescriptions.length); + ICConfigurationDescription cfgDescription = cfgDescriptions[0]; + List originalProviders = cfgDescription.getLanguageSettingProviders(); + int originalSize = originalProviders.size(); + + // create new provider list + LanguageSettingsSerializable mockProvider = new MockEditableProvider(PROVIDER_0, PROVIDER_NAME_0); + List providers = new ArrayList(originalProviders); + providers.add(mockProvider); + assertTrue(originalSize != providers.size()); + + // changing providers shouldn't affect the original list + cfgDescription.setLanguageSettingProviders(providers); + assertEquals(originalSize, originalProviders.size()); + } + /** */ public void testProjectDescription_ReadWriteProviders() throws Exception { @@ -196,7 +222,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { assertNotNull(prjDescription); ICConfigurationDescription cfgDescription = prjDescription.getDefaultSettingConfiguration(); assertNotNull(cfgDescription); - + // try to write to it try { List providers = new ArrayList(); @@ -206,10 +232,10 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { // exception is expected } } - + List entries = new ArrayList(); entries.add(new CIncludePathEntry("path0", 0)); - + { // get project descriptions ICProjectDescription writableProjDescription = coreModel.getProjectDescription(project); @@ -217,7 +243,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { ICConfigurationDescription[] cfgDescriptions = writableProjDescription.getConfigurations(); assertEquals(1, cfgDescriptions.length); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + // create a provider LanguageSettingsSerializable mockProvider = new MockEditableProvider(PROVIDER_0, PROVIDER_NAME_0); mockProvider.setStoringEntriesInProjectArea(true); @@ -227,7 +253,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { cfgDescription.setLanguageSettingProviders(providers); List storedProviders = cfgDescription.getLanguageSettingProviders(); assertEquals(1, storedProviders.size()); - + // apply new project description to the project model coreModel.setProjectDescription(project, writableProjDescription); } @@ -238,14 +264,14 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { ICConfigurationDescription[] cfgDescriptions = readOnlyProjDescription.getConfigurations(); assertEquals(1, cfgDescriptions.length); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + List providers = cfgDescription.getLanguageSettingProviders(); assertEquals(1, providers.size()); ILanguageSettingsProvider loadedProvider = providers.get(0); assertTrue(loadedProvider instanceof LanguageSettingsSerializable); assertEquals(PROVIDER_0, loadedProvider.getId()); assertEquals(PROVIDER_NAME_0, loadedProvider.getName()); - + List actual = loadedProvider.getSettingEntries(cfgDescription, null, null); assertEquals(entries.get(0), actual.get(0)); assertEquals(entries.size(), actual.size()); @@ -270,7 +296,7 @@ public class LanguageSettingsPersistenceProjectTests extends TestCase { assertEquals(entries.size(), actual.size()); } } - + /** */ public void testWorkspacePersistence_ModifiedExtensionProvider() throws Exception { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java index d63af54e1a2..9d7ab1be7a6 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java @@ -989,7 +989,7 @@ public class CConfigurationSpecSettings implements ICSettingsStorage{ * @param providers - list of providers to keep in the specs. */ public void setLanguageSettingProviders(List providers) { - fLanguageSettingsProviders.clear(); + fLanguageSettingsProviders = new ArrayList(0); Set ids = new HashSet(); for (ILanguageSettingsProvider provider : providers) { String id = provider.getId();