Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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" + '
Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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('^' + ".*" + ' Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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('^' + ".*" + ' Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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" + ' Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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('^' + ".*" + ' Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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('^' + ".*" + ' Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui
, '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); } })(); })(); Fix sigreturn for x86 by CvvT · Pull Request #668 · microsoft/litebox · GitHub
Skip to content

Fix sigreturn for x86 - #668

Merged
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn
Feb 24, 2026
Merged

Fix sigreturn for x86#668
Weiteng Chen (CvvT) merged 2 commits into
mainfrom
weiteng/fix_sigreturn

Conversation

@CvvT

@CvvTWeiteng Chen (CvvT) commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

According to Linux, esp - 8 should point to SignalFrame instead of LegacyContext. We could also remove the - 8 and following wrapping_add directly but keep it just to be consistent with Linux.

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

@CvvT
Weiteng Chen (CvvT) marked this pull request as ready for review February 18, 2026 21:47
@github-actions

Copy link
Copy Markdown

🤖 SemverChecks 🤖 No breaking API changes detected

Note: this does not mean API is unchanged, or even that there are no breaking changes; simply, none of the detections triggered.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

There are some potential overflow issues where we perform some arithmetic operations on user provided input. We should always use checked_* or wrapping_*. There are likely more similar issues in the codebase, and this PR only fixes the ones related to sigreturn.

Just learnt that Rust detects integer overflows in debug mode but does wrapping in release mode. Technically, it should be fine without the fix as we don't expect malicious input in debug mode.

@jaybosamiya-ms

Jay Bosamiya (Microsoft) (jaybosamiya-ms) commented Feb 19, 2026

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

@wdcui

Copy link
Copy Markdown
Member

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue
HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64)
MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values
MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset
LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

@CvvT

Copy link
Copy Markdown
ContributorAuthor

I asked Claude to find similar bugs in other places and got the following:

Priority | File | Line(s) | Issue HIGH | signal/x86.rs | 145-146, 175-176 | + should be wrapping_add (inconsistent with x86_64) MEDIUM | signal/mod.rs | 266, 353 | + on user-provided alt-stack values MEDIUM | process.rs | 471, 478, 494 | + with user-controlled futex_offset LOW | signal/x86_64.rs | 23-25 | Implicit offset assumption (fragile, not broken today)

I also asked agent to do the same thing, and it gave some reasonable results. The bigger question is how to find all similar issue and how to prevent it from happening in the future. It would be better if we have a systematic approach. Meanwhile, I can submit a separate PR to fix all issues that AI found.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

@wdcui

Copy link
Copy Markdown
Member

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Thanks for mentioning the arithmetic thing! Indeed we have some number of arith issues that have slipped in over time and we should do a cleanup pass at some point. For now, the semantics seem reasonable enough (i.e., we can just hard set them to checked/wrapping via a compile time flag depending on what we need) but a cleanup would be good. The harder part is longer-term enforcement which I don't have a good solution for (there are some very good reasons to use normal arith, and we can't just ban +/-/...). Also, briefly: when looking for places to cleanup, we should also look for places where saturating_* is the right move (not just checked_* or wrapping_*). For example, one of the changes I'm working on rn has such a natural use case (let available = data.len().saturating_sub(offset);).

I agree long-term enforcement would be difficult. It would be nice if we can differentiate user input from validated data, then we will be cautious about any operations on the non-validated data.

I have been thinking that we could leverate GH agentic workflows to run checks of various patterns periodically to look for bugs introduced in new code. This could be one of them. And we can add other checks as well.

I just created one on a forked repo: https://github.com/CvvT/litebox/tasks/211f64ae-2e6f-4d63-9f09-7ef03a8104e8?author=CvvT
Let's see how it works out.

@wdcui

Copy link
Copy Markdown
Member

Weiteng Chen (@CvvT), would you like to merge this PR?

@CvvT

Copy link
Copy Markdown
ContributorAuthor

Weiteng Chen (@CvvT), would you like to merge this PR?

Yes, I was waiting for you to approve it.

@CvvT
Weiteng Chen (CvvT) added this pull request to the merge queueFeb 24, 2026
Merged via the queue into main with commit 35866b9Feb 24, 2026
14 checks passed
@CvvT
Weiteng Chen (CvvT) deleted the weiteng/fix_sigreturn branch February 24, 2026 19:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@CvvT@jaybosamiya-ms@wdcui