ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

Description

@pawlos

Description

ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

Reproduction Steps

using System.Configuration;
var xml = """
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="a/b" />
</configSections>
</configuration>
""";
var tmpFile = Path.GetTempFileName();
File.WriteAllText(tmpFile, xml);
try
{
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
var config = ConfigurationManager.OpenMappedExeConfiguration(
fileMap, ConfigurationUserLevel.None);
Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
foreach (ConfigurationSectionGroup group in config.SectionGroups)
{
Console.WriteLine($"Group name: {group.Name}");
}
}
finally
{
File.Delete(tmpFile);
}

Project file

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
</ItemGroup>
</Project>

run with dotnet run.

Expected behavior

Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

Actual behavior

SectionGroups.Count = 1
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at Program.<Main>$(String[] args) in Program.cs:line 21

Regression?

Unknown.

Known Workarounds

Add a null check when enumerating section groups:

foreach (ConfigurationSectionGroup group in config.SectionGroups)
{
if (group is null) continue;
// ...
}

Configuration

  • .NET SDK 10.0.103
  • System.Configuration.ConfigurationManager NuGet package 10.0.3
  • Reproduced on Linux x64 (WSL2) and Windows x64

Other information

The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

    Description

    @pawlos

    Description

    ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

    This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

    Reproduction Steps

    using System.Configuration;
    var xml = """
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <configSections>
    <sectionGroup name="a/b" />
    </configSections>
    </configuration>
    """;
    var tmpFile = Path.GetTempFileName();
    File.WriteAllText(tmpFile, xml);
    try
    {
    var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
    var config = ConfigurationManager.OpenMappedExeConfiguration(
    fileMap, ConfigurationUserLevel.None);
    Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
    foreach (ConfigurationSectionGroup group in config.SectionGroups)
    {
    Console.WriteLine($"Group name: {group.Name}");
    }
    }
    finally
    {
    File.Delete(tmpFile);
    }
    

    Project file

    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>
    <ItemGroup>
    <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
    </ItemGroup>
    </Project>
    

    run with dotnet run.

    Expected behavior

    Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

    Actual behavior

    SectionGroups.Count = 1
    Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
    at Program.<Main>$(String[] args) in Program.cs:line 21
    

    Regression?

    Unknown.

    Known Workarounds

    Add a null check when enumerating section groups:

    foreach (ConfigurationSectionGroup group in config.SectionGroups)
    {
    if (group is null) continue;
    // ...
    }
    

    Configuration

    • .NET SDK 10.0.103
    • System.Configuration.ConfigurationManager NuGet package 10.0.3
    • Reproduced on Linux x64 (WSL2) and Windows x64

    Other information

    The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

    Metadata

    Metadata

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

      Description

      @pawlos

      Description

      ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

      This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

      Reproduction Steps

      using System.Configuration;
      var xml = """
      <?xml version="1.0" encoding="utf-8"?>
      <configuration>
      <configSections>
      <sectionGroup name="a/b" />
      </configSections>
      </configuration>
      """;
      var tmpFile = Path.GetTempFileName();
      File.WriteAllText(tmpFile, xml);
      try
      {
      var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
      var config = ConfigurationManager.OpenMappedExeConfiguration(
      fileMap, ConfigurationUserLevel.None);
      Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
      foreach (ConfigurationSectionGroup group in config.SectionGroups)
      {
      Console.WriteLine($"Group name: {group.Name}");
      }
      }
      finally
      {
      File.Delete(tmpFile);
      }
      

      Project file

      <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net10.0</TargetFramework>
      <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
      <ItemGroup>
      <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
      </ItemGroup>
      </Project>
      

      run with dotnet run.

      Expected behavior

      Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

      Actual behavior

      SectionGroups.Count = 1
      Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
      at Program.<Main>$(String[] args) in Program.cs:line 21
      

      Regression?

      Unknown.

      Known Workarounds

      Add a null check when enumerating section groups:

      foreach (ConfigurationSectionGroup group in config.SectionGroups)
      {
      if (group is null) continue;
      // ...
      }
      

      Configuration

      • .NET SDK 10.0.103
      • System.Configuration.ConfigurationManager NuGet package 10.0.3
      • Reproduced on Linux x64 (WSL2) and Windows x64

      Other information

      The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

      Metadata

      Metadata

      Type

      No type

      Projects

      No projects

        Milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

        Description

        @pawlos

        Description

        ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

        This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

        Reproduction Steps

        using System.Configuration;
        var xml = """
        <?xml version="1.0" encoding="utf-8"?>
        <configuration>
        <configSections>
        <sectionGroup name="a/b" />
        </configSections>
        </configuration>
        """;
        var tmpFile = Path.GetTempFileName();
        File.WriteAllText(tmpFile, xml);
        try
        {
        var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
        var config = ConfigurationManager.OpenMappedExeConfiguration(
        fileMap, ConfigurationUserLevel.None);
        Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
        foreach (ConfigurationSectionGroup group in config.SectionGroups)
        {
        Console.WriteLine($"Group name: {group.Name}");
        }
        }
        finally
        {
        File.Delete(tmpFile);
        }
        

        Project file

        <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net10.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        </PropertyGroup>
        <ItemGroup>
        <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
        </ItemGroup>
        </Project>
        

        run with dotnet run.

        Expected behavior

        Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

        Actual behavior

        SectionGroups.Count = 1
        Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
        at Program.<Main>$(String[] args) in Program.cs:line 21
        

        Regression?

        Unknown.

        Known Workarounds

        Add a null check when enumerating section groups:

        foreach (ConfigurationSectionGroup group in config.SectionGroups)
        {
        if (group is null) continue;
        // ...
        }
        

        Configuration

        • .NET SDK 10.0.103
        • System.Configuration.ConfigurationManager NuGet package 10.0.3
        • Reproduced on Linux x64 (WSL2) and Windows x64

        Other information

        The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

        Metadata

        Metadata

        Type

        No type

        Projects

        No projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

          Description

          @pawlos

          Description

          ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

          This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

          Reproduction Steps

          using System.Configuration;
          var xml = """
          <?xml version="1.0" encoding="utf-8"?>
          <configuration>
          <configSections>
          <sectionGroup name="a/b" />
          </configSections>
          </configuration>
          """;
          var tmpFile = Path.GetTempFileName();
          File.WriteAllText(tmpFile, xml);
          try
          {
          var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
          var config = ConfigurationManager.OpenMappedExeConfiguration(
          fileMap, ConfigurationUserLevel.None);
          Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
          foreach (ConfigurationSectionGroup group in config.SectionGroups)
          {
          Console.WriteLine($"Group name: {group.Name}");
          }
          }
          finally
          {
          File.Delete(tmpFile);
          }
          

          Project file

          <Project Sdk="Microsoft.NET.Sdk">
          <PropertyGroup>
          <OutputType>Exe</OutputType>
          <TargetFramework>net10.0</TargetFramework>
          <ImplicitUsings>enable</ImplicitUsings>
          </PropertyGroup>
          <ItemGroup>
          <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
          </ItemGroup>
          </Project>
          

          run with dotnet run.

          Expected behavior

          Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

          Actual behavior

          SectionGroups.Count = 1
          Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
          at Program.<Main>$(String[] args) in Program.cs:line 21
          

          Regression?

          Unknown.

          Known Workarounds

          Add a null check when enumerating section groups:

          foreach (ConfigurationSectionGroup group in config.SectionGroups)
          {
          if (group is null) continue;
          // ...
          }
          

          Configuration

          • .NET SDK 10.0.103
          • System.Configuration.ConfigurationManager NuGet package 10.0.3
          • Reproduced on Linux x64 (WSL2) and Windows x64

          Other information

          The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

          Metadata

          Metadata

          Type

          No type

          Projects

          No projects

            Milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

            Description

            @pawlos

            Description

            ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

            This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

            Reproduction Steps

            using System.Configuration;
            var xml = """
            <?xml version="1.0" encoding="utf-8"?>
            <configuration>
            <configSections>
            <sectionGroup name="a/b" />
            </configSections>
            </configuration>
            """;
            var tmpFile = Path.GetTempFileName();
            File.WriteAllText(tmpFile, xml);
            try
            {
            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
            var config = ConfigurationManager.OpenMappedExeConfiguration(
            fileMap, ConfigurationUserLevel.None);
            Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
            foreach (ConfigurationSectionGroup group in config.SectionGroups)
            {
            Console.WriteLine($"Group name: {group.Name}");
            }
            }
            finally
            {
            File.Delete(tmpFile);
            }
            

            Project file

            <Project Sdk="Microsoft.NET.Sdk">
            <PropertyGroup>
            <OutputType>Exe</OutputType>
            <TargetFramework>net10.0</TargetFramework>
            <ImplicitUsings>enable</ImplicitUsings>
            </PropertyGroup>
            <ItemGroup>
            <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
            </ItemGroup>
            </Project>
            

            run with dotnet run.

            Expected behavior

            Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

            Actual behavior

            SectionGroups.Count = 1
            Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
            at Program.<Main>$(String[] args) in Program.cs:line 21
            

            Regression?

            Unknown.

            Known Workarounds

            Add a null check when enumerating section groups:

            foreach (ConfigurationSectionGroup group in config.SectionGroups)
            {
            if (group is null) continue;
            // ...
            }
            

            Configuration

            • .NET SDK 10.0.103
            • System.Configuration.ConfigurationManager NuGet package 10.0.3
            • Reproduced on Linux x64 (WSL2) and Windows x64

            Other information

            The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

            Metadata

            Metadata

            Type

            No type

            Projects

            No projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

              Description

              @pawlos

              Description

              ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

              This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

              Reproduction Steps

              using System.Configuration;
              var xml = """
              <?xml version="1.0" encoding="utf-8"?>
              <configuration>
              <configSections>
              <sectionGroup name="a/b" />
              </configSections>
              </configuration>
              """;
              var tmpFile = Path.GetTempFileName();
              File.WriteAllText(tmpFile, xml);
              try
              {
              var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
              var config = ConfigurationManager.OpenMappedExeConfiguration(
              fileMap, ConfigurationUserLevel.None);
              Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
              foreach (ConfigurationSectionGroup group in config.SectionGroups)
              {
              Console.WriteLine($"Group name: {group.Name}");
              }
              }
              finally
              {
              File.Delete(tmpFile);
              }
              

              Project file

              <Project Sdk="Microsoft.NET.Sdk">
              <PropertyGroup>
              <OutputType>Exe</OutputType>
              <TargetFramework>net10.0</TargetFramework>
              <ImplicitUsings>enable</ImplicitUsings>
              </PropertyGroup>
              <ItemGroup>
              <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
              </ItemGroup>
              </Project>
              

              run with dotnet run.

              Expected behavior

              Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

              Actual behavior

              SectionGroups.Count = 1
              Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
              at Program.<Main>$(String[] args) in Program.cs:line 21
              

              Regression?

              Unknown.

              Known Workarounds

              Add a null check when enumerating section groups:

              foreach (ConfigurationSectionGroup group in config.SectionGroups)
              {
              if (group is null) continue;
              // ...
              }
              

              Configuration

              • .NET SDK 10.0.103
              • System.Configuration.ConfigurationManager NuGet package 10.0.3
              • Reproduced on Linux x64 (WSL2) and Windows x64

              Other information

              The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

              Metadata

              Metadata

              Type

              No type

              Projects

              No projects

                Milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                ConfigurationManager should reject or handle sectionGroup names containing '/' #125185

                Description

                @pawlos

                Description

                ConfigurationManager.OpenMappedExeConfiguration produces a Configuration object whose SectionGroups collection yields null entries when the config file contains a element with a name attribute containing a forward slash (/).

                This causes a NullReferenceException for any code that enumerates config.SectionGroups, including the pattern shown in Microsoft's own documentation example.

                Reproduction Steps

                using System.Configuration;
                var xml = """
                <?xml version="1.0" encoding="utf-8"?>
                <configuration>
                <configSections>
                <sectionGroup name="a/b" />
                </configSections>
                </configuration>
                """;
                var tmpFile = Path.GetTempFileName();
                File.WriteAllText(tmpFile, xml);
                try
                {
                var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = tmpFile };
                var config = ConfigurationManager.OpenMappedExeConfiguration(
                fileMap, ConfigurationUserLevel.None);
                Console.WriteLine($"SectionGroups.Count = {config.SectionGroups.Count}");
                foreach (ConfigurationSectionGroup group in config.SectionGroups)
                {
                Console.WriteLine($"Group name: {group.Name}");
                }
                }
                finally
                {
                File.Delete(tmpFile);
                }
                

                Project file

                <Project Sdk="Microsoft.NET.Sdk">
                <PropertyGroup>
                <OutputType>Exe</OutputType>
                <TargetFramework>net10.0</TargetFramework>
                <ImplicitUsings>enable</ImplicitUsings>
                </PropertyGroup>
                <ItemGroup>
                <PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
                </ItemGroup>
                </Project>
                

                run with dotnet run.

                Expected behavior

                Consistent info between SecionGroups.Count and non-null entries in the collection. The SectionGroups enumerator skips entries it cannot resolve rather than yielding null.

                Actual behavior

                SectionGroups.Count = 1
                Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
                at Program.<Main>$(String[] args) in Program.cs:line 21
                

                Regression?

                Unknown.

                Known Workarounds

                Add a null check when enumerating section groups:

                foreach (ConfigurationSectionGroup group in config.SectionGroups)
                {
                if (group is null) continue;
                // ...
                }
                

                Configuration

                • .NET SDK 10.0.103
                • System.Configuration.ConfigurationManager NuGet package 10.0.3
                • Reproduced on Linux x64 (WSL2) and Windows x64

                Other information

                The root cause appears to be that ConfigurationManager uses / as an internal path separator for section group hierarchies (e.g., system.web.extensions/scripting/webServices). When a <sectionGroup> element has a name containing /, the internal lookup by path fails to resolve the group record, returning null — but the count and enumerator still report it as present.

                Metadata

                Metadata

                Type

                No type

                Projects

                No projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions