test(libc): reset errno after the worker thread in guest_errors
guest_errors sets errno to 13 and checks at the end that the strerror_r calls left it alone, but a std::thread is created and joined in between. Guest errno is the host's errno. Since glibc 2.42, pthread_create first tries madvise(MADV_GUARD_INSTALL) for the new thread's stack guard. Kernels before 6.13, including WSL2's 6.6, reject it with EINVAL, and glibc falls back to mprotect with errno left at EINVAL. POSIX leaves errno unspecified after a successful call, so the test aborts on Ubuntu 26.04 (glibc 2.43) under WSL2 without anything being wrong. Check errno right after the strerror calls, and set it to 13 again after the join, so every errno check covers only strerror and strerror_r.
This commit is contained in:
parent
7995d6578d
commit
9850628e1b
|
|
@ -15,10 +15,12 @@ int main() {
|
|||
Require(*__error_nid_postfix() == 13);
|
||||
Require(std::strcmp(strerror_nid_postfix(78), "Function not implemented") == 0);
|
||||
char* parent = strerror_nid_postfix(22);
|
||||
Require(*__error_nid_postfix() == 13);
|
||||
std::thread worker([] {
|
||||
Require(std::strcmp(strerror_nid_postfix(45), "Operation not supported") == 0);
|
||||
});
|
||||
worker.join();
|
||||
*__error_nid_postfix() = 13;
|
||||
Require(std::strcmp(parent, "Invalid argument") == 0);
|
||||
char buffer[128];
|
||||
for (int error = 0; error <= 96; ++error) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue