NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} 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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } 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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values - #128462

Merged
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length
May 22, 2026
Merged

NativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config values#128462
MichalStrehovsky merged 2 commits into
mainfrom
copilot/fix-nativeaot-config-max-length

Conversation

CopilotAI commented May 21, 2026

Copy link
Copy Markdown
Contributor

PR #127644 made 0x/0X valid for non-decimal NativeAOT config parsing, but CONFIG_VAL_MAXLEN still capped input at 16 chars, rejecting full-width values like 0xFFFFFFFFFFFFFFFF. This change aligns the textual length limit with the accepted syntax while preserving existing overlong-value rejection behavior.

  • Config length limit update

    • Increased CONFIG_VAL_MAXLEN in src/coreclr/nativeaot/Runtime/RhConfig.h from 16 to 18 to allow 0x/0X + 16 hex digits.
  • Comment accuracy

    • Updated nearby comments in RhConfig.h and RhConfig.cpp to describe max textual integer length semantics, not just raw hex digit count.
  • Behavioral impact

    • Accepted now: 0xFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF
    • Unchanged: inputs longer than prefix + 16 hex digits are still rejected by the existing buffer-length check (cchResult >= cchBuffer).
// RhConfig.h
#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex// RhConfig.cppTCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
Original prompt

Fix NativeAOT's environment config value maximum length after PR #127644 added support for 0x/0X prefixes in hex values.

Context:

  • PR Fix NativeAOT hex config parser to handle 0x/0X prefix #127644 changed RhConfig::Environment::TryGetIntegerValue in src/coreclr/nativeaot/Runtime/RhConfig.cpp to accept and skip a leading 0x/0X prefix when parsing non-decimal values.
  • CONFIG_VAL_MAXLEN is currently defined in src/coreclr/nativeaot/Runtime/RhConfig.h as 16 with the comment //64 bit uint in hex.
  • TryGetIntegerValue uses TCHAR buffer[CONFIG_VAL_MAXLEN + 1] and rejects values where PalGetEnvironmentVariable returns cchResult >= cchBuffer.

Problem:

  • A full-width 64-bit hex value without prefix is 16 characters, e.g. FFFFFFFFFFFFFFFF, and still fits.
  • A full-width 64-bit hex value with prefix is 18 characters, e.g. 0xFFFFFFFFFFFFFFFF.
  • Since prefixed hex values are now accepted syntax, CONFIG_VAL_MAXLEN == 16 incorrectly rejects valid full-width prefixed 64-bit values before parsing.

Task:

  • Update the NativeAOT config parser length limit so values with a 0x/0X prefix plus up to 16 hex digits are accepted.
  • Prefer a clear implementation, such as defining the textual max length as 18 or separating max hex digits from max prefix length if that reads better.
  • Update nearby comments so they accurately describe the allowed input length.
  • Add or update tests if an appropriate NativeAOT config parsing test location exists. At minimum, ensure the change is covered by existing relevant tests or add targeted coverage for 0xFFFFFFFFFFFFFFFF / 0XFFFFFFFFFFFFFFFF if feasible.
  • Keep behavior for overlong values unchanged: values longer than prefix + 16 hex digits should still be rejected/truncated handling should remain safe.

Repository: dotnet/runtime
Related PR: #127644

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: is value of CONFIG_VAL_MAXLEN still correct after this PR merged?

Assistant: No — not if 0x/0X is now considered valid syntax for 64-bit hex config values.

CONFIG_VAL_MAXLEN is still:

#defineCONFIG_VAL_MAXLEN16//64 bit uint in hex

and the buffer is:

TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // hex digits plus a nul terminator.constuint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
returnfalse;

After the PR, a value like 0xFFFFFFFFFFFFFFFF is valid syntax conceptually — 16 hex digits for a full uint64_t, plus the 0x prefix — but it is 18 characters long. With CONFIG_VAL_MAXLEN == 16, the buffer only accepts up to 16 characters plus NUL, so this full-width prefixed value will be rejected before parsing.

So the constant should probably become something like:

#defineCONFIG_VAL_MAXLEN18// "0x" prefix + 64-bit uint in hex

or split into clearer constants, e.g. max hex digits = 16 and max textual length = 18.

The merged PR fixes common values like 0xC0000000, but it leaves this max-length edge case inconsistent with the comment and with the newly accepted prefix syntax.

User: make a PR with the fix

Assistant: I’m waiting for your confirmation to proceed with creating the PR.

This pull request was created from Copilot chat.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/9942cd0a-d0b4-4b91-baba-7ff32bbc30f9
Co-authored-by: MichalStrehovsky <13110571+MichalStrehovsky@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 21, 2026 22:53
CopilotAI changed the title [WIP] Fix NativeAOT's environment config value maximum lengthNativeAOT: allow full-width 0x/0X-prefixed 64-bit hex env config valuesMay 21, 2026
@MichalStrehovsky
MichalStrehovsky marked this pull request as ready for review May 22, 2026 00:48
CopilotAI review requested due to automatic review settings May 22, 2026 00:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates NativeAOT’s environment-variable integer config parsing to accept full-width 64-bit hex values when using the 0x/0X prefix, by increasing the fixed input buffer length and clarifying related comments.

Changes:

  • Increase CONFIG_VAL_MAXLEN from 16 to 18 to allow "0x" + 16 hex digits.
  • Update the TryGetIntegerValue local buffer comment to describe a textual-length bound rather than “hex digits”.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
src/coreclr/nativeaot/Runtime/RhConfig.hIncreases the max textual length constant for env integer config values to allow 0x/0X + 16 hex digits.
src/coreclr/nativeaot/Runtime/RhConfig.cppUpdates the local buffer comment for env integer parsing to reflect the new textual max length semantics.
Comments suppressed due to low confidence (1)

src/coreclr/nativeaot/Runtime/RhConfig.cpp:55

  • This change adjusts the accepted textual length for environment-provided integer config values, but I couldn’t find any targeted test that covers a full-width prefixed value like 0xFFFFFFFFFFFFFFFF/0XFFFFFFFFFFFFFFFF (and optionally an overlong value to confirm rejection). Adding a small NativeAOT-covered test case would help prevent regressions in this parsing edge case.
 TCHAR buffer[CONFIG_VAL_MAXLEN + 1]; // Max textual integer value plus a nul terminator.
const uint32_t cchBuffer = ARRAY_SIZE(buffer);
uint32_t cchResult = PalGetEnvironmentVariable(variableName, buffer, cchBuffer);
if (cchResult == 0 || cchResult >= cchBuffer)
return false;

Comment threadsrc/coreclr/nativeaot/Runtime/RhConfig.h
@MichalStrehovsky

Copy link
Copy Markdown
Member

/ba-g the osx failure is #128372 that is fixed in dotnet/sdk repo

@MichalStrehovsky
MichalStrehovsky merged commit 4a84da2 into mainMay 22, 2026
104 of 106 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the copilot/fix-nativeaot-config-max-length branch May 22, 2026 06:58
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 23, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@jkotas