std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee
, '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

std: allocate less memory in current_exe for OpenBSD - #158183

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe
Jul 6, 2026
Merged

std: allocate less memory in current_exe for OpenBSD#158183
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
joboet:openbsd_current_exe

Conversation

@joboet

Copy link
Copy Markdown
Member

This bug was introduced back in 2f42ac4 when Alex ported the current_exe implementation from C to Rust. Vec::with_capacity measures capacity in the number of elements, but sysctl measures it in bytes, so we need to do some conversions.

CC @semarie

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Jun 20, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @Mark-Simulacrum

rustbot has assigned @Mark-Simulacrum.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: @ChrisDenton, libs
  • @ChrisDenton, libs expanded to 12 candidates
  • Random selection from Darksonn, Mark-Simulacrum, clarfonthey, jhpratt

@semarie

Copy link
Copy Markdown
Contributor

it seems a bit over engineered to me : sizeof(char) is 1 on all platforms that OpenBSD support.
it isn't a strong objection, but I would like to understand the rational.

@joboet

joboet commented Jun 20, 2026

Copy link
Copy Markdown
MemberAuthor

Yes, but this isn't about an array of characters but of pointers, and size_of::<*mut c_char>() definitely isn't 1.

@@ -234,11 +234,17 @@ pub fn current_exe() -> io::Result<PathBuf> {
unsafe {
let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV];

@workingjubileeworkingjubileeJun 20, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Studying https://man.openbsd.org/sysctl.2#KERN_PROC_ARGS

...So uh is there a reason, since we have to make two sysctl calls, that we don't just ask for KERN_PROC_NARGV the first time?

...though "KERN_PROC_NARGV and KERN_PROC_NENV return the number of elements as an int in the argv or env array." has got to be the most curious phrasing possible for that.

View changes since the review

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated
let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize);
// ... allocate a buffer for it ...
let mut argv =
Vec::<*const libc::c_char>::with_capacity(argv_len / size_of::<*const libc::c_char>());

@Mark-SimulacrumMark-SimulacrumJun 21, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we checked_div_exact and panic here just in case? I guess it seems a bit unlikely that this goes wrong (and would be a platform/libc bug anyway).

View changes since the review

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah, why not...

@Mark-Simulacrum

Copy link
Copy Markdown
Member

r=me if you're happy

Comment threadlibrary/std/src/sys/paths/unix.rs Outdated

@joboetjoboetJun 21, 2026

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@semarie (since you added this in fcb30a0) do you remember why this checks for dots? Spawning ".my-executable" will still result in it being looked up in the PATH, which I'd have thought is the difference between the two branches here...

View changes since the review

@semariesemarieJun 25, 2026

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.

I think the original intent of the C code was to checking if argv0 was starting with "./"

/* get realpath if possible */if ((argv[0] !=NULL) && ((*argv[0] =='.') || (*argv[0] =='/')
|| (strstr(argv[0], "/") !=NULL)))

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.

but yeah, it doesn't seems right. checking if argv0 contains "/" should be enough

@joboet
joboetforce-pushed the openbsd_current_exe branch from 495d78c to db9b6a1CompareJune 25, 2026 12:49

@Mark-SimulacrumMark-Simulacrum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@rustbot label +I-libs-api-nominated

This changes the behavior of std::env::current_exe on OpenBSD to not attempt to canonicalize an argv[0] if it starts with .. Previously we would canonicalize both if it starts with . or if it contains / anywhere in the path, now only the latter is checked.

IMO this is eminently reasonable and we should make the change, but in theory it seems plausible that some program is broken by this. (I suspect it's more likely that some programs are fixed by it, but hard to say).

View changes since this review

}
let argv0 = CStr::from_ptr(argv[0]).to_bytes();
if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') {
if argv0.iter().any(|b| *b == b'/') {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I guess technically we should FCP this breakage, let me nominate for libs-api to decide.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We discussed this in the @rust-lang/libs-api meeting and consider this a bug fix, not something that needs an FCP. There's no reason to check for a leading ., this doesn't determine whether a string represents a relative or absolute path.

@rustbotrustbot added the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 28, 2026
@AmanieuAmanieu removed the I-libs-api-nominated [DEPRECATED; DO NOT USE] label Jun 30, 2026
@Mark-Simulacrum

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-borsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit db9b6a1 has been approved by Mark-Simulacrum

It is now in the queue for this repository.

🌲 The tree is currently closed for pull requests below priority 1000. This pull request will be tested once the tree is reopened.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 4, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 5, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 5, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 6, 2026
…-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 20 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158807 (Add regression test for CString::clone_into unwind safety)
- #158825 (Fix typo)
@jhprattjhpratt mentioned this pull request Jul 6, 2026
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
rust-borsBot pushed a commit that referenced this pull request Jul 6, 2026
Rollup of 24 pull requests
Successful merges:
- #158377 (add `-Zforce-intrinsic-fallback` flag)
- #158642 (Clarify some interning details)
- #158694 (Positive test for closures needing expectations)
- #158743 (Look for cdb location in the registry first)
- #158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- #158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- #158785 (hook intrinsic-test into aarch64-gnu)
- #158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- #157734 (Stabilize `local_key_cell_update`)
- #158183 (std: allocate less memory in `current_exe` for OpenBSD)
- #158310 (Remove unexpected usage of Unambig in non-infer variants)
- #158671 (Move tests batch 17)
- #158730 (Update `FIXME(static_mut_refs)` comments)
- #158752 (Reorganize `tests/ui/issues` [18/N])
- #158755 (Use `ThinVec` more in the AST)
- #158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- #158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- #158771 (library: expand HashSet::extract_if coverage)
- #158772 (rustc-dev-guide subtree update)
- #158776 (fix: emit diagnostic for AVR target without target-cpu)
- #158786 (Add regression test for builtin attr macro values)
- #158810 (Add supplementary information for get_unchecked(mut))
- #158825 (Fix typo)
- #158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
@rust-bors
rust-borsBot merged commit 2f8aa14 into rust-lang:mainJul 6, 2026
13 checks passed
@rustbotrustbot added this to the 1.99.0 milestone Jul 6, 2026
rust-timer added a commit that referenced this pull request Jul 6, 2026
Rollup merge of #158183 - joboet:openbsd_current_exe, r=Mark-Simulacrum
std: allocate less memory in `current_exe` for OpenBSD
This bug was introduced back in 2f42ac4 when Alex ported the `current_exe` implementation from C to Rust. `Vec::with_capacity` measures capacity in the number of elements, but `sysctl` measures it in bytes, so we need to do some conversions.
CC @semarie
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 7, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request Jul 20, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 24 pull requests
Successful merges:
- rust-lang/rust#158377 (add `-Zforce-intrinsic-fallback` flag)
- rust-lang/rust#158642 (Clarify some interning details)
- rust-lang/rust#158694 (Positive test for closures needing expectations)
- rust-lang/rust#158743 (Look for cdb location in the registry first)
- rust-lang/rust#158775 (bootstrap: only encode RUSTFLAGS when a flag contains a space)
- rust-lang/rust#158782 (Add and use cfg(target_has_threads) to enforce no_thread impl usage)
- rust-lang/rust#158785 (hook intrinsic-test into aarch64-gnu)
- rust-lang/rust#158819 (Put `InhabitedPredicate::NotInModule` earlier in disjunction since it can be a lot faster)
- rust-lang/rust#157734 (Stabilize `local_key_cell_update`)
- rust-lang/rust#158183 (std: allocate less memory in `current_exe` for OpenBSD)
- rust-lang/rust#158310 (Remove unexpected usage of Unambig in non-infer variants)
- rust-lang/rust#158671 (Move tests batch 17)
- rust-lang/rust#158730 (Update `FIXME(static_mut_refs)` comments)
- rust-lang/rust#158752 (Reorganize `tests/ui/issues` [18/N])
- rust-lang/rust#158755 (Use `ThinVec` more in the AST)
- rust-lang/rust#158757 (Fix incorrect tracking issue for `read_le`/`read_be`)
- rust-lang/rust#158765 (Fix ICE on non-ident path in `doc(auto_cfg values)`)
- rust-lang/rust#158771 (library: expand HashSet::extract_if coverage)
- rust-lang/rust#158772 (rustc-dev-guide subtree update)
- rust-lang/rust#158776 (fix: emit diagnostic for AVR target without target-cpu)
- rust-lang/rust#158786 (Add regression test for builtin attr macro values)
- rust-lang/rust#158810 (Add supplementary information for get_unchecked(mut))
- rust-lang/rust#158825 (Fix typo)
- rust-lang/rust#158838 (tidy: Use `empty_alternate = true` for triagebot mention glob check)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@joboet@rustbot@semarie@Mark-Simulacrum@Amanieu@workingjubilee