commit f02515d8a6963158e0e4be8034b96c658e1b9a32 Author: Andreas K. Hüttel Date: Fri Jan 23 23:59:36 2026 +0100 Replace advisories directory with file ADVISORIES Signed-off-by: Andreas K. Hüttel diff --git a/ADVISORIES b/ADVISORIES new file mode 100644 index 0000000000..d4e33f2df3 --- /dev/null +++ b/ADVISORIES @@ -0,0 +1,2 @@ +For the GNU C Library Security Advisories, see the git master branch: +https://sourceware.org/git/?p=glibc.git;a=tree;f=advisories;hb=HEAD diff --git a/advisories/GLIBC-SA-2023-0001 b/advisories/GLIBC-SA-2023-0001 deleted file mode 100644 index 3d19c91b6a..0000000000 --- a/advisories/GLIBC-SA-2023-0001 +++ /dev/null @@ -1,14 +0,0 @@ -printf: incorrect output for integers with thousands separator and width field - -When the printf family of functions is called with a format specifier -that uses an (enable grouping) and a minimum width -specifier, the resulting output could be larger than reasonably expected -by a caller that computed a tight bound on the buffer size. The -resulting larger than expected output could result in a buffer overflow -in the printf family of functions. - -CVE-Id: CVE-2023-25139 -Public-Date: 2023-02-02 -Vulnerable-Commit: e88b9f0e5cc50cab57a299dc7efe1a4eb385161d (2.37) -Fix-Commit: c980549cc6a1c03c23cc2fe3e7b0fe626a0364b0 (2.38) -Fix-Commit: 07b9521fc6369d000216b96562ff7c0ed32a16c4 (2.37-4) diff --git a/advisories/GLIBC-SA-2023-0002 b/advisories/GLIBC-SA-2023-0002 deleted file mode 100644 index 5122669a64..0000000000 --- a/advisories/GLIBC-SA-2023-0002 +++ /dev/null @@ -1,15 +0,0 @@ -getaddrinfo: Stack read overflow in no-aaaa mode - -If the system is configured in no-aaaa mode via /etc/resolv.conf, -getaddrinfo is called for the AF_UNSPEC address family, and a DNS -response is received over TCP that is larger than 2048 bytes, -getaddrinfo may potentially disclose stack contents via the returned -address data, or crash. - -CVE-Id: CVE-2023-4527 -Public-Date: 2023-09-12 -Vulnerable-Commit: f282cdbe7f436c75864e5640a409a10485e9abb2 (2.36) -Fix-Commit: bd77dd7e73e3530203be1c52c8a29d08270cb25d (2.39) -Fix-Commit: 4ea972b7edd7e36610e8cde18bf7a8149d7bac4f (2.36-113) -Fix-Commit: b7529346025a130fee483d42178b5c118da971bb (2.37-38) -Fix-Commit: b25508dd774b617f99419bdc3cf2ace4560cd2d6 (2.38-19) diff --git a/advisories/GLIBC-SA-2023-0003 b/advisories/GLIBC-SA-2023-0003 deleted file mode 100644 index d3aef80348..0000000000 --- a/advisories/GLIBC-SA-2023-0003 +++ /dev/null @@ -1,15 +0,0 @@ -getaddrinfo: Potential use-after-free - -When an NSS plugin only implements the _gethostbyname2_r and -_getcanonname_r callbacks, getaddrinfo could use memory that was freed -during buffer resizing, potentially causing a crash or read or write to -arbitrary memory. - -CVE-Id: CVE-2023-4806 -Public-Date: 2023-09-12 -Fix-Commit: 973fe93a5675c42798b2161c6f29c01b0e243994 (2.39) -Fix-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) -Fix-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) -Fix-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) -Fix-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) -Fix-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) diff --git a/advisories/GLIBC-SA-2023-0004 b/advisories/GLIBC-SA-2023-0004 deleted file mode 100644 index 5286a7aa54..0000000000 --- a/advisories/GLIBC-SA-2023-0004 +++ /dev/null @@ -1,16 +0,0 @@ -tunables: local privilege escalation through buffer overflow - -If a tunable of the form NAME=NAME=VAL is passed in the environment of a -setuid program and NAME is valid, it may result in a buffer overflow, -which could be exploited to achieve escalated privileges. This flaw was -introduced in glibc 2.34. - -CVE-Id: CVE-2023-4911 -Public-Date: 2023-10-03 -Vulnerable-Commit: 2ed18c5b534d9e92fc006202a5af0df6b72e7aca (2.34) -Fix-Commit: 1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa (2.39) -Fix-Commit: dcc367f148bc92e7f3778a125f7a416b093964d9 (2.34-423) -Fix-Commit: c84018a05aec80f5ee6f682db0da1130b0196aef (2.35-274) -Fix-Commit: 22955ad85186ee05834e47e665056148ca07699c (2.36-118) -Fix-Commit: b4e23c75aea756b4bddc4abcf27a1c6dca8b6bd3 (2.37-45) -Fix-Commit: 750a45a783906a19591fb8ff6b7841470f1f5701 (2.38-27) diff --git a/advisories/GLIBC-SA-2023-0005 b/advisories/GLIBC-SA-2023-0005 deleted file mode 100644 index cc4eb90b82..0000000000 --- a/advisories/GLIBC-SA-2023-0005 +++ /dev/null @@ -1,18 +0,0 @@ -getaddrinfo: DoS due to memory leak - -The fix for CVE-2023-4806 introduced a memory leak when an application -calls getaddrinfo for AF_INET6 with AI_CANONNAME, AI_ALL and AI_V4MAPPED -flags set. - -CVE-Id: CVE-2023-5156 -Public-Date: 2023-09-25 -Vulnerable-Commit: e09ee267c03e3150c2c9ba28625ab130705a485e (2.34-420) -Vulnerable-Commit: e3ccb230a961b4797510e6a1f5f21fd9021853e7 (2.35-270) -Vulnerable-Commit: a9728f798ec7f05454c95637ee6581afaa9b487d (2.36-115) -Vulnerable-Commit: 6529a7466c935f36e9006b854d6f4e1d4876f942 (2.37-39) -Vulnerable-Commit: 00ae4f10b504bc4564e9f22f00907093f1ab9338 (2.38-20) -Fix-Commit: 8006457ab7e1cd556b919f477348a96fe88f2e49 (2.34-421) -Fix-Commit: 17092c0311f954e6f3c010f73ce3a78c24ac279a (2.35-272) -Fix-Commit: 856bac55f98dc840e7c27cfa82262b933385de90 (2.36-116) -Fix-Commit: 4473d1b87d04b25cdd0e0354814eeaa421328268 (2.37-42) -Fix-Commit: 5ee59ca371b99984232d7584fe2b1a758b4421d3 (2.38-24) diff --git a/advisories/GLIBC-SA-2024-0001 b/advisories/GLIBC-SA-2024-0001 deleted file mode 100644 index 28931c75ae..0000000000 --- a/advisories/GLIBC-SA-2024-0001 +++ /dev/null @@ -1,15 +0,0 @@ -syslog: Heap buffer overflow in __vsyslog_internal - -__vsyslog_internal did not handle a case where printing a SYSLOG_HEADER -containing a long program name failed to update the required buffer -size, leading to the allocation and overflow of a too-small buffer on -the heap. - -CVE-Id: CVE-2023-6246 -Public-Date: 2024-01-30 -Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) -Fix-Commit: 6bd0e4efcc78f3c0115e5ea9739a1642807450da (2.39) -Fix-Commit: 23514c72b780f3da097ecf33a793b7ba9c2070d2 (2.38-42) -Fix-Commit: 97a4292aa4a2642e251472b878d0ec4c46a0e59a (2.37-57) -Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) -Fix-Commit: d1a83b6767f68b3cb5b4b4ea2617254acd040c82 (2.36-126) diff --git a/advisories/GLIBC-SA-2024-0002 b/advisories/GLIBC-SA-2024-0002 deleted file mode 100644 index 940bfcf2fc..0000000000 --- a/advisories/GLIBC-SA-2024-0002 +++ /dev/null @@ -1,15 +0,0 @@ -syslog: Heap buffer overflow in __vsyslog_internal - -__vsyslog_internal used the return value of snprintf/vsnprintf to -calculate buffer sizes for memory allocation. If these functions (for -any reason) failed and returned -1, the resulting buffer would be too -small to hold output. - -CVE-Id: CVE-2023-6779 -Public-Date: 2024-01-30 -Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) -Fix-Commit: 7e5a0c286da33159d47d0122007aac016f3e02cd (2.39) -Fix-Commit: d0338312aace5bbfef85e03055e1212dd0e49578 (2.38-43) -Fix-Commit: 67062eccd9a65d7fda9976a56aeaaf6c25a80214 (2.37-58) -Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) -Fix-Commit: 2bc9d7c002bdac38b5c2a3f11b78e309d7765b83 (2.36-127) diff --git a/advisories/GLIBC-SA-2024-0003 b/advisories/GLIBC-SA-2024-0003 deleted file mode 100644 index b43a5150ab..0000000000 --- a/advisories/GLIBC-SA-2024-0003 +++ /dev/null @@ -1,13 +0,0 @@ -syslog: Integer overflow in __vsyslog_internal - -__vsyslog_internal calculated a buffer size by adding two integers, but -did not first check if the addition would overflow. - -CVE-Id: CVE-2023-6780 -Public-Date: 2024-01-30 -Vulnerable-Commit: 52a5be0df411ef3ff45c10c7c308cb92993d15b1 (2.37) -Fix-Commit: ddf542da94caf97ff43cc2875c88749880b7259b (2.39) -Fix-Commit: d37c2b20a4787463d192b32041c3406c2bd91de0 (2.38-44) -Fix-Commit: 2b58cba076e912961ceaa5fa58588e4b10f791c0 (2.37-59) -Vulnerable-Commit: b0e7888d1fa2dbd2d9e1645ec8c796abf78880b9 (2.36-16) -Fix-Commit: b9b7d6a27aa0632f334352fa400771115b3c69b7 (2.36-128) diff --git a/advisories/GLIBC-SA-2024-0004 b/advisories/GLIBC-SA-2024-0004 deleted file mode 100644 index 08df2b3118..0000000000 --- a/advisories/GLIBC-SA-2024-0004 +++ /dev/null @@ -1,28 +0,0 @@ -ISO-2022-CN-EXT: fix out-of-bound writes when writing escape sequence - -The iconv() function in the GNU C Library versions 2.39 and older may -overflow the output buffer passed to it by up to 4 bytes when converting -strings to the ISO-2022-CN-EXT character set, which may be used to -crash an application or overwrite a neighbouring variable. - -ISO-2022-CN-EXT uses escape sequences to indicate character set changes -(as specified by RFC 1922). While the SOdesignation has the expected -bounds checks, neither SS2designation nor SS3designation have its; -allowing a write overflow of 1, 2, or 3 bytes with fixed values: -'$+I', '$+J', '$+K', '$+L', '$+M', or '$*H'. - -CVE-Id: CVE-2024-2961 -Public-Date: 2024-04-17 -Vulnerable-Commit: 755104edc75c53f4a0e7440334e944ad3c6b32fc (2.1.93-169) -Fix-Commit: f9dc609e06b1136bb0408be9605ce7973a767ada (2.40) -Fix-Commit: 31da30f23cddd36db29d5b6a1c7619361b271fb4 (2.39-31) -Fix-Commit: e1135387deded5d73924f6ca20c72a35dc8e1bda (2.38-66) -Fix-Commit: 89ce64b269a897a7780e4c73a7412016381c6ecf (2.37-89) -Fix-Commit: 4ed98540a7fd19f458287e783ae59c41e64df7b5 (2.36-164) -Fix-Commit: 36280d1ce5e245aabefb877fe4d3c6cff95dabfa (2.35-315) -Fix-Commit: a8b0561db4b9847ebfbfec20075697d5492a363c (2.34-459) -Fix-Commit: ed4f16ff6bed3037266f1fa682ebd32a18fce29c (2.33-263) -Fix-Commit: 682ad4c8623e611a971839990ceef00346289cc9 (2.32-140) -Fix-Commit: 3703c32a8d304c1ee12126134ce69be965f38000 (2.31-154) - -Reported-By: Charles Fol diff --git a/advisories/GLIBC-SA-2024-0005 b/advisories/GLIBC-SA-2024-0005 deleted file mode 100644 index a59596610a..0000000000 --- a/advisories/GLIBC-SA-2024-0005 +++ /dev/null @@ -1,22 +0,0 @@ -nscd: Stack-based buffer overflow in netgroup cache - -If the Name Service Cache Daemon's (nscd) fixed size cache is exhausted -by client requests then a subsequent client request for netgroup data -may result in a stack-based buffer overflow. This flaw was introduced -in glibc 2.15 when the cache was added to nscd. - -This vulnerability is only present in the nscd binary. - -CVE-Id: CVE-2024-33599 -Public-Date: 2024-04-23 -Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) -Fix-Commit: 69c58d5ef9f584ea198bd00f7964d364d0e6b921 (2.31-155) -Fix-Commit: a77064893bfe8a701770e2f53a4d33805bc47a5a (2.32-141) -Fix-Commit: 5c75001a96abcd50cbdb74df24c3f013188d076e (2.33-264) -Fix-Commit: 52f73e5c4e29b14e79167272297977f360ae1e97 (2.34-460) -Fix-Commit: 7a95873543ce225376faf13bb71c43dea6d24f86 (2.35-316) -Fix-Commit: caa3151ca460bdd9330adeedd68c3112d97bffe4 (2.36-165) -Fix-Commit: f75c298e747b2b8b41b1c2f551c011a52c41bfd1 (2.37-91) -Fix-Commit: 5968aebb86164034b8f8421b4abab2f837a5bdaf (2.38-72) -Fix-Commit: 1263d583d2e28afb8be53f8d6922f0842036f35d (2.39-35) -Fix-Commit: 87801a8fd06db1d654eea3e4f7626ff476a9bdaa (2.40) diff --git a/advisories/GLIBC-SA-2024-0006 b/advisories/GLIBC-SA-2024-0006 deleted file mode 100644 index d44148d3d9..0000000000 --- a/advisories/GLIBC-SA-2024-0006 +++ /dev/null @@ -1,32 +0,0 @@ -nscd: Null pointer crash after notfound response - -If the Name Service Cache Daemon's (nscd) cache fails to add a not-found -netgroup response to the cache, the client request can result in a null -pointer dereference. This flaw was introduced in glibc 2.15 when the -cache was added to nscd. - -This vulnerability is only present in the nscd binary. - -CVE-Id: CVE-2024-33600 -Public-Date: 2024-04-24 -Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) -Fix-Commit: b048a482f088e53144d26a61c390bed0210f49f2 (2.40) -Fix-Commit: 7835b00dbce53c3c87bbbb1754a95fb5e58187aa (2.40) -Fix-Commit: c99f886de54446cd4447db6b44be93dabbdc2f8b (2.39-37) -Fix-Commit: 5a508e0b508c8ad53bd0d2fb48fd71b242626341 (2.39-36) -Fix-Commit: 2ae9446c1b7a3064743b4a51c0bbae668ee43e4c (2.38-74) -Fix-Commit: 541ea5172aa658c4bd5c6c6d6fd13903c3d5bb0a (2.38-73) -Fix-Commit: a8070b31043c7585c36ba68a74298c4f7af075c3 (2.37-93) -Fix-Commit: 5eea50c4402e39588de98aa1d4469a79774703d4 (2.37-92) -Fix-Commit: f205b3af56740e3b014915b1bd3b162afe3407ef (2.36-167) -Fix-Commit: c34f470a615b136170abd16142da5dd0c024f7d1 (2.36-166) -Fix-Commit: bafadc589fbe21ae330e8c2af74db9da44a17660 (2.35-318) -Fix-Commit: 4370bef52b0f3f3652c6aa13d7a9bb3ac079746d (2.35-317) -Fix-Commit: 1f94122289a9bf7dba573f5d60327aaa2b85cf2e (2.34-462) -Fix-Commit: 966d6ac9e40222b84bb21674cc4f83c8d72a5a26 (2.34-461) -Fix-Commit: e3eef1b8fbdd3a7917af466ca9c4b7477251ca79 (2.33-266) -Fix-Commit: f20a8d696b13c6261b52a6434899121f8b19d5a7 (2.33-265) -Fix-Commit: be602180146de37582a3da3a0caa4b719645de9c (2.32-143) -Fix-Commit: 394eae338199078b7961b051c191539870742d7b (2.32-142) -Fix-Commit: 8d7949183760170c61e55def723c1d8050187874 (2.31-157) -Fix-Commit: 304ce5fe466c4762b21b36c26926a4657b59b53e (2.31-156) diff --git a/advisories/GLIBC-SA-2024-0007 b/advisories/GLIBC-SA-2024-0007 deleted file mode 100644 index b6928fa27a..0000000000 --- a/advisories/GLIBC-SA-2024-0007 +++ /dev/null @@ -1,28 +0,0 @@ -nscd: netgroup cache may terminate daemon on memory allocation failure - -The Name Service Cache Daemon's (nscd) netgroup cache uses xmalloc or -xrealloc and these functions may terminate the process due to a memory -allocation failure resulting in a denial of service to the clients. The -flaw was introduced in glibc 2.15 when the cache was added to nscd. - -This vulnerability is only present in the nscd binary. - -Subsequent refactoring of the netgroup cache only added more uses of -xmalloc and xrealloc. Uses of xmalloc and xrealloc in other parts of -nscd only occur during startup of the daemon and so are not affected by -client requests that could trigger an out of memory followed by -termination. - -CVE-Id: CVE-2024-33601 -Public-Date: 2024-04-24 -Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) -Fix-Commit: c04a21e050d64a1193a6daab872bca2528bda44b (2.40) -Fix-Commit: a9a8d3eebb145779a18d90e3966009a1daa63cd8 (2.39-38) -Fix-Commit: 71af8ca864345d39b746d5cee84b94b430fad5db (2.38-75) -Fix-Commit: 6e106dc214d6a033a4e945d1c6cf58061f1c5f1f (2.37-94) -Fix-Commit: b6742463694b1dfdd5120b91ee21cf05d15ec2e2 (2.36-168) -Fix-Commit: 7a5864cac60e06000394128a5a2817b03542f5a3 (2.35-319) -Fix-Commit: 86f1d5f4129c373ac6fb6df5bcf38273838843cb (2.34-463) -Fix-Commit: 4d27d4b9a188786fc6a56745506cec2acfc51f83 (2.33-267) -Fix-Commit: 3ed195a8ec89da281e3c4bf887a13d281b72d8f4 (2.32-144) -Fix-Commit: bbf5a58ccb55679217f94de706164d15372fbbc0 (2.31-158) diff --git a/advisories/GLIBC-SA-2024-0008 b/advisories/GLIBC-SA-2024-0008 deleted file mode 100644 index d93e2a6f0b..0000000000 --- a/advisories/GLIBC-SA-2024-0008 +++ /dev/null @@ -1,26 +0,0 @@ -nscd: netgroup cache assumes NSS callback uses in-buffer strings - -The Name Service Cache Daemon's (nscd) netgroup cache can corrupt memory -when the NSS callback does not store all strings in the provided buffer. -The flaw was introduced in glibc 2.15 when the cache was added to nscd. - -This vulnerability is only present in the nscd binary. - -There is no guarantee from the NSS callback API that the returned -strings are all within the buffer. However, the netgroup cache code -assumes that the NSS callback uses in-buffer strings and if it doesn't -the buffer resizing logic could lead to potential memory corruption. - -CVE-Id: CVE-2024-33602 -Public-Date: 2024-04-24 -Vulnerable-Commit: 684ae515993269277448150a1ca70db3b94aa5bd (2.15) -Fix-Commit: c04a21e050d64a1193a6daab872bca2528bda44b (2.40) -Fix-Commit: a9a8d3eebb145779a18d90e3966009a1daa63cd8 (2.39-38) -Fix-Commit: 71af8ca864345d39b746d5cee84b94b430fad5db (2.38-75) -Fix-Commit: 6e106dc214d6a033a4e945d1c6cf58061f1c5f1f (2.37-94) -Fix-Commit: b6742463694b1dfdd5120b91ee21cf05d15ec2e2 (2.36-168) -Fix-Commit: 7a5864cac60e06000394128a5a2817b03542f5a3 (2.35-319) -Fix-Commit: 86f1d5f4129c373ac6fb6df5bcf38273838843cb (2.34-463) -Fix-Commit: 4d27d4b9a188786fc6a56745506cec2acfc51f83 (2.33-267) -Fix-Commit: 3ed195a8ec89da281e3c4bf887a13d281b72d8f4 (2.32-144) -Fix-Commit: bbf5a58ccb55679217f94de706164d15372fbbc0 (2.31-158) diff --git a/advisories/GLIBC-SA-2025-0001 b/advisories/GLIBC-SA-2025-0001 deleted file mode 100644 index b053d32e91..0000000000 --- a/advisories/GLIBC-SA-2025-0001 +++ /dev/null @@ -1,40 +0,0 @@ -assert: Buffer overflow when printing assertion failure message - -When the assert() function fails, it does not allocate enough space for the -assertion failure message string and size information, which may lead to a -buffer overflow if the message string size aligns to page size. - -This bug can be triggered when an assertion in a program fails. The assertion -failure message is allocated to allow developers to see this failure in core -dumps and it typically includes, in addition to the invariant assertion -string and function name, the name of the program. If the name of the failing -program is user controlled, for example on a local system, this could allow an -attacker to control the assertion failure to trigger this buffer overflow. - -The only viable vector for exploitation of this bug is local, if a setuid -program exists that has an existing bug that results in an assertion failure. -No such program has been discovered at the time of publishing this advisory, -but the presence of custom setuid programs, although strongly discouraged as a -security practice, cannot be discounted. - -CVE-Id: CVE-2025-0395 -Public-Date: 2025-01-22 -Vulnerable-Commit: f8a3b5bf8fa1d0c43d2458e03cc109a04fdef194 (2.13-175) -Fix-Commit: 68ee0f704cb81e9ad0a78c644a83e1e9cd2ee578 (2.41) -Fix-Commit: cdb9ba84191ce72e86346fb8b1d906e7cd930ea2 (2.42) -Fix-Commit: 69fda28279b497bd405fdd442a6d8e4d3d5f681b (2.41-7) -Fix-Commit: 7d4b6bcae91f29d7b4daf15bab06b66cf1d2217c (2.40-66) -Fix-Commit: d6c156c326999f144cb5b73d29982108d549ad8a (2.40-71) -Fix-Commit: 808a84a8b81468b517a4d721fdc62069cb8c211f (2.39-146) -Fix-Commit: f6d48470aef9264d2d56f4c4533eb76db7f9c2e4 (2.39-150) -Fix-Commit: c32fd59314c343db88c3ea4a203870481d33c3d2 (2.38-122) -Fix-Commit: f984e2d7e8299726891a1a497a3c36cd5542a0bf (2.38-124) -Fix-Commit: a3d7865b098a3a67c44f7812208d9ce4718873ba (2.37-143) -Fix-Commit: b989519fe1683c204ac24ec92830e3fe3bfaccad (2.37-146) -Fix-Commit: 7971add7ee4171fdd8dfd17e7c04c4ed77a18845 (2.36-216) -Fix-Commit: 0487893d5c5bc6710d83d7c3152d888a0339559e (2.36-219) -Fix-Commit: 8b5d4be762419c4f6176261c6fea40ac559b88dc (2.35-370) -Fix-Commit: 8b3d09dc0d350191985f9d291cc30ce96f034b49 (2.35-373) -Fix-Commit: df4e1f4a5096b385c9bcc94424cf2eaa227b3761 (2.34-500) -Fix-Commit: 31eb872cb21449832ab47ad5db83281d240e1d03 (2.34-503) -Reported-By: Qualys Security Advisory diff --git a/advisories/GLIBC-SA-2025-0002 b/advisories/GLIBC-SA-2025-0002 deleted file mode 100644 index 161da13dd4..0000000000 --- a/advisories/GLIBC-SA-2025-0002 +++ /dev/null @@ -1,23 +0,0 @@ -elf: static setuid binary dlopen may incorrectly search LD_LIBRARY_PATH - -A statically linked setuid binary that calls dlopen (including internal -dlopen calls after setlocale or calls to NSS functions such as getaddrinfo) -may incorrectly search LD_LIBRARY_PATH to determine which library to load, -leading to the execution of library code that is attacker controlled. - -The only viable vector for exploitation of this bug is local, if a static -setuid program exists, and that program calls dlopen, then it may search -LD_LIBRARY_PATH to locate the SONAME to load. No such program has been -discovered at the time of publishing this advisory, but the presence of -custom setuid programs, although strongly discouraged as a security -practice, cannot be discounted. - -CVE-Id: CVE-2025-4802 -Public-Date: 2025-05-16 -Vulnerable-Commit: 10e93d968716ab82931d593bada121c17c0a4b93 (2.27) -Fix-Commit: 5451fa962cd0a90a0e2ec1d8910a559ace02bba0 (2.39) -Fix-Commit: 3be3728df2f1912c80abd3288bc6e3a25ad679e4 (2.38-132) -Fix-Commit: 7403ede2d7752e59e0c47d5d33d73c2bf850e7be (2.37-154) -Fix-Commit: 2ef7850279b2931caf6d6d6743ebaa91839e1cf7 (2.36-227) -Fix-Commit: 621c65ccf12ddd415ceeb2234423bd1acd0fabb3 (2.35-387) -Fix-Commit: 35018c0fd20eac9ceaf60060fed2745b3177359d (2.34-517) diff --git a/advisories/GLIBC-SA-2025-0003 b/advisories/GLIBC-SA-2025-0003 deleted file mode 100644 index 2adeb3ce00..0000000000 --- a/advisories/GLIBC-SA-2025-0003 +++ /dev/null @@ -1,30 +0,0 @@ -power10: strcmp fails to save and restore nonvolatile vector registers - -The Power 10 implementation of strcmp in -sysdeps/powerpc/powerpc64/le/power10/strcmp.S failed to save/restore -nonvolatile vector registers in the 32-byte aligned loop path. This -results in callers reading content from those registers in a different -context, potentially altering program logic. - -There could be a program context where a user controlled string could -leak through strcmp into program code, thus altering its logic. There -is also a potential for sensitive strings passed into strcmp leaking -through the clobbered registers into parts of the calling program that -should otherwise not have had access to those strings. - -The impact of this flaw is limited to applications running on Power 10 -hardware that use the nonvolatile vector registers, i.e. v20 to v31 -assuming that they have been treated in accordance with the OpenPower -psABI. It is possible to work around the issue for those specific -applications by setting the glibc.cpu.hwcaps tunable to "-arch_3_1" like -so: - - export GLIBC_TUNABLES=glibc.cpu.hwcaps=-arch_3_1 - -CVE-Id: CVE-2025-5702 -Public-Date: 2025-06-04 -Vulnerable-Commit: 3367d8e180848030d1646f088759f02b8dfe0d6f (2.39) -Fix-Commit: 15808c77b35319e67ee0dc8f984a9a1a434701bc (2.42) -Fix-Commit: 0c76c951620f9e12df2a89b2c684878b55bb6795 (2.41-60) -Fix-Commit: 7e12550b8e3a11764a4a9090ce6bd3fc23fc8a8e (2.40-139) -Fix-Commit: 06a70769fd0b2e1f2a3085ad50ab620282bd77b3 (2.39-209) diff --git a/advisories/GLIBC-SA-2025-0004 b/advisories/GLIBC-SA-2025-0004 deleted file mode 100644 index 9409ca27c4..0000000000 --- a/advisories/GLIBC-SA-2025-0004 +++ /dev/null @@ -1,29 +0,0 @@ -power10: strncmp fails to save and restore nonvolatile vector registers - -The Power 10 implementation of strncmp in -sysdeps/powerpc/powerpc64/le/power10/strncmp.S failed to save/restore -nonvolatile vector registers in the 32-byte aligned loop path. This -results in callers reading content from those registers in a different -context, potentially altering program logic. - -There could be a program context where a user controlled string could -leak through strncmp into program code, thus altering its logic. There -is also a potential for sensitive strings passed into strncmp leaking -through the clobbered registers into parts of the calling program that -should otherwise not have had access to those strings. - -The impact of this flaw is limited to applications running on Power 10 -hardware that use the nonvolatile vector registers, i.e. v20 to v31 -assuming that they have been treated in accordance with the OpenPower -psABI. It is possible to work around the issue for those specific -applications by setting the glibc.cpu.hwcaps tunable to "-arch_3_1" like -so: - - export GLIBC_TUNABLES=glibc.cpu.hwcaps=-arch_3_1 - -CVE-Id: CVE-2025-5745 -Public-Date: 2025-06-05 -Vulnerable-Commit: 23f0d81608d0ca6379894ef81670cf30af7fd081 (2.40) -Fix-Commit: 63c60101ce7c5eac42be90f698ba02099b41b965 (2.42) -Fix-Commit: 84bdbf8a6f2fdafd3661489dbb7f79835a52da82 (2.41-57) -Fix-Commit: 42a5a940c974d02540c8da26d6374c744d148cb9 (2.40-136) diff --git a/advisories/GLIBC-SA-2025-0005 b/advisories/GLIBC-SA-2025-0005 deleted file mode 100644 index 8bcccc59a5..0000000000 --- a/advisories/GLIBC-SA-2025-0005 +++ /dev/null @@ -1,14 +0,0 @@ -posix: Fix double-free after allocation failure in regcomp - -The regcomp function in the GNU C library version from 2.4 to 2.41 is -subject to a double free if some previous allocation fails. It can be -accomplished either by a malloc failure or by using an interposed -malloc that injects random malloc failures. The double free can allow -buffer manipulation depending of how the regex is constructed. -This issue affects all architectures and ABIs supported by the GNU C -library. - -CVE-Id: CVE-2025-8058 -Public-Date: 2025-07-22 -Vulnerable-Commit: 963d8d782fc98fb6dc3a66f0068795f9920c269d (2.3.3-1596) -Fix-Commit: 7ea06e994093fa0bcca0d0ee2c1db271d8d7885d (2.42) diff --git a/advisories/GLIBC-SA-2026-0001 b/advisories/GLIBC-SA-2026-0001 deleted file mode 100644 index 3e0ee3b3f4..0000000000 --- a/advisories/GLIBC-SA-2026-0001 +++ /dev/null @@ -1,41 +0,0 @@ -Integer overflow in memalign leads to heap corruption - -Passing too large an alignment to the memalign suite of functions -(memalign, posix_memalign, aligned_alloc) in the GNU C Library version -2.30 to 2.42 may result in an integer overflow, which could consequently -result in a heap corruption. - -Note that the attacker must have control over both, the size as well as -the alignment arguments of the memalign function to be able to exploit -this. The size parameter must be close enough to PTRDIFF_MAX so as to -overflow size_t along with the large alignment argument. This limits -the malicious inputs for the alignment for memalign to the range [1<<62 -+ 1, 1<<63] and exactly 1<<63 for posix_memalign and aligned_alloc. - -Typically the alignment argument passed to such functions is a known -constrained quantity (e.g. page size, block size, struct sizes) and is -not attacker controlled, because of which this may not be easily -exploitable in practice. An application bug could potentially result in -the input alignment being too large, e.g. due to a different buffer -overflow or integer overflow in the application or its dependent -libraries, but that is again an uncommon usage pattern given typical -sources of alignments. - -CVE-Id: CVE-2026-0861 -Public-Date: 2026-01-14 -Vulnerable-Commit: 9bf8e29ca136094f73f69f725f15c51facc97206 (2.30) -Fix-Commit: c9188d333717d3ceb7e3020011651f424f749f93 (2.43) -Fix-Commit: 7f19ef14fbce095d4c77395e258320cad2ea2b28 (2.30-153) -Fix-Commit: f18446d7b4a423090ee5e328c36b3c2a0f26041c (2.31-166) -Fix-Commit: 8aef9e7a7af9565c0324b4ecb38b30dfa3782fd8 (2.32-151) -Fix-Commit: 011293b4fd748cdd6f95874ba2b6aba9a3df8bff (2.33-275) -Fix-Commit: 2c77e52108a58956c9f674b36e1f59a4e3fdcf4d (2.34-525) -Fix-Commit: 499d1ccafccfe64df1b88deea2fa84d8180e8e8f (2.35-399) -Fix-Commit: fb6b8822175769b5794fb6ea04f2895483a29b61 (2.36-244) -Fix-Commit: 7b913d41a07836def826f2164c52541a9835f324 (2.37-172) -Fix-Commit: 744b63026a29f7eedbbc8e3a01a7f48a6eb0a085 (2.38-212) -Fix-Commit: fb22fd3f5b415dd4cd6f7b5741c2f0412374e242 (2.39-286) -Fix-Commit: bfc4dd9e526eacf3017dd8864ba0848e9d045dd4 (2.40-216) -Fix-Commit: 1e2c1ea4307197ccece0cda574bcfebf9080894c (2.41-121) -Fix-Commit: b0ec8fb689df862171f0f78994a3bdeb51313545 (2.42-49) -Reported-by: Igor Morgenstern, Aisle Research diff --git a/advisories/GLIBC-SA-2026-0002 b/advisories/GLIBC-SA-2026-0002 deleted file mode 100644 index f10d8362f6..0000000000 --- a/advisories/GLIBC-SA-2026-0002 +++ /dev/null @@ -1,36 +0,0 @@ -getnetbyaddr and getnetbyaddr_r leak stack contents to DNS resovler - -Calling getnetbyaddr or getnetbyaddr_r with a configured nsswitch.conf -that specifies the library's DNS backend for networks and queries for a -zero-valued network in the GNU C Library version 2.0 to version 2.42 -can leak stack contents to the configured DNS resolver. - -A defect in the _nss_dns_getnetbyaddr_r function which implements -getnetbyaddr and getnetbyaddr_r in the dns-based network database can -pass stack contents unmodified to the configured DNS resolver as part of -the network DNS query when the network queried is the default network -i.e. net == 0x0. This stack contents leaking in the query is considered -a loss of confidentiality for the host making the query. Typically it -is rare to call these APIs with a net value of zero, and if an attacker -can control the net value it can only leak adjacent stack, and so loss -of confidentiality is spatially limited. The leak might be used to -accelerate an ASLR bypass by knowing pointer values, but also requires -network adjacent access to snoop between the application and the -DNS server; making the attack complexity higher. - -CVE-Id: CVE-2026-0915 -Public-Date: 2026-01-15 -Vulnerable-Commit: 5f0e6fc702296840d2daa39f83f6cb1e40073d58 (1.92-1) -Fix-Commit: e56ff82d5034ec66c6a78f517af6faa427f65b0b (2.43) -Fix-Commit: 453e6b8dbab935257eb0802b0c97bca6b67ba30e (2.42-50) -Fix-Commit: 15c9839a0b853f552b4ed9047841b6223f3c104d (2.41-122) -Fix-Commit: 329c775788b2c9ff3da774ccf59fba7b6b8ff08e (2.40-217) -Fix-Commit: 831f63b94ceb92fb14c0d1a7ddad35a0d1404c71 (2.39-287) -Fix-Commit: 49125ffc8e1674dc2a100dfdc5b78796f22e16f2 (2.38-213) -Fix-Commit: ddcaed5dfb05b2c1a6ea842fd6b643501365450a (2.37-173) -Fix-Commit: a6bf47887f24b2b394acb301a3189fda04bd4d4d (2.36-245) -Fix-Commit: 66f0cb057c9b4fb1249a5fec6ef4a63511a37899 (2.35-400) -Fix-Commit: 96863dee262225cfb79f9fe45e06fd188319c7b8 (2.34-526) -Fix-Commit: d210011f1536c8322157cbb4fe4229b35c834c08 (2.33-276) -Fix-Commit: 1bc1832cfc74c2a601220969f36e789a5e9f0ebe (2.32-152) -Reported-by: Igor Morgenstern, Aisle Research diff --git a/advisories/GLIBC-SA-2026-0003 b/advisories/GLIBC-SA-2026-0003 deleted file mode 100644 index b7a6e83a10..0000000000 --- a/advisories/GLIBC-SA-2026-0003 +++ /dev/null @@ -1,36 +0,0 @@ -wordexp with WRDE_REUSE and WRDE_APPEND may return uninitialized memory - -Calling wordexp with WRDE_REUSE in conjunction with WRDE_APPEND in the -GNU C Library version 2.0 to version 2.42 may cause the interface to -return uninitialized memory in the we_wordv member, which on subsequent -calls to wordfree may abort the process. - -The implementation of WRDE_REUSE in conjunction with WRDE_APPEND fails -to clear the we_wordc member of the structure, and as such, when new -words are added internally, a leading we_wordc count number of entries -are skipped since they are assumed initialized. These skipped entries -are not initialized, but are the contents of a realloc-expanded array of -pointers. If the caller inspects the we_wordv array, it will -dereference invalid pointers and crash. If the caller calls wordfree, -the malloc implementation may detect the invalid pointers and abort the -process. Calls to wordexp using WRDE_REUSE and WRDE_APPEND have never -worked correctly and thus the existence of applications that make use of -this feature is unlikely. - -CVE-Id: CVE-2025-15281 -Public-Date: 2026-01-20 -Vulnerable-Commit: 8f2ece695d8822e9ecc63ecd157e90bf17a6fe65 (1.93-260) -Fix-Commit: 80cc58ea2de214f85b0a1d902a3b668ad2ecb302 (2.43) -Fix-Commit: cbf39c26b25801e9bc88499b4fd361ac172d4125 (2.42-51) -Fix-Commit: fb4db64a04ad6c96cd1fbb7e02eb59323b1f2ac2 (2.41-123) -Fix-Commit: 9fe8576664d43b87ca19401fb6a975e217e47623 (2.40-218) -Fix-Commit: ce65d944e38a20cb70af2a48a4b8aa5d8fabe1cc (2.39-288) -Fix-Commit: d5409a1be010699794264162c551ba60f05ee6c3 (2.38-214) -Fix-Commit: ff2b172803f6bbd897755d2ce83ec4323a1a15b3 (2.37-174) -Fix-Commit: e97cfe2293ed097eb3d0b4c18274d22855e65130 (2.36-246) -Fix-Commit: bb59339d02faebac534a87eea50c83c948f35b77 (2.35-401) -Fix-Commit: 2b656ff94d72f93c84d8da2e7c76456c1994f02e (2.34-527) -Fix-Commit: 1d8ed2067a8a5d162a07670d0d063429679f17a0 (2.33-277) -Fix-Commit: 3a56c4ee4ea49b8f2391a2d8d6220013c4160a79 (2.32-153) -Fix-Commit: 28eb5caf895ced5d895cb02757e109004a2d33e5 (2.31-167) -Reported-by: Vitaly Simonovich diff --git a/advisories/README b/advisories/README deleted file mode 100644 index b8f8a829ca..0000000000 --- a/advisories/README +++ /dev/null @@ -1,77 +0,0 @@ -GNU C Library Security Advisory Format -====================================== - -Security advisories in this directory follow a simple git commit log -format, with a heading and free-format description augmented with tags -to allow parsing key information. References to code changes are -specific to the glibc repository and follow a specific format: - - Tag-name: (release-version) - -The indicates a specific commit in the repository. The -release-version indicates the publicly consumable release in which this -commit is known to exist. The release-version is derived from the -git-describe format, (i.e. stripped out from glibc-2.34.NNN-gxxxx) and -is of the form 2.34-NNN. If the -NNN suffix is absent, it means that -the change is in that release tarball, otherwise the change is on the -release/2.YY/master branch and not in any released tarball. - -The following tags are currently being used: - -CVE-Id: -This is the CVE-Id assigned under the CVE Program -(https://www.cve.org/). - -Public-Date: -The date this issue became publicly known. - -Vulnerable-Commit: -The commit that introduced this vulnerability. There could be multiple -entries, one for each release branch in the glibc repository; the -release-version portion of this tag should tell you which branch this is -on. - -Fix-Commit: -The commit that fixed this vulnerability. There could be multiple -entries for each release branch in the glibc repository, indicating that -all of those commits contributed to fixing that issue in each of those -branches. - -Reported-By: -The entity that reported this issue. There could be multiple entries, one for -each reporter. - -Adding an Advisory ------------------- - -An advisory for a CVE needs to be added on the master branch in two steps: - -1. Add the text of the advisory without any Fix-Commit tags along with - the fix for the CVE. Add the Vulnerable-Commit tag, if applicable. - The advisories directory does not exist in release branches, so keep - the advisory text commit distinct from the code changes, to ease - backports. Ask for the GLIBC-SA advisory number from the security - team. - -2. Finish all backports on release branches and then back on the msater - branch, add all commit refs to the advisory using the Fix-Commit - tags. Don't bother adding the release-version subscript since the - next step will overwrite it. - -3. Run the process-advisories.sh script in the scripts directory on the - advisory: - - scripts/process-advisories.sh update GLIBC-SA-YYYY-NNNN - - (replace YYYY-NNNN with the actual advisory number). - -4. Verify the updated advisory and push the result. - -Getting a NEWS snippet from advisories --------------------------------------- - -Run: - - scripts/process-advisories.sh news - -and copy the content into the NEWS file. commit 45b58d6bd185b8c6d0c5b2b906243c1ecbaaecab Author: Andreas K. Hüttel Date: Sat Jan 24 02:32:06 2026 +0100 NEWS: add new section 2.43.1 Signed-off-by: Andreas K. Hüttel diff --git a/NEWS b/NEWS index e271fb2e4d..97ef63d561 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,11 @@ See the end for copying conditions. Please send GNU C library bug reports via using `glibc' in the "product" field. + +Version 2.43.1 + +The following bugs are resolved with this release: + Version 2.43 commit 022abaeacbc85d8409bad22375b16a8c07d3ae39 Author: Aurelien Jarno Date: Tue Jan 20 18:25:08 2026 +0100 Fix ldbl-128ibm ceill, floorl, roundl and truncl zero-sign handling When the result of ceill, floorl, roundl and truncl is zero, the sign of the result must match the sign of the input. For the IBM 128-bit long double format, the sign is determined by the high part. Ensure the correct sign when the high part is the result of computations, by copying the sign from the input high part to the output high part. On POWER, this conveniently maps to the fcpsgn instruction. In addition add test for the values provided in BZ #33623, and for the opposite value when the result is 0. Fixes: BZ #33623 Reviewed-by: Adhemerval Zanella (cherry picked from commit 6f4b28b20aa9161aeb42a7f34f4d3b96194e5666) diff --git a/NEWS b/NEWS index 97ef63d561..b9953e9888 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,8 @@ Version 2.43.1 The following bugs are resolved with this release: + [33623] [ldbl-128ibm] roundl, ceill, truncl, floorl bad sign of zero + results Version 2.43 diff --git a/math/libm-test-ceil.inc b/math/libm-test-ceil.inc index a471b43932..48be68cf91 100644 --- a/math/libm-test-ceil.inc +++ b/math/libm-test-ceil.inc @@ -79,6 +79,9 @@ static const struct test_f_f_data ceil_test_data[] = TEST_f_f (ceil, -max_value, -max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), #if MANT_DIG >= 64 + /* The input value can only be represented in long double. */ + TEST_f_f (ceil, -0x0.ffffffffffffffffp0L, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + /* The result can only be represented in long double. */ TEST_f_f (ceil, 4503599627370495.5L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (ceil, 4503599627370496.25L, 4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), diff --git a/math/libm-test-floor.inc b/math/libm-test-floor.inc index dee4afff7a..bc945a6c22 100644 --- a/math/libm-test-floor.inc +++ b/math/libm-test-floor.inc @@ -79,6 +79,9 @@ static const struct test_f_f_data floor_test_data[] = TEST_f_f (floor, -max_value, -max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), #if MANT_DIG >= 64 + /* The input value can only be represented in long double. */ + TEST_f_f (floor, 0x0.ffffffffffffffffp0L, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + /* The result can only be represented in long double. */ TEST_f_f (floor, 4503599627370495.5L, 4503599627370495.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (floor, 4503599627370496.25L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), diff --git a/math/libm-test-round.inc b/math/libm-test-round.inc index 898ff3791b..1395c51d5d 100644 --- a/math/libm-test-round.inc +++ b/math/libm-test-round.inc @@ -99,6 +99,10 @@ static const struct test_f_f_data round_test_data[] = #endif #if MANT_DIG >= 64 + /* The input value can only be represented in long double. */ + TEST_f_f (round, 0x0.ffffffffffffffffp-1L, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_f_f (round, -0x0.ffffffffffffffffp-1L, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + /* The result can only be represented in long double. */ TEST_f_f (round, 4503599627370495.5L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (round, 4503599627370496.25L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), diff --git a/math/libm-test-trunc.inc b/math/libm-test-trunc.inc index 7df741f3ba..5d69cd4b5b 100644 --- a/math/libm-test-trunc.inc +++ b/math/libm-test-trunc.inc @@ -91,6 +91,10 @@ static const struct test_f_f_data trunc_test_data[] = TEST_f_f (trunc, -4294967296.625L, -4294967296.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), #if MANT_DIG >= 64 + /* The input value can only be represented in long double. */ + TEST_f_f (trunc, 0x0.ffffffffffffffffp0L, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_f_f (trunc, -0x0.ffffffffffffffffp0L, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + /* The result can only be represented in long double. */ TEST_f_f (trunc, 4503599627370495.5L, 4503599627370495.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (trunc, 4503599627370496.25L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), diff --git a/sysdeps/ieee754/ldbl-128ibm/s_ceill.c b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c index 8038cf9fda..88bc364db5 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_ceill.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c @@ -54,6 +54,9 @@ __ceill (long double x) xh = hi; xl = lo; ldbl_canonicalize_int (&xh, &xl); + + /* Ensure we return -0 rather than +0 when appropriate. */ + xh = copysign (xh, hi); } } else diff --git a/sysdeps/ieee754/ldbl-128ibm/s_floorl.c b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c index 23f45b773f..4a8294cc78 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_floorl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c @@ -54,6 +54,9 @@ __floorl (long double x) xh = hi; xl = lo; ldbl_canonicalize_int (&xh, &xl); + + /* Ensure we return -0 rather than +0 when appropriate. */ + xh = copysign (xh, hi); } } else diff --git a/sysdeps/ieee754/ldbl-128ibm/s_roundl.c b/sysdeps/ieee754/ldbl-128ibm/s_roundl.c index e8948a0c05..340a63c76a 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_roundl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_roundl.c @@ -80,6 +80,9 @@ __roundl (long double x) xh = hi; ldbl_canonicalize_int (&xh, &xl); } + + /* Ensure we return -0 rather than +0 when appropriate. */ + xh = copysign(xh, hi); } else /* Quiet signaling NaN arguments. */ diff --git a/sysdeps/ieee754/ldbl-128ibm/s_truncl.c b/sysdeps/ieee754/ldbl-128ibm/s_truncl.c index 7f0b77cd3f..21ecbd0c85 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_truncl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_truncl.c @@ -56,6 +56,9 @@ __truncl (long double x) xh = hi; xl = lo; ldbl_canonicalize_int (&xh, &xl); + + /* Ensure we return -0 rather than +0 when appropriate. */ + xh = copysign (xh, hi); } } else commit 144ba302089cff5a2f2e1c9e1280faea9da9f8cc Author: Andreas K. Hüttel Date: Mon Jan 26 01:29:30 2026 +0100 po: Incorporate translatins (nl updated, ar new) Signed-off-by: Andreas K. Hüttel (cherry picked from commit bad2da7f779dbabb0e2e2c73037489e9f161183e) diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000000..ba596d51b9 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,7168 @@ +# Arabic translation for GNU libc. +# Copyright (C) 2026 Free Software Foundation, Inc. +# This file is distributed under the same license as the glibc package. +# Zayed Al-Saidi , 2026. +msgid "" +msgstr "" +"Project-Id-Version: libc 2.42.9000\n" +"POT-Creation-Date: 2026-01-19 16:22+0100\n" +"PO-Revision-Date: 2026-01-24 13:53+0400\n" +"Last-Translator: Zayed Al-Saidi \n" +"Language-Team: Arabic <(nothing)>\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100 >= 3 && n%100<=10 ? 3 : n%100 >= 11 && n%100<=99 ? 4 : 5;\n" +"X-Generator: Lokalize 23.08.5\n" + +#: argp/argp-help.c:229 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: معامل ARGP_HELP_FMT يتطلب قيمة" + +#: argp/argp-help.c:239 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: معامل ARGP_HELP_FMT غير معروف" + +#: argp/argp-help.c:252 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "بيانات تالفة في ARGP_HELP_FMT: %s" + +#: argp/argp-help.c:1350 +msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options." +msgstr "الوسائط الإلزامية أو الاختيارية للخيارات الطويلة هي أيضاً إلزامية أو اختيارية لأي خيارات قصيرة مقابلة لها." + +#: argp/argp-help.c:1713 +msgid "Usage:" +msgstr "الاستخدام:" + +#: argp/argp-help.c:1717 +msgid " or: " +msgstr " أو: " + +#: argp/argp-help.c:1729 +msgid " [OPTION...]" +msgstr " [خيار...]" + +#: argp/argp-help.c:1756 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "جرب `%s --help' أو `%s --usage' لمزيد من المعلومات.\n" + +#: argp/argp-help.c:1784 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "أبلغ عن العلل إلى %s.\n" + +#: argp/argp-parse.c:86 +msgid "Give this help list" +msgstr "أعطِ قائمة المساعدة هذه" + +#: argp/argp-parse.c:87 +msgid "Give a short usage message" +msgstr "أعطِ رسالة استخدام قصيرة" + +#: argp/argp-parse.c:88 catgets/gencat.c:111 catgets/gencat.c:115 +#: iconv/iconv_prog.c:61 iconv/iconv_prog.c:62 nscd/nscd.c:106 nscd/nscd.c:110 +#: nss/makedb.c:122 +msgid "NAME" +msgstr "الاسم" + +#: argp/argp-parse.c:89 +msgid "Set the program name" +msgstr "اضبط اسم البرنامج" + +#: argp/argp-parse.c:90 +msgid "SECS" +msgstr "ثواني" + +#: argp/argp-parse.c:91 +msgid "Hang for SECS seconds (default 3600)" +msgstr "تعليق لثوانٍ قدرها (مبدئي 3600)" + +#: argp/argp-parse.c:152 +msgid "Print program version" +msgstr "اطبع إصدار البرنامج" + +#: argp/argp-parse.c:168 +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(خطأ في البرنامج) لا يوجد إصدار معروف!؟" + +#: argp/argp-parse.c:608 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: وسائط كثيرة جداً\n" + +#: argp/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(خطأ في البرنامج) كان ينبغي التعرف على الخيار!؟" + +#: assert/assert-perr.c:45 +#, c-format +msgid "%s%s%s:%s: %s%sUnexpected error: %s.\n" +msgstr "%s%s%s:%s: %s%sخطأ غير متوقع: %s.\n" + +#: assert/assert.c:37 +#, c-format +msgid "%s%s%s:%s: %s%sAssertion `%s' failed.\n" +msgstr "%s%s%s:%s: %s%sفشل التوكيد `%s'.\n" + +#: catgets/gencat.c:112 +msgid "Create C header file NAME containing symbol definitions" +msgstr "أنشئ ملف ترويسة C بالاسم NAME يحتوي على تعريفات الرموز" + +#: catgets/gencat.c:114 +msgid "Do not use existing catalog, force new output file" +msgstr "لا تستخدم الفهرس الحالي، وافرض ملف إخراج جديد" + +#: catgets/gencat.c:115 nss/makedb.c:122 +msgid "Write output to file NAME" +msgstr "اكتب المخرجات إلى ملف بالاسم NAME" + +#: catgets/gencat.c:120 +msgid "" +"Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE\n" +"is -, output is written to standard output.\n" +msgstr "" +"توليد فهرس الرسائل.\vإذا كان INPUT-FILE هو -، تقرأ المدخلات من الدخل القياسي. إذا كان OUTPUT-FILE\n" +"هو -، تكتب المخرجات إلى الخرج القياسي.\n" + +#: catgets/gencat.c:125 +msgid "" +"-o OUTPUT-FILE [INPUT-FILE]...\n" +"[OUTPUT-FILE [INPUT-FILE]...]" +msgstr "" +"-o OUTPUT-FILE [INPUT-FILE]...\n" +"[OUTPUT-FILE [INPUT-FILE]...]" + +#: catgets/gencat.c:231 debug/pcprofiledump.c:219 elf/ldconfig.c:216 +#: elf/pldd.c:246 elf/sln.c:77 elf/sprof.c:372 iconv/iconv_prog.c:374 +#: iconv/iconvconfig.c:380 locale/programs/locale.c:275 +#: locale/programs/localedef.c:437 login/programs/pt_chown.c:88 +#: malloc/memusagestat.c:564 nss/getent.c:961 nss/makedb.c:371 +#: posix/getconf.c:551 +#, c-format +msgid "" +"For bug reporting instructions, please see:\n" +"%s.\n" +msgstr "" +"لإرشادات الإبلاغ عن العلل، يرجى مراجعة:\n" +"%s.\n" + +#: catgets/gencat.c:247 debug/pcprofiledump.c:235 debug/xtrace.sh:63 +#: elf/ldconfig.c:232 elf/ldd.bash.in:39 elf/pldd.c:262 elf/sotruss.sh:75 +#: elf/sprof.c:389 iconv/iconv_prog.c:391 iconv/iconvconfig.c:397 +#: locale/programs/locale.c:292 locale/programs/localedef.c:459 +#: login/programs/pt_chown.c:62 malloc/memusage.sh:70 malloc/memusagestat.c:582 +#: nscd/nscd.c:521 nss/getent.c:92 nss/makedb.c:387 posix/getconf.c:533 +#, c-format +msgid "" +"Copyright (C) %s Free Software Foundation, Inc.\n" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"حقوق النشر (ج) %s مؤسسة البرمجيات الحرة، المحدودة.\n" +"هذا برنامج حر؛ انظر المصدر لشروط النسخ. لا يوجد أي\n" +"ضمان؛ ولا حتى لغرض التسويق أو الملاءمة لغرض معين.\n" + +#: catgets/gencat.c:252 debug/pcprofiledump.c:240 debug/xtrace.sh:67 +#: elf/ldconfig.c:237 elf/pldd.c:267 elf/sprof.c:395 iconv/iconv_prog.c:396 +#: iconv/iconvconfig.c:402 locale/programs/locale.c:297 +#: locale/programs/localedef.c:464 malloc/memusage.sh:74 +#: malloc/memusagestat.c:587 nscd/nscd.c:526 nss/getent.c:97 nss/makedb.c:392 +#: posix/getconf.c:538 +#, c-format +msgid "Written by %s.\n" +msgstr "كتبه %s.\n" + +#: catgets/gencat.c:283 +msgid "*standard input*" +msgstr "*الدخل القياسي*" + +#: catgets/gencat.c:289 iconv/iconv_charmap.c:172 iconv/iconv_prog.c:279 +#: iconv/iconv_prog.c:432 nss/makedb.c:248 +#, c-format +msgid "cannot open input file `%s'" +msgstr "يتعذر فتح ملف المدخلات `%s'" + +#: catgets/gencat.c:418 catgets/gencat.c:493 +msgid "illegal set number" +msgstr "رقم مجموعة غير قانوني" + +#: catgets/gencat.c:445 +msgid "duplicate set definition" +msgstr "تعريف مجموعة مكرر" + +#: catgets/gencat.c:447 catgets/gencat.c:619 catgets/gencat.c:671 +msgid "this is the first definition" +msgstr "هذا هو التعريف الأول" + +#: catgets/gencat.c:518 +#, c-format +msgid "unknown set `%s'" +msgstr "مجموعة غير معروفة `%s'" + +#: catgets/gencat.c:559 +msgid "invalid quote character" +msgstr "محرف اقتباس غير صالح" + +#: catgets/gencat.c:572 +#, c-format +msgid "unknown directive `%s': line ignored" +msgstr "توجيه غير معروف `%s': تم تجاهل السطر" + +#: catgets/gencat.c:617 +msgid "duplicated message number" +msgstr "رقم رسالة مكرر" + +#: catgets/gencat.c:668 +msgid "duplicated message identifier" +msgstr "معرّف رسالة مكرر" + +#: catgets/gencat.c:725 +msgid "invalid character: message ignored" +msgstr "محرف غير صالح: تم تجاهل الرسالة" + +#: catgets/gencat.c:768 +msgid "invalid line" +msgstr "سطر غير صالح" + +#: catgets/gencat.c:822 +msgid "malformed line ignored" +msgstr "تجاهل سطر مشوه" + +#: catgets/gencat.c:940 catgets/gencat.c:948 +#, c-format +msgid "cannot allocate memory" +msgstr "يتعذر تخصيص الذاكرة" + +#: catgets/gencat.c:1001 catgets/gencat.c:1046 +#, c-format +msgid "cannot open output file `%s'" +msgstr "يتعذر فتح ملف المخرجات `%s'" + +#: catgets/gencat.c:1211 locale/programs/linereader.c:588 +msgid "invalid escape sequence" +msgstr "تسلسل هروب غير صالح" + +#: catgets/gencat.c:1235 +msgid "unterminated message" +msgstr "رسالة غير منتهية" + +#: catgets/gencat.c:1259 +#, c-format +msgid "while opening old catalog file" +msgstr "أثناء فتح ملف فهرس قديم" + +#: catgets/gencat.c:1350 +#, c-format +msgid "conversion modules not available" +msgstr "وحدات التحويل غير متوفرة" + +#: catgets/gencat.c:1376 +#, c-format +msgid "cannot determine escape character" +msgstr "يتعذر تحديد محرف الهروب" + +#: debug/pcprofiledump.c:52 +msgid "Don't buffer output" +msgstr "لا تخزن المخرجات مؤقتاً" + +#: debug/pcprofiledump.c:57 +msgid "Dump information generated by PC profiling." +msgstr "تفريغ المعلومات المولدة بواسطة تشكيلة الحاسوب الشخصي." + +#: debug/pcprofiledump.c:60 +msgid "[FILE]" +msgstr "[ملف]" + +#: debug/pcprofiledump.c:97 +#, c-format +msgid "cannot read header" +msgstr "يتعذر قراءة الترويسة" + +#: debug/pcprofiledump.c:99 +#, c-format +msgid "cannot read pointer pair" +msgstr "يتعذر قراءة زوج المؤشر" + +#: debug/pcprofiledump.c:107 +#, c-format +msgid "unexpected end of file in header" +msgstr "نهاية ملف غير متوقعة في الترويسة" + +#: debug/pcprofiledump.c:110 +#, c-format +msgid "unexpected end of file in pointer pair" +msgstr "نهاية ملف غير متوقعة في زوج المؤشر" + +#: debug/pcprofiledump.c:145 +#, c-format +msgid "cannot open input file" +msgstr "يتعذر فتح ملف المدخلات" + +#: debug/pcprofiledump.c:189 +#, c-format +msgid "invalid pointer size" +msgstr "حجم مؤشر غير صالح" + +#: debug/xtrace.sh:25 debug/xtrace.sh:43 +msgid "Usage: xtrace [OPTION]... PROGRAM [PROGRAMOPTION]...\\n" +msgstr "الاستخدام: xtrace [خيار]... البرنامج [خيارات-البرنامج]...\\n" + +#: debug/xtrace.sh:31 elf/sotruss.sh:56 elf/sotruss.sh:67 elf/sotruss.sh:135 +#: malloc/memusage.sh:25 +msgid "Try \\`%s --help' or \\`%s --usage' for more information.\\n" +msgstr "جرب \\`%s --help' أو \\`%s --usage' لمزيد من المعلومات.\\n" + +#: debug/xtrace.sh:37 +msgid "%s: option '%s' requires an argument.\\n" +msgstr "%s: الخيار '%s' يتطلب وسيطاً.\\n" + +#: debug/xtrace.sh:44 +msgid "" +"Trace execution of program by printing currently executed function.\n" +"\n" +" --data=FILE Don't run the program, just print the data from FILE.\n" +"\n" +" -?,--help Print this help and exit\n" +" --usage Give a short usage message\n" +" -V,--version Print version information and exit\n" +"\n" +"Mandatory arguments to long options are also mandatory for any corresponding\n" +"short options.\n" +"\n" +msgstr "" +"تتبع تنفيذ البرنامج عن طريق طباعة الوظيفة المنفذة حالياً.\n" +"\n" +" --data=FILE لا تشغل البرنامج، فقط اطبع البيانات من FILE.\n" +"\n" +" -?,--help اطبع هذه المساعدة واخرج\n" +" --usage أعطِ رسالة استخدام قصيرة\n" +" -V,--version اطبع معلومات الإصدار واخرج\n" +"\n" +"الوسائط الإلزامية للخيارات الطويلة هي أيضاً إلزامية لأي خيارات\n" +"قصيرة مقابلة.\n" +"\n" + +#: debug/xtrace.sh:56 elf/ldd.bash.in:56 elf/sotruss.sh:49 +#: malloc/memusage.sh:63 +msgid "For bug reporting instructions, please see:\\\\n%s.\\\\n" +msgstr "لإرشادات الإبلاغ عن العلل، يرجى مراجعة:\\\\n%s.\\\\n" + +#: debug/xtrace.sh:124 +msgid "xtrace: unrecognized option \\`$1'\\n" +msgstr "xtrace: خيار غير معروف \\`$1'\\n" + +#: debug/xtrace.sh:137 +msgid "No program name given\\n" +msgstr "لم يتم إعطاء اسم برنامج\\n" + +#: debug/xtrace.sh:145 +#, sh-format +msgid "executable \\`$program' not found\\n" +msgstr "الملف التنفيذي \\`$program' غير موجود\\n" + +#: debug/xtrace.sh:149 +#, sh-format +msgid "\\`$program' is no executable\\n" +msgstr "\\`$program' ليس ملفاً تنفيذياً\\n" + +#: dlfcn/dlinfo.c:48 +msgid "unsupported dlinfo request" +msgstr "طلب dlinfo غير مدعوم" + +#: dlfcn/dlmopen.c:53 +msgid "invalid namespace" +msgstr "نطاق تسمية غير صالح" + +#: dlfcn/dlmopen.c:58 +msgid "invalid mode" +msgstr "نمط غير صالح" + +#: dlfcn/dlopen.c:54 +msgid "invalid mode parameter" +msgstr "معامل نمط غير صالح" + +#: elf/cache.c:174 +msgid "unknown or unsupported flag" +msgstr "علم غير معروف أو غير مدعوم" + +#: elf/cache.c:273 +#, c-format +msgid "Cache file has wrong endianness.\n" +msgstr "ملف الخبيئة يحتوي على ترتيب بايتات (endianness) خاطئ.\n" + +#: elf/cache.c:282 +msgid "Cache generated by: " +msgstr "خبيئة ولدت بواسطة: " + +#: elf/cache.c:296 elf/ldconfig.c:1238 +#, c-format +msgid "Can't open cache file %s\n" +msgstr "يتعذر فتح ملف الخبيئة %s\n" + +#: elf/cache.c:310 +#, c-format +msgid "mmap of cache file failed.\n" +msgstr "فشل mmap لملف الخبيئة.\n" + +#: elf/cache.c:314 elf/cache.c:328 elf/cache.c:339 +#, c-format +msgid "File is not a cache file.\n" +msgstr "الملف ليس ملف خبيئة.\n" + +#: elf/cache.c:368 elf/cache.c:383 +#, c-format +msgid "%d libs found in cache `%s'\n" +msgstr "عثر على %d من المكتبات في الخبيئة `%s'\n" + +#: elf/cache.c:381 +#, c-format +msgid "Malformed extension data in cache file %s\n" +msgstr "بيانات ملحق مشوهة في ملف الخبيئة %s\n" + +#: elf/cache.c:510 +#, c-format +msgid "Writing of cache extension data failed" +msgstr "فشلت كتابة بيانات ملحق الخبيئة" + +#: elf/cache.c:521 +#, c-format +msgid "%s: ISA level is too high (%d > %d)" +msgstr "%s: مستوى ISA مرتفع جداً (%d > %d)" + +#: elf/cache.c:685 +#, c-format +msgid "Can't create temporary cache file %s" +msgstr "يتعذر إنشاء ملف خبيئة مؤقت %s" + +#: elf/cache.c:693 elf/cache.c:703 elf/cache.c:707 elf/cache.c:712 +#: elf/cache.c:731 +#, c-format +msgid "Writing of cache data failed" +msgstr "فشلت كتابة بيانات الخبيئة" + +#: elf/cache.c:726 +#, c-format +msgid "Changing access rights of %s to %#o failed" +msgstr "فشل تغيير حقوق الوصول لـ %s إلى %#o" + +#: elf/cache.c:735 +#, c-format +msgid "Renaming of %s to %s failed" +msgstr "فشل تغيير اسم %s إلى %s" + +#: elf/cache.c:765 +#, c-format +msgid "Could not create library path" +msgstr "يتعذر إنشاء مسار المكتبة" + +#: elf/dl-catch.c:85 +msgid "error while loading shared libraries" +msgstr "خطأ أثناء تحميل المكتبات المشتركة" + +#: elf/dl-catch.c:118 +msgid "DYNAMIC LINKER BUG!!!" +msgstr "علة في الرابط الديناميكي!!!" + +#: elf/dl-close.c:363 elf/dl-open.c:297 +msgid "cannot create scope list" +msgstr "يتعذر إنشاء قائمة النطاق" + +#: elf/dl-close.c:790 +msgid "shared object not open" +msgstr "الكائن المشترك غير مفتوح" + +#: elf/dl-deps.c:96 +msgid "DST not allowed in SUID/SGID programs" +msgstr "DST غير مسموح به في برامج SUID/SGID" + +#: elf/dl-deps.c:109 +msgid "empty dynamic string token substitution" +msgstr "استبدال فارغ لرمز السلسلة الديناميكية" + +#: elf/dl-deps.c:115 +#, c-format +msgid "cannot load auxiliary `%s' because of empty dynamic string token substitution\n" +msgstr "يتعذر تحميل المساعد `%s' بسبب استبدال فارغ لرمز السلسلة الديناميكية\n" + +#: elf/dl-deps.c:204 +msgid "cannot allocate dependency buffer" +msgstr "يتعذر تخصيص مخزن التبعية المؤقت" + +#: elf/dl-deps.c:427 +msgid "cannot allocate dependency list" +msgstr "يتعذر تخصيص قائمة التبعيات" + +#: elf/dl-deps.c:467 +msgid "cannot allocate symbol search list" +msgstr "يتعذر تخصيص قائمة البحث عن الرموز" + +#: elf/dl-hwcaps.c:103 +msgid "cannot create HWCAP priorities" +msgstr "يتعذر إنشاء أولويات HWCAP" + +#: elf/dl-hwcaps.c:195 +msgid "cannot create capability list" +msgstr "يتعذر إنشاء قائمة القدرات" + +#: elf/dl-load.c:424 +msgid "cannot allocate name record" +msgstr "يتعذر تخصيص سجل الاسم" + +#: elf/dl-load.c:510 elf/dl-load.c:623 elf/dl-load.c:717 elf/dl-load.c:814 +msgid "cannot create cache for search path" +msgstr "يتعذر إنشاء خبيئة لمسار البحث" + +#: elf/dl-load.c:606 +msgid "cannot create RUNPATH/RPATH copy" +msgstr "يتعذر إنشاء نسخة RUNPATH/RPATH" + +#: elf/dl-load.c:703 +msgid "cannot create search path array" +msgstr "يتعذر إنشاء مصفوفة مسار البحث" + +#: elf/dl-load.c:978 +msgid "cannot stat shared object" +msgstr "يتعذر جلب معلومات (stat) الكائن المشترك" + +#: elf/dl-load.c:1071 elf/dl-load.c:2160 +msgid "cannot create shared object descriptor" +msgstr "يتعذر إنشاء واصف الكائن المشترك" + +#: elf/dl-load.c:1090 elf/dl-load.c:1594 elf/dl-load.c:1704 +msgid "cannot read file data" +msgstr "يتعذر قراءة بيانات الملف" + +#: elf/dl-load.c:1143 elf/dl-map-segments.h:118 +msgid "ELF load command address/offset not page-aligned" +msgstr "عنوان/إزاحة أمر تحميل ELF غير متحاذٍ مع الصفحة" + +#: elf/dl-load.c:1224 +msgid "object file has no loadable segments" +msgstr "ملف الكائن لا يحتوي على مقاطع قابلة للتحميل" + +#: elf/dl-load.c:1241 +msgid "cannot dynamically load executable" +msgstr "يتعذر تحميل الملف التنفيذي ديناميكياً" + +#: elf/dl-load.c:1248 +msgid "object file has no dynamic section" +msgstr "ملف الكائن لا يحتوي على قسم ديناميكي" + +#: elf/dl-load.c:1283 +msgid "cannot dynamically load position-independent executable" +msgstr "يتعذر تحميل ملف تنفيذي مستقل عن الموقع ديناميكياً" + +#: elf/dl-load.c:1285 +msgid "shared object cannot be dlopen()ed" +msgstr "لا يمكن عمل dlopen() للكائن المشترك" + +#: elf/dl-load.c:1298 +msgid "cannot allocate memory for program header" +msgstr "يتعذر تخصيص ذاكرة لترویسة البرنامج" + +#: elf/dl-load.c:1323 +msgid "cannot enable executable stack as shared object requires" +msgstr "يتعذر تمكين مكدس قابل للتنفيذ كما يتطلب الكائن المشترك" + +#: elf/dl-load.c:1351 +msgid "cannot close file descriptor" +msgstr "يتعذر إغلاق واصف الملف" + +#: elf/dl-load.c:1594 +msgid "file too short" +msgstr "الملف قصير جداً" + +#: elf/dl-load.c:1628 +msgid "invalid ELF header" +msgstr "ترويسة ELF غير صالحة" + +#: elf/dl-load.c:1645 +msgid "ELF file data encoding not big-endian" +msgstr "ترميز بيانات ملف ELF ليس big-endian" + +#: elf/dl-load.c:1647 +msgid "ELF file data encoding not little-endian" +msgstr "ترميز بيانات ملف ELF ليس little-endian" + +#: elf/dl-load.c:1651 +msgid "ELF file version ident does not match current one" +msgstr "معرف إصدار ملف ELF لا يطابق الحالي" + +#: elf/dl-load.c:1655 +msgid "ELF file OS ABI invalid" +msgstr "واجهة OS ABI لملف ELF غير صالحة" + +#: elf/dl-load.c:1658 +msgid "ELF file ABI version invalid" +msgstr "إصدار ABI لملف ELF غير صالح" + +#: elf/dl-load.c:1661 +msgid "nonzero padding in e_ident" +msgstr "حشو غير صفري في e_ident" + +#: elf/dl-load.c:1664 +msgid "internal error" +msgstr "خطأ داخلي" + +#: elf/dl-load.c:1671 +msgid "ELF file version does not match current one" +msgstr "إصدار ملف ELF لا يطابق الحالي" + +#: elf/dl-load.c:1685 +msgid "only ET_DYN and ET_EXEC can be loaded" +msgstr "يمكن تحميل ET_DYN و ET_EXEC فقط" + +#: elf/dl-load.c:1690 +msgid "ELF file's phentsize not the expected size" +msgstr "phentsize الخاص بملف ELF ليس بالحجم المتوقع" + +#: elf/dl-load.c:2179 +msgid "wrong ELF class: ELFCLASS64" +msgstr "فئة ELF خاطئة: ELFCLASS64" + +#: elf/dl-load.c:2180 +msgid "wrong ELF class: ELFCLASS32" +msgstr "فئة ELF خاطئة: ELFCLASS32" + +#: elf/dl-load.c:2183 +msgid "cannot open shared object file" +msgstr "يتعذر فتح ملف الكائن المشترك" + +#: elf/dl-load.h:126 +msgid "failed to map segment from shared object" +msgstr "فشل في تخطيط (map) مقطع من الكائن المشترك" + +#: elf/dl-load.h:128 +msgid "cannot change memory protections" +msgstr "يتعذر تغيير حماية الذاكرة" + +#: elf/dl-load.h:130 +msgid "cannot map zero-fill pages" +msgstr "يتعذر تخطيط صفحات مملوءة بالأصفار" + +#: elf/dl-lookup.c:808 +msgid "symbol lookup error" +msgstr "خطأ في البحث عن الرمز" + +#: elf/dl-open.c:83 +msgid "cannot extend global scope" +msgstr "يتعذر تمديد النطاق العام" + +#: elf/dl-open.c:381 +msgid "TLS generation counter wrapped! Please report this." +msgstr "عداد توليد TLS التف! يرجى الإبلاغ عن هذا." + +#: elf/dl-open.c:717 +msgid "cannot allocate address lookup data" +msgstr "يتعذر تخصيص بيانات البحث عن العنوان" + +#: elf/dl-open.c:817 +msgid "invalid mode for dlopen()" +msgstr "نمط غير صالح لـ dlopen()" + +#: elf/dl-open.c:834 +msgid "no more namespaces available for dlmopen()" +msgstr "لا تتوفر نطاقات تسمية إضافية لـ dlmopen()" + +#: elf/dl-open.c:859 +msgid "invalid target namespace in dlmopen()" +msgstr "نطاق تسمية مستهدف غير صالح في dlmopen()" + +#: elf/dl-reloc.c:140 +msgid "cannot allocate memory in static TLS block" +msgstr "يتعذر تخصيص ذاكرة في كتلة TLS الساكنة" + +#: elf/dl-reloc.c:283 +msgid "cannot make segment writable for relocation" +msgstr "يتعذر جعل المقطع قابلاً للكتابة لإعادة التوطين" + +#: elf/dl-reloc.c:313 +#, c-format +msgid "%s: out of memory to store relocation results for %s\n" +msgstr "%s: نفدت الذاكرة لتخزين نتائج إعادة التوطين لـ %s\n" + +#: elf/dl-reloc.c:328 +msgid "cannot restore segment prot after reloc" +msgstr "يتعذر استعادة حماية المقطع بعد إعادة التوطين" + +#: elf/dl-reloc.c:366 +msgid "cannot apply additional memory protection after relocation" +msgstr "يتعذر تطبيق حماية إضافية للذاكرة بعد إعادة التوطين" + +#: elf/dl-sym.c:138 +msgid "RTLD_NEXT used in code not dynamically loaded" +msgstr "استخدم RTLD_NEXT في كود لم يتم تحميله ديناميكياً" + +#: elf/dl-tls.c:1217 +msgid "cannot create TLS data structures" +msgstr "يتعذر إنشاء هياكل بيانات TLS" + +#: elf/dl-version.c:147 +msgid "version lookup error" +msgstr "خطأ في البحث عن الإصدار" + +#: elf/dl-version.c:285 +msgid "cannot allocate version reference table" +msgstr "يتعذر تخصيص جدول مرجعي للإصدار" + +#: elf/dl-version.c:387 +msgid "DT_RELR without GLIBC_ABI_DT_RELR dependency" +msgstr "DT_RELR بدون تبعية GLIBC_ABI_DT_RELR" + +#: elf/ldconfig.c:124 +msgid "Print cache" +msgstr "اطبع الخبيئة" + +#: elf/ldconfig.c:125 +msgid "Generate verbose messages" +msgstr "توليد رسائل مفصلة" + +#: elf/ldconfig.c:126 +msgid "Don't build cache" +msgstr "لا تبنِ الخبيئة" + +#: elf/ldconfig.c:127 +msgid "Don't update symbolic links" +msgstr "لا تحدث الروابط الرمزية" + +#: elf/ldconfig.c:128 +msgid "Change to and use ROOT as root directory" +msgstr "تغيير واستخدام ROOT كدليل جذري" + +#: elf/ldconfig.c:128 +msgid "ROOT" +msgstr "ROOT" + +#: elf/ldconfig.c:129 +msgid "CACHE" +msgstr "الخبيئة" + +#: elf/ldconfig.c:129 +msgid "Use CACHE as cache file" +msgstr "استخدم CACHE كملف خبيئة" + +#: elf/ldconfig.c:130 +msgid "CONF" +msgstr "CONF" + +#: elf/ldconfig.c:130 +msgid "Use CONF as configuration file" +msgstr "استخدم CONF كملف ضبط" + +#: elf/ldconfig.c:131 +msgid "Only process directories specified on the command line. Don't build cache." +msgstr "معالجة الأدلة المحددة فقط في سطر الأوامر. لا تبنِ الخبيئة." + +#: elf/ldconfig.c:132 +msgid "Manually link individual libraries." +msgstr "اربط المكتبات الفردية يدوياً." + +#: elf/ldconfig.c:133 +msgid "FORMAT" +msgstr "التنسيق" + +#: elf/ldconfig.c:133 +msgid "Format to use: new (default), old, or compat" +msgstr "التنسيق المستخدم: جديد (مبدئي)، قديم، أو متوافق" + +#: elf/ldconfig.c:134 +msgid "Ignore auxiliary cache file" +msgstr "تجاهل ملف الخبيئة المساعد" + +#: elf/ldconfig.c:142 +msgid "Configure Dynamic Linker Run Time Bindings." +msgstr "اضبط روابط وقت التشغيل للرابط الديناميكي." + +#: elf/ldconfig.c:276 +#, c-format +msgid "Path `%s' given more than once" +msgstr "تم إعطاء المسار `%s' أكثر من مرة" + +#: elf/ldconfig.c:277 +#, c-format +msgid "(from %s:%d and %s:%d)\n" +msgstr "(من %s:%d و %s:%d)\n" + +#: elf/ldconfig.c:309 elf/ldconfig.c:350 +#, c-format +msgid "Could not form glibc-hwcaps path" +msgstr "يتعذر تشكيل مسار glibc-hwcaps" + +#: elf/ldconfig.c:323 +#, c-format +msgid "Listing directory %s" +msgstr "إدراج محتويات الدليل %s" + +#: elf/ldconfig.c:405 +#, c-format +msgid "Can't stat %s" +msgstr "يتعذر جلب معلومات %s" + +#: elf/ldconfig.c:486 +#, c-format +msgid "Can't stat %s\n" +msgstr "يتعذر جلب معلومات %s\n" + +#: elf/ldconfig.c:496 +#, c-format +msgid "%s is not a symbolic link\n" +msgstr "%s ليس رابطاً رمزياً\n" + +#: elf/ldconfig.c:515 +#, c-format +msgid "Can't unlink %s" +msgstr "يتعذر فك ربط %s" + +#: elf/ldconfig.c:521 +#, c-format +msgid "Can't link %s to %s" +msgstr "يتعذر ربط %s بـ %s" + +#: elf/ldconfig.c:527 +msgid " (changed)\n" +msgstr " (تغير)\n" + +#: elf/ldconfig.c:529 +msgid " (SKIPPED)\n" +msgstr " (تخطى)\n" + +#: elf/ldconfig.c:584 +#, c-format +msgid "Can't find %s" +msgstr "يتعذر العثور على %s" + +#: elf/ldconfig.c:600 elf/ldconfig.c:759 elf/ldconfig.c:826 +#, c-format +msgid "Cannot lstat %s" +msgstr "يتعذر عمل lstat لـ %s" + +#: elf/ldconfig.c:606 +#, c-format +msgid "Ignored file %s since it is not a regular file." +msgstr "تجاهل ملف %s لأنه ليس ملفاً عادياً." + +#: elf/ldconfig.c:614 +#, c-format +msgid "No link created since soname could not be found for %s" +msgstr "لم ينشأ أي رابط لأنه تعذر العثور على soname لـ %s" + +#: elf/ldconfig.c:700 +#, c-format +msgid " (from %s:%d)\n" +msgstr " (من %s:%d)\n" + +#: elf/ldconfig.c:715 +#, c-format +msgid "Can't open directory %s" +msgstr "يتعذر فتح الدليل %s" + +#: elf/ldconfig.c:742 elf/ldconfig.c:747 +#, c-format +msgid "Could not form library path" +msgstr "يتعذر تشكيل مسار المكتبة" + +#: elf/ldconfig.c:776 elf/ldconfig.c:814 elf/readlib.c:81 +#, c-format +msgid "Input file %s not found.\n" +msgstr "ملف المدخلات %s غير موجود.\n" + +#: elf/ldconfig.c:783 +#, c-format +msgid "Cannot stat %s" +msgstr "يتعذر عمل stat لـ %s" + +#: elf/ldconfig.c:902 +#, c-format +msgid "libc6 library %s in wrong directory" +msgstr "مكتبة libc6 %s في دليل خاطئ" + +#: elf/ldconfig.c:921 +#, c-format +msgid "libraries %s and %s in directory %s have same soname but different type." +msgstr "المكتبتان %s و %s في الدليل %s لهما نفس soname ولكن بنوع مختلف." + +#: elf/ldconfig.c:1050 +#, c-format +msgid "Warning: ignoring configuration file that cannot be opened: %s" +msgstr "تحذير: تجاهل ملف الضبط الذي لا يمكن فتحه: %s" + +#: elf/ldconfig.c:1098 +#, c-format +msgid "%s:%u: hwcap directive ignored" +msgstr "%s:%u: تم تجاهل توجيه hwcap" + +#: elf/ldconfig.c:1117 +#, c-format +msgid "need absolute file name for configuration file when using -r" +msgstr "بحاجة لاسم ملف مطلق لملف الضبط عند استخدام -r" + +#: elf/ldconfig.c:1124 locale/programs/xasprintf.c:31 +#: locale/programs/xmalloc.c:63 malloc/obstack.c:416 malloc/obstack.c:418 +#: posix/getconf.c:503 posix/getconf.c:745 +#, c-format +msgid "memory exhausted" +msgstr "نفدت الذاكرة" + +#: elf/ldconfig.c:1157 +#, c-format +msgid "%s:%u: cannot read directory %s" +msgstr "%s:%u: يتعذر قراءة الدليل %s" + +#: elf/ldconfig.c:1195 +#, c-format +msgid "relative path `%s' used to build cache" +msgstr "استخدم المسار النسبي `%s' لبناء الخبيئة" + +#: elf/ldconfig.c:1217 +#, c-format +msgid "Can't chdir to /" +msgstr "يتعذر تغيير الدليل إلى /" + +#: elf/ldconfig.c:1258 +#, c-format +msgid "Can't open cache file directory %s\n" +msgstr "يتعذر فتح دليل ملف الخبيئة %s\n" + +#: elf/ldd.bash.in:43 +msgid "Written by %s and %s.\n" +msgstr "كتبه %s و %s.\n" + +#: elf/ldd.bash.in:48 +msgid "" +"Usage: ldd [OPTION]... FILE...\n" +" --help print this help and exit\n" +" --version print version information and exit\n" +" -d, --data-relocs process data relocations\n" +" -r, --function-relocs process data and function relocations\n" +" -u, --unused print unused direct dependencies\n" +" -v, --verbose print all information\n" +msgstr "" +"الاستخدام: ldd [خيار]... ملف...\n" +" --help اطبع هذه المساعدة واخرج\n" +" --version اطبع معلومات الإصدار واخرج\n" +" -d, --data-relocs معالجة إعادة توطين البيانات\n" +" -r, --function-relocs معالجة إعادة توطين البيانات والوظائف\n" +" -u, --unused اطبع التبعيات المباشرة غير المستخدمة\n" +" -v, --verbose اطبع كافة المعلومات\n" + +#: elf/ldd.bash.in:81 +msgid "ldd: option \\`$1' is ambiguous" +msgstr "ldd: الخيار \\`$1' غامض" + +#: elf/ldd.bash.in:88 +msgid "unrecognized option" +msgstr "خيار غير معروف" + +#: elf/ldd.bash.in:89 elf/ldd.bash.in:126 +msgid "Try \\`ldd --help' for more information." +msgstr "جرب \\`ldd --help' لمزيد من المعلومات." + +#: elf/ldd.bash.in:125 +msgid "missing file arguments" +msgstr "وسائط الملف مفقودة" + +#. TRANS This is a ``file doesn't exist'' error +#. TRANS for ordinary files that are referenced in contexts where they are +#. TRANS expected to already exist. +#: elf/ldd.bash.in:148 sysdeps/gnu/errlist.h:13 +msgid "No such file or directory" +msgstr "لا يوجد ملف أو دليل بهذا الاسم" + +#: elf/ldd.bash.in:151 inet/rcmd.c:483 +msgid "not regular file" +msgstr "ليس ملفاً عادياً" + +#: elf/ldd.bash.in:154 +msgid "warning: you do not have execution permission for" +msgstr "تحذير: ليس لديك إذن تنفيذ لـ" + +#: elf/ldd.bash.in:171 +msgid "\tnot a dynamic executable" +msgstr "\tليس ملفاً تنفيذياً ديناميكياً" + +#: elf/ldd.bash.in:179 +msgid "exited with unknown exit code" +msgstr "خرج بكود خروج غير معروف" + +#: elf/ldd.bash.in:184 +msgid "error: you do not have read permission for" +msgstr "خطأ: ليس لديك إذن قراءة لـ" + +#: elf/pldd-xx.c:103 +#, c-format +msgid "cannot find program header of process" +msgstr "يتعذر العثور على ترويسة البرنامج للعملية" + +#: elf/pldd-xx.c:107 +#, c-format +msgid "cannot read program header" +msgstr "يتعذر قراءة ترويسة البرنامج" + +#: elf/pldd-xx.c:129 +#, c-format +msgid "cannot read dynamic section" +msgstr "يتعذر قراءة القسم الديناميكي" + +#: elf/pldd-xx.c:141 +#, c-format +msgid "cannot read r_debug" +msgstr "يتعذر قراءة r_debug" + +#: elf/pldd-xx.c:159 +#, c-format +msgid "cannot read program interpreter" +msgstr "يتعذر قراءة مترجم البرنامج" + +#: elf/pldd-xx.c:188 +#, c-format +msgid "cannot read link map" +msgstr "يتعذر قراءة خريطة الربط" + +#: elf/pldd-xx.c:195 +#, c-format +msgid "cannot read object name" +msgstr "يتعذر قراءة اسم الكائن" + +#: elf/pldd-xx.c:202 +#, c-format +msgid "cannot allocate buffer for object name" +msgstr "يتعذر تخصيص مخزن مؤقت لاسم الكائن" + +#: elf/pldd.c:57 +msgid "List dynamic shared objects loaded into process." +msgstr "إدراج الكائنات المشتركة الديناميكية المحملة في العملية." + +#: elf/pldd.c:61 +msgid "PID" +msgstr "معرّف العملية" + +#: elf/pldd.c:88 +#, c-format +msgid "Exactly one parameter with process ID required.\n" +msgstr "مطلوب معامل واحد بالضبط مع معرف العملية.\n" + +#: elf/pldd.c:102 +#, c-format +msgid "invalid process ID '%s'" +msgstr "معرف عملية غير صالح '%s'" + +#: elf/pldd.c:110 +#, c-format +msgid "cannot open %s" +msgstr "يتعذر فتح %s" + +#: elf/pldd.c:141 +#, c-format +msgid "cannot open %s/task" +msgstr "يتعذر فتح %s/task" + +#: elf/pldd.c:144 +#, c-format +msgid "cannot prepare reading %s/task" +msgstr "يتعذر التحضير لقراءة %s/task" + +#: elf/pldd.c:157 +#, c-format +msgid "invalid thread ID '%s'" +msgstr "معرف خيط غير صالح '%s'" + +#: elf/pldd.c:168 +#, c-format +msgid "cannot attach to process %lu" +msgstr "يتعذر الاتصال بالعملية %lu" + +#: elf/pldd.c:183 +#, c-format +msgid "no valid %s/task entries" +msgstr "لا توجد مدخلات %s/task صالحة" + +#: elf/pldd.c:289 +#, c-format +msgid "cannot get information about process %lu" +msgstr "يتعذر جلب معلومات عن العملية %lu" + +#: elf/pldd.c:302 +#, c-format +msgid "process %lu is no ELF program" +msgstr "العملية %lu ليست برنامج ELF" + +#: elf/readelflib.c:34 +#, c-format +msgid "file %s is truncated\n" +msgstr "الملف %s مبتور\n" + +#: elf/readelflib.c:63 +#, c-format +msgid "%s is a 32 bit ELF file.\n" +msgstr "%s هو ملف ELF ذو 32 بت.\n" + +#: elf/readelflib.c:65 +#, c-format +msgid "%s is a 64 bit ELF file.\n" +msgstr "%s هو ملف ELF ذو 64 بت.\n" + +#: elf/readelflib.c:67 +#, c-format +msgid "Unknown ELFCLASS in file %s.\n" +msgstr "ELFCLASS غير معروف في الملف %s.\n" + +#: elf/readelflib.c:74 +#, c-format +msgid "%s is not a shared object file (Type: %d).\n" +msgstr "%s ليس ملف كائن مشترك (النوع: %d).\n" + +#: elf/readelflib.c:101 +#, c-format +msgid "more than one dynamic segment\n" +msgstr "أكثر من مقطع ديناميكي واحد\n" + +#: elf/readlib.c:87 +#, c-format +msgid "Cannot fstat file %s.\n" +msgstr "يتعذر عمل fstat للملف %s.\n" + +#: elf/readlib.c:98 +#, c-format +msgid "File %s is empty, not checked." +msgstr "الملف %s فارغ، لم يفحص." + +#: elf/readlib.c:104 +#, c-format +msgid "File %s is too small, not checked." +msgstr "الملف %s صغير جداً، لم يفحص." + +#: elf/readlib.c:114 +#, c-format +msgid "Cannot mmap file %s.\n" +msgstr "يتعذر عمل mmap للملف %s.\n" + +#: elf/readlib.c:152 +#, c-format +msgid "%s is not an ELF file - it has the wrong magic bytes at the start.\n" +msgstr "%s ليس ملف ELF - يحتوي على بايتات سحرية خاطئة في البداية.\n" + +#: elf/sln.c:76 +#, c-format +msgid "" +"Usage: sln src dest|file\n" +"\n" +msgstr "" +"الاستخدام: sln src dest|file\n" +"\n" + +#: elf/sln.c:97 +#, c-format +msgid "%s: file open error: %m\n" +msgstr "%s: خطأ في فتح الملف: %m\n" + +#: elf/sln.c:134 +#, c-format +msgid "No target in line %d\n" +msgstr "لا يوجد هدف في السطر %d\n" + +#: elf/sln.c:164 +#, c-format +msgid "%s: destination must not be a directory\n" +msgstr "%s: الوجهة يجب ألا تكون دليلاً\n" + +#: elf/sln.c:170 +#, c-format +msgid "%s: failed to remove the old destination\n" +msgstr "%s: فشل في إزالة الوجهة القديمة\n" + +#: elf/sln.c:178 +#, c-format +msgid "%s: invalid destination: %s\n" +msgstr "%s: وجهة غير صالحة: %s\n" + +#: elf/sln.c:189 elf/sln.c:198 +#, c-format +msgid "Invalid link from \"%s\" to \"%s\": %s\n" +msgstr "رابط غير صالح من \"%s\" إلى \"%s\": %s\n" + +#: elf/sotruss.sh:32 +#, sh-format +msgid "" +"Usage: sotruss [OPTION...] [--] EXECUTABLE [EXECUTABLE-OPTION...]\n" +" -F, --from FROMLIST Trace calls from objects on FROMLIST\n" +" -T, --to TOLIST Trace calls to objects on TOLIST\n" +"\n" +" -e, --exit Also show exits from the function calls\n" +" -f, --follow Trace child processes\n" +" -o, --output FILENAME Write output to FILENAME (or FILENAME.$PID in case\n" +"\t\t\t -f is also used) instead of standard error\n" +"\n" +" -?, --help Give this help list\n" +" --usage Give a short usage message\n" +" --version Print program version" +msgstr "" +"الاستخدام: sotruss [خيار...] [--] EXECUTABLE [خيارات-التنفيذي...]\n" +" -F, --from FROMLIST تتبع الاستدعاءات من كائنات في FROMLIST\n" +" -T, --to TOLIST تتبع الاستدعاءات إلى كائنات في TOLIST\n" +"\n" +" -e, --exit أظهر أيضاً عمليات الخروج من استدعاءات الوظائف\n" +" -f, --follow تتبع العمليات التابعة\n" +" -o, --output FILENAME اكتب المخرجات إلى FILENAME (أو FILENAME.$PID في حال\n" +"\t\t\t استخدام -f أيضاً) بدلاً من الخطأ القياسي\n" +"\n" +" -?, --help أعطِ قائمة المساعدة هذه\n" +" --usage أعطِ رسالة استخدام قصيرة\n" +" --version اطبع إصدار البرنامج" + +#: elf/sotruss.sh:46 +msgid "Mandatory arguments to long options are also mandatory for any corresponding\\nshort options.\\n" +msgstr "الوسائط الإلزامية للخيارات الطويلة هي أيضاً إلزامية لأي خيارات\\nقصيرة مقابلة.\\n" + +#: elf/sotruss.sh:55 +msgid "%s: option requires an argument -- '%s'\\n" +msgstr "%s: الخيار يتطلب وسيطاً -- '%s'\\n" + +#: elf/sotruss.sh:61 +msgid "%s: option is ambiguous; possibilities:" +msgstr "%s: الخيار غامض؛ الاحتمالات:" + +#: elf/sotruss.sh:79 +msgid "Written by %s.\\n" +msgstr "كتبه %s.\\n" + +#: elf/sotruss.sh:86 +msgid "" +"Usage: %s [-ef] [-F FROMLIST] [-o FILENAME] [-T TOLIST] [--exit]\n" +"\t [--follow] [--from FROMLIST] [--output FILENAME] [--to TOLIST]\n" +"\t [--help] [--usage] [--version] [--]\n" +"\t EXECUTABLE [EXECUTABLE-OPTION...]\\n" +msgstr "" +"الاستخدام: %s [-ef] [-F FROMLIST] [-o FILENAME] [-T TOLIST] [--exit]\n" +"\t [--follow] [--from FROMLIST] [--output FILENAME] [--to TOLIST]\n" +"\t [--help] [--usage] [--version] [--]\n" +"\t الملف التنفيذي [خيارات-الملف-التنفيذي...]\\n" + +#: elf/sotruss.sh:134 +msgid "%s: unrecognized option '%c%s'\\n" +msgstr "%s: خيار غير معروف '%c%s'\\n" + +#: elf/sprof.c:77 +msgid "Output selection:" +msgstr "تحديد المخرجات:" + +#: elf/sprof.c:79 +msgid "print list of count paths and their number of use" +msgstr "اطبع قائمة بمسارات العد وعدد استخداماتها" + +#: elf/sprof.c:81 +msgid "generate flat profile with counts and ticks" +msgstr "توليد تشكيلة مسطحة مع الأعداد والتكات" + +#: elf/sprof.c:82 +msgid "generate call graph" +msgstr "توليد رسم بياني للاستدعاءات" + +#: elf/sprof.c:89 +msgid "Read and display shared object profiling data." +msgstr "قراءة وعرض بيانات تشكيلة الكائن المشترك." + +#: elf/sprof.c:94 +msgid "SHOBJ [PROFDATA]" +msgstr "SHOBJ [PROFDATA]" + +#: elf/sprof.c:434 +#, c-format +msgid "failed to load shared object `%s'" +msgstr "فشل تحميل الكائن المشترك `%s'" + +#: elf/sprof.c:443 elf/sprof.c:860 elf/sprof.c:958 +#, c-format +msgid "cannot create internal descriptor" +msgstr "يتعذر إنشاء واصف داخلي" + +#: elf/sprof.c:552 +#, c-format +msgid "Reopening shared object `%s' failed" +msgstr "فشل إعادة فتح الكائن المشترك `%s'" + +#: elf/sprof.c:556 elf/sprof.c:672 +#, c-format +msgid "stat(%s) failure" +msgstr "فشل stat(%s)" + +#: elf/sprof.c:573 +#, c-format +msgid "read outside of file extents %zu + %jd > %jd" +msgstr "قراءة خارج نطاقات الملف %zu + %jd > %jd" + +#: elf/sprof.c:582 elf/sprof.c:689 +#, c-format +msgid "reading of section headers failed" +msgstr "فشلت قراءة ترويسات الأقسام" + +#: elf/sprof.c:592 elf/sprof.c:699 +#, c-format +msgid "reading of section header string table failed" +msgstr "فشلت قراءة جدول سلاسل ترويسات الأقسام" + +#: elf/sprof.c:619 +#, c-format +msgid "*** Cannot read debuginfo file name: %m\n" +msgstr "*** يتعذر قراءة اسم ملف معلومات التنقيح: %m\n" + +#: elf/sprof.c:640 +#, c-format +msgid "cannot determine file name" +msgstr "يتعذر تحديد اسم الملف" + +#: elf/sprof.c:678 +#, c-format +msgid "reading of ELF header failed" +msgstr "فشلت قراءة ترويسة ELF" + +#: elf/sprof.c:683 +#, c-format +msgid "too many section headers" +msgstr "ترويسات أقسام كثيرة جداً" + +#: elf/sprof.c:720 +#, c-format +msgid "*** The file `%s' is stripped: no detailed analysis possible\n" +msgstr "*** الملف `%s' مجرد: لا يمكن إجراء تحليل مفصل\n" + +#: elf/sprof.c:750 +#, c-format +msgid "failed to load symbol data" +msgstr "فشل تحميل بيانات الرموز" + +#: elf/sprof.c:815 +#, c-format +msgid "cannot load profiling data" +msgstr "يتعذر تحميل بيانات التشكيلة" + +#: elf/sprof.c:824 +#, c-format +msgid "while stat'ing profiling data file" +msgstr "أثناء جلب معلومات ملف بيانات التشكيلة" + +#: elf/sprof.c:832 +#, c-format +msgid "profiling data file `%s' does not match shared object `%s'" +msgstr "ملف بيانات التشكيلة `%s' لا يطابق الكائن المشترك `%s'" + +#: elf/sprof.c:843 +#, c-format +msgid "failed to mmap the profiling data file" +msgstr "فشل mmap لملف بيانات التشكيلة" + +#: elf/sprof.c:851 +#, c-format +msgid "error while closing the profiling data file" +msgstr "خطأ أثناء إغلاق ملف بيانات التشكيلة" + +#: elf/sprof.c:934 +#, c-format +msgid "`%s' is no correct profile data file for `%s'" +msgstr "`%s' ليس ملف بيانات تشكيلة صحيح لـ `%s'" + +#: elf/sprof.c:1115 elf/sprof.c:1173 +#, c-format +msgid "cannot allocate symbol data" +msgstr "يتعذر تخصيص بيانات الرموز" + +#: elf/stringtable.c:90 +#, c-format +msgid "String table string is too long" +msgstr "سلسلة جدول السلاسل طويلة جداً" + +#: elf/stringtable.c:103 +#, c-format +msgid "String table has too many entries" +msgstr "جدول السلاسل يحتوي على مدخلات كثيرة جداً" + +#: elf/stringtable.c:188 elf/stringtable.c:196 +#, c-format +msgid "String table is too large" +msgstr "جدول السلاسل كبير جداً" + +#: iconv/iconv_charmap.c:146 iconv/iconv_prog.c:426 +#, c-format +msgid "cannot open output file" +msgstr "يتعذر فتح ملف المخرجات" + +#: iconv/iconv_charmap.c:192 +#, c-format +msgid "error while closing input `%s'" +msgstr "خطأ أثناء إغلاق المدخلات `%s'" + +#: iconv/iconv_charmap.c:443 +#, c-format +msgid "illegal input sequence at position %zd" +msgstr "تسلسل مدخلات غير قانوني في الموقع %zd" + +#: iconv/iconv_charmap.c:462 iconv/iconv_prog.c:728 +#, c-format +msgid "incomplete character or shift sequence at end of buffer" +msgstr "محرف أو تسلسل إزاحة غير مكتمل في نهاية المخزن المؤقت" + +#: iconv/iconv_charmap.c:507 iconv/iconv_charmap.c:543 iconv/iconv_prog.c:736 +#, c-format +msgid "error while reading the input" +msgstr "خطأ أثناء قراءة المدخلات" + +#: iconv/iconv_charmap.c:525 +#, c-format +msgid "unable to allocate buffer for input" +msgstr "غير قادر على تخصيص مخزن مؤقت للمدخلات" + +#: iconv/iconv_prog.c:60 +msgid "Input/Output format specification:" +msgstr "مواصفات تنسيق المدخلات/المخرجات:" + +#: iconv/iconv_prog.c:61 +msgid "encoding of original text" +msgstr "ترميز النص الأصلي" + +#: iconv/iconv_prog.c:62 +msgid "encoding for output" +msgstr "ترميز المخرجات" + +#: iconv/iconv_prog.c:63 +msgid "Information:" +msgstr "المعلومات:" + +#: iconv/iconv_prog.c:64 +msgid "list all known coded character sets" +msgstr "أدرج كافة مجموعات المحارف المرمزة المعروفة" + +#: iconv/iconv_prog.c:65 locale/programs/localedef.c:123 +msgid "Output control:" +msgstr "التحكم في المخرجات:" + +#: iconv/iconv_prog.c:66 +msgid "omit invalid characters from output" +msgstr "حذف المحارف غير الصالحة من المخرجات" + +#: iconv/iconv_prog.c:67 iconv/iconvconfig.c:128 +#: locale/programs/localedef.c:116 locale/programs/localedef.c:118 +#: locale/programs/localedef.c:120 locale/programs/localedef.c:149 +#: malloc/memusagestat.c:56 +msgid "FILE" +msgstr "ملف" + +#: iconv/iconv_prog.c:67 +msgid "output file" +msgstr "ملف المخرجات" + +#: iconv/iconv_prog.c:68 +msgid "suppress warnings" +msgstr "كتم التحذيرات" + +#: iconv/iconv_prog.c:69 +msgid "print progress information" +msgstr "اطبع معلومات التقدم" + +#: iconv/iconv_prog.c:72 +msgid "BYTE-COUNT" +msgstr "BYTE-COUNT" + +#: iconv/iconv_prog.c:73 +msgid "size of in-memory scratch buffer" +msgstr "حجم مخزن المسودة المؤقت في الذاكرة" + +#: iconv/iconv_prog.c:78 +msgid "Convert encoding of given files from one encoding to another." +msgstr "تحويل ترميز الملفات المعطاة من ترميز إلى آخر." + +#: iconv/iconv_prog.c:82 +msgid "[FILE...]" +msgstr "[ملف...]" + +#: iconv/iconv_prog.c:189 iconv/iconv_prog.c:251 +#, c-format +msgid "failed to start conversion processing" +msgstr "فشل في بدء معالجة التحويل" + +#: iconv/iconv_prog.c:225 +#, c-format +msgid "conversions from `%s' and to `%s' are not supported" +msgstr "التحويلات من `%s' وإلى `%s' غير مدعومة" + +#: iconv/iconv_prog.c:230 +#, c-format +msgid "conversion from `%s' is not supported" +msgstr "التحويل من `%s' غير مدعوم" + +#: iconv/iconv_prog.c:237 +#, c-format +msgid "conversion to `%s' is not supported" +msgstr "التحويل إلى `%s' غير مدعوم" + +#: iconv/iconv_prog.c:241 +#, c-format +msgid "conversion from `%s' to `%s' is not supported" +msgstr "التحويل من `%s' إلى `%s' غير مدعوم" + +#: iconv/iconv_prog.c:349 +#, c-format +msgid "invalid buffer size: %s" +msgstr "حجم مخزن مؤقت غير صالح: %s" + +#: iconv/iconv_prog.c:540 +#, c-format +msgid "conversion stopped due to problem in writing the output" +msgstr "توقف التحويل بسبب مشكلة في كتابة المخرجات" + +#: iconv/iconv_prog.c:686 +#, c-format +msgid "illegal input sequence at position %lld" +msgstr "تسلسل مدخلات غير قانوني في الموقع %lld" + +#: iconv/iconv_prog.c:693 +#, c-format +msgid "internal error (illegal descriptor)" +msgstr "خطأ داخلي (واصف غير قانوني)" + +#: iconv/iconv_prog.c:696 +#, c-format +msgid "unknown iconv() error %d" +msgstr "خطأ iconv() غير معروف %d" + +#: iconv/iconv_prog.c:909 +msgid "" +"The following list contains all the coded character sets known. This does\n" +"not necessarily mean that all combinations of these names can be used for\n" +"the FROM and TO command line parameters. One coded character set can be\n" +"listed with several different names (aliases).\n" +"\n" +" " +msgstr "" +"القائمة التالية تحتوي على جميع مجموعات المحارف المرمزة المعروفة. هذا لا\n" +"يعني بالضرورة إمكانية استخدام جميع تركيبات هذه الأسماء لمعاملات سطر\n" +"الأوامر FROM و TO. يمكن إدراج مجموعة محارف مرمزة واحدة بعدة\n" +"أسماء مختلفة (أسماء مستعارة).\n" +"\n" +" " + +#: iconv/iconvconfig.c:109 +msgid "Create fastloading iconv module configuration file." +msgstr "إنشاء ملف ضبط لوحدة iconv سريع التحميل." + +#: iconv/iconvconfig.c:113 +msgid "[DIR...]" +msgstr "[الدليل…]" + +#: iconv/iconvconfig.c:126 locale/programs/localedef.c:128 +msgid "PATH" +msgstr "المسار" + +#: iconv/iconvconfig.c:127 +msgid "Prefix used for all file accesses" +msgstr "البادئة المستخدمة لكافة عمليات الوصول للملفات" + +#: iconv/iconvconfig.c:128 +msgid "Put output in FILE instead of installed location (--prefix does not apply to FILE)" +msgstr "ضع المخرجات في FILE بدلاً من موقع التثبيت (--prefix لا ينطبق على FILE)" + +#: iconv/iconvconfig.c:132 +msgid "Do not search standard directories, only those on the command line" +msgstr "لا تبحث في الأدلة القياسية، فقط تلك المحددة في سطر الأوامر" + +#: iconv/iconvconfig.c:300 +#, c-format +msgid "Directory arguments required when using --nostdlib" +msgstr "وسائط الدليل مطلوبة عند استخدام --nostdlib" + +#: iconv/iconvconfig.c:342 +#, c-format +msgid "no output file produced because warnings were issued" +msgstr "لم يتم إنتاج ملف مخرجات بسبب صدور تحذيرات" + +#: iconv/iconvconfig.c:431 +#, c-format +msgid "while inserting in search tree" +msgstr "أثناء الإدراج في شجرة البحث" + +#: iconv/iconvconfig.c:1195 +#, c-format +msgid "cannot generate output file" +msgstr "يتعذر توليد ملف المخرجات" + +#: include/unistd_ext.h:38 +#, c-format +msgid "write of %zu bytes failed after %td: %m" +msgstr "فشلت كتابة %zu بايت بعد %td: %m" + +#: include/unistd_ext.h:43 +#, c-format +msgid "write returned 0 after writing %td bytes of %zu" +msgstr "أرجعت الكتابة 0 بعد كتابة %td بايت من %zu" + +#: include/unistd_ext.h:59 +#, c-format +msgid "read of %zu bytes failed after %td: %m" +msgstr "فشلت قراءة %zu بايت بعد %td: %m" + +#: inet/rcmd.c:160 +msgid "rcmd: Cannot allocate memory\n" +msgstr "rcmd: يتعذر تخصيص الذاكرة\n" + +#: inet/rcmd.c:177 +msgid "rcmd: socket: All ports in use\n" +msgstr "rcmd: socket: جميع المنافذ قيد الاستخدام\n" + +#: inet/rcmd.c:205 +#, c-format +msgid "connect to address %s: " +msgstr "اتصل بالعنوان %s: " + +#: inet/rcmd.c:218 +#, c-format +msgid "Trying %s...\n" +msgstr "محاولة %s...\n" + +#: inet/rcmd.c:254 +#, c-format +msgid "rcmd: write (setting up stderr): %m\n" +msgstr "rcmd: كتابة (إعداد stderr): %m\n" + +#: inet/rcmd.c:270 +#, c-format +msgid "rcmd: poll (setting up stderr): %m\n" +msgstr "rcmd: استطلاع poll (إعداد stderr): %m\n" + +#: inet/rcmd.c:273 +msgid "poll: protocol failure in circuit setup\n" +msgstr "poll: فشل في البروتوكول في إعداد الدائرة\n" + +#: inet/rcmd.c:305 +msgid "socket: protocol failure in circuit setup\n" +msgstr "socket: فشل في البروتوكول في إعداد الدائرة\n" + +#: inet/rcmd.c:329 +#, c-format +msgid "rcmd: %s: short read" +msgstr "rcmd: %s: قراءة قصيرة" + +#: inet/rcmd.c:481 +msgid "lstat failed" +msgstr "فشل lstat" + +#: inet/rcmd.c:488 +msgid "cannot open" +msgstr "يتعذر فتح" + +#: inet/rcmd.c:490 +msgid "fstat failed" +msgstr "فشل fstat" + +#: inet/rcmd.c:492 +msgid "bad owner" +msgstr "مالك سيئ" + +#: inet/rcmd.c:494 +msgid "writeable by other than owner" +msgstr "قابل للكتابة من قبل غير المالك" + +#: inet/rcmd.c:496 +msgid "hard linked somewhere" +msgstr "مربوط ربطاً صلباً في مكان ما" + +#: inet/ruserpass.c:165 inet/ruserpass.c:188 +msgid "out of memory" +msgstr "نفدت الذاكرة" + +#: inet/ruserpass.c:179 +msgid "Error: .netrc file is readable by others." +msgstr "خطأ: ملف .netrc قابل للقراءة من قبل الآخرين." + +#: inet/ruserpass.c:180 +msgid "Remove 'password' line or make file unreadable by others." +msgstr "أزل سطر 'password' أو اجعل الملف غير قابل للقراءة من قبل الآخرين." + +#: inet/ruserpass.c:199 +#, c-format +msgid "Unknown .netrc keyword %s" +msgstr "كلمة مفتاحية غير معروفة في .netrc: %s" + +#: locale/programs/charmap-dir.c:56 +#, c-format +msgid "cannot read character map directory `%s'" +msgstr "يتعذر قراءة دليل خريطة المحارف `%s'" + +#: locale/programs/charmap.c:137 +#, c-format +msgid "character map file `%s' not found" +msgstr "ملف خريطة المحارف `%s' غير موجود" + +#: locale/programs/charmap.c:195 +#, c-format +msgid "default character map file `%s' not found" +msgstr "ملف خريطة المحارف المبدئي `%s' غير موجود" + +#: locale/programs/charmap.c:264 +#, c-format +msgid "character map `%s' is not ASCII compatible, locale not ISO C compliant [--no-warnings=ascii]" +msgstr "خريطة المحارف `%s' غير متوافقة مع ASCII، المحلية غير متوافقة مع ISO C [--no-warnings=ascii]" + +#: locale/programs/charmap.c:342 +#, c-format +msgid "%s: must be greater than \n" +msgstr "%s: يجب أن يكون أكبر من \n" + +#: locale/programs/charmap.c:362 locale/programs/charmap.c:379 +#: locale/programs/repertoire.c:172 +#, c-format +msgid "syntax error in prolog: %s" +msgstr "خطأ نحوي في المقدمة: %s" + +#: locale/programs/charmap.c:363 +msgid "invalid definition" +msgstr "تعريف غير صالح" + +#: locale/programs/charmap.c:380 locale/programs/locfile.c:130 +#: locale/programs/locfile.c:157 locale/programs/repertoire.c:173 +msgid "bad argument" +msgstr "وسيط سيئ" + +#: locale/programs/charmap.c:407 +#, c-format +msgid "duplicate definition of <%s>" +msgstr "تعريف مكرر لـ <%s>" + +#: locale/programs/charmap.c:414 +#, c-format +msgid "value for <%s> must be 1 or greater" +msgstr "قيمة <%s> يجب أن تكون 1 أو أكبر" + +#: locale/programs/charmap.c:426 +#, c-format +msgid "value of <%s> must be greater or equal than the value of <%s>" +msgstr "قيمة <%s> يجب أن تكون أكبر من أو تساوي قيمة <%s>" + +#: locale/programs/charmap.c:449 locale/programs/repertoire.c:181 +#, c-format +msgid "argument to <%s> must be a single character" +msgstr "الوسيط لـ <%s> يجب أن يكون محرفاً واحداً" + +#: locale/programs/charmap.c:475 +msgid "character sets with locking states are not supported" +msgstr "مجموعات المحارف ذات حالات القفل غير مدعومة" + +#: locale/programs/charmap.c:502 locale/programs/charmap.c:556 +#: locale/programs/charmap.c:588 locale/programs/charmap.c:682 +#: locale/programs/charmap.c:738 locale/programs/charmap.c:779 +#: locale/programs/charmap.c:820 +#, c-format +msgid "syntax error in %s definition: %s" +msgstr "خطأ نحوي في تعريف %s: %s" + +#: locale/programs/charmap.c:503 locale/programs/charmap.c:683 +#: locale/programs/charmap.c:780 locale/programs/repertoire.c:228 +msgid "no symbolic name given" +msgstr "لم يتم إعطاء اسم رمزي" + +#: locale/programs/charmap.c:557 +msgid "invalid encoding given" +msgstr "تم إعطاء ترميز غير صالح" + +#: locale/programs/charmap.c:566 +msgid "too few bytes in character encoding" +msgstr "بايتات قليلة جداً في ترميز المحرف" + +#: locale/programs/charmap.c:568 +msgid "too many bytes in character encoding" +msgstr "بايتات كثيرة جداً في ترميز المحرف" + +#: locale/programs/charmap.c:590 locale/programs/charmap.c:739 +#: locale/programs/charmap.c:822 locale/programs/repertoire.c:294 +msgid "no symbolic name given for end of range" +msgstr "لم يتم إعطاء اسم رمزي لنهاية النطاق" + +#: locale/programs/charmap.c:614 locale/programs/ld-address.c:523 +#: locale/programs/ld-collate.c:2635 locale/programs/ld-collate.c:3799 +#: locale/programs/ld-ctype.c:2117 locale/programs/ld-ctype.c:2829 +#: locale/programs/ld-identification.c:396 locale/programs/ld-measurement.c:212 +#: locale/programs/ld-messages.c:294 locale/programs/ld-monetary.c:855 +#: locale/programs/ld-name.c:261 locale/programs/ld-numeric.c:324 +#: locale/programs/ld-paper.c:211 locale/programs/ld-telephone.c:275 +#: locale/programs/ld-time.c:958 locale/programs/repertoire.c:311 +#, c-format +msgid "%1$s: definition does not end with `END %1$s'" +msgstr "%1$s: التعريف لا ينتهي بـ `END %1$s'" + +#: locale/programs/charmap.c:647 +msgid "only WIDTH definitions are allowed to follow the CHARMAP definition" +msgstr "فقط تعريفات WIDTH مسموح بها بعد تعريف CHARMAP" + +#: locale/programs/charmap.c:655 locale/programs/charmap.c:719 +#, c-format +msgid "value for %s must be an integer" +msgstr "قيمة %s يجب أن تكون عدداً صحيحاً" + +#: locale/programs/charmap.c:847 +#, c-format +msgid "%s: error in state machine" +msgstr "%s: خطأ في آلة الحالة" + +#: locale/programs/charmap.c:855 locale/programs/ld-address.c:539 +#: locale/programs/ld-collate.c:2632 locale/programs/ld-collate.c:3992 +#: locale/programs/ld-ctype.c:2114 locale/programs/ld-ctype.c:2846 +#: locale/programs/ld-identification.c:412 locale/programs/ld-measurement.c:228 +#: locale/programs/ld-messages.c:310 locale/programs/ld-monetary.c:871 +#: locale/programs/ld-name.c:277 locale/programs/ld-numeric.c:340 +#: locale/programs/ld-paper.c:227 locale/programs/ld-telephone.c:291 +#: locale/programs/ld-time.c:989 locale/programs/locfile.c:1009 +#: locale/programs/repertoire.c:322 +#, c-format +msgid "%s: premature end of file" +msgstr "%s: نهاية ملف سابقة لأوانها" + +#: locale/programs/charmap.c:874 locale/programs/charmap.c:885 +#, c-format +msgid "unknown character `%s'" +msgstr "محرف غير معروف `%s'" + +#: locale/programs/charmap.c:893 +#, c-format +msgid "number of bytes for byte sequence of beginning and end of range not the same: %d vs %d" +msgstr "عدد البايتات لتسلسل البايتات في بداية ونهاية النطاق ليس نفسه: %d مقابل %d" + +#: locale/programs/charmap.c:998 locale/programs/ld-collate.c:2916 +#: locale/programs/repertoire.c:417 +msgid "invalid names for character range" +msgstr "أسماء غير صالحة لنطاق المحارف" + +#: locale/programs/charmap.c:1010 locale/programs/repertoire.c:429 +msgid "hexadecimal range format should use only capital characters" +msgstr "تنسيق النطاق الست عشري يجب أن يستخدم المحارف الكبيرة فقط" + +#: locale/programs/charmap.c:1028 locale/programs/repertoire.c:447 +#, c-format +msgid "<%s> and <%s> are invalid names for range" +msgstr "<%s> و <%s> أسماء غير صالحة للنطاق" + +#: locale/programs/charmap.c:1034 locale/programs/repertoire.c:454 +msgid "upper limit in range is smaller than lower limit" +msgstr "الحد العلوي في النطاق أصغر من الحد السفلي" + +#: locale/programs/charmap.c:1092 +msgid "resulting bytes for range not representable." +msgstr "البايتات الناتجة للنطاق غير قابلة للتمثيل." + +#: locale/programs/ld-address.c:132 locale/programs/ld-collate.c:1569 +#: locale/programs/ld-ctype.c:429 locale/programs/ld-identification.c:130 +#: locale/programs/ld-measurement.c:91 locale/programs/ld-messages.c:95 +#: locale/programs/ld-monetary.c:191 locale/programs/ld-name.c:92 +#: locale/programs/ld-numeric.c:96 locale/programs/ld-paper.c:88 +#: locale/programs/ld-telephone.c:91 locale/programs/ld-time.c:163 +#, c-format +msgid "No definition for %s category found" +msgstr "لم يتم العثور على تعريف للفئة %s" + +#: locale/programs/ld-address.c:143 locale/programs/ld-address.c:181 +#: locale/programs/ld-address.c:198 locale/programs/ld-address.c:227 +#: locale/programs/ld-address.c:299 locale/programs/ld-address.c:318 +#: locale/programs/ld-address.c:330 locale/programs/ld-identification.c:143 +#: locale/programs/ld-measurement.c:102 locale/programs/ld-monetary.c:291 +#: locale/programs/ld-monetary.c:368 locale/programs/ld-monetary.c:389 +#: locale/programs/ld-name.c:103 locale/programs/ld-name.c:140 +#: locale/programs/ld-numeric.c:110 locale/programs/ld-numeric.c:124 +#: locale/programs/ld-paper.c:99 locale/programs/ld-paper.c:108 +#: locale/programs/ld-telephone.c:102 locale/programs/ld-telephone.c:159 +#: locale/programs/ld-time.c:179 locale/programs/ld-time.c:200 +#, c-format +msgid "%s: field `%s' not defined" +msgstr "%s: الحقل `%s' غير معرف" + +#: locale/programs/ld-address.c:155 locale/programs/ld-address.c:206 +#: locale/programs/ld-address.c:236 locale/programs/ld-address.c:274 +#: locale/programs/ld-name.c:115 locale/programs/ld-telephone.c:114 +#, c-format +msgid "%s: field `%s' must not be empty" +msgstr "%s: الحقل `%s' يجب ألا يكون فارغاً" + +#: locale/programs/ld-address.c:167 +#, c-format +msgid "%s: invalid escape `%%%c' sequence in field `%s'" +msgstr "%s: تسلسل هروب `%%%c' غير صالح في الحقل `%s'" + +#: locale/programs/ld-address.c:217 +#, c-format +msgid "%s: terminology language code `%s' not defined" +msgstr "%s: كود لغة المصطلحات `%s' غير معرف" + +#: locale/programs/ld-address.c:242 +#, c-format +msgid "%s: field `%s' must not be defined" +msgstr "%s: الحقل `%s' يجب ألا يكون معرفاً" + +#: locale/programs/ld-address.c:256 locale/programs/ld-address.c:285 +#, c-format +msgid "%s: language abbreviation `%s' not defined" +msgstr "%s: اختصار اللغة `%s' غير معرف" + +#: locale/programs/ld-address.c:263 locale/programs/ld-address.c:291 +#: locale/programs/ld-address.c:324 locale/programs/ld-address.c:336 +#, c-format +msgid "%s: `%s' value does not match `%s' value" +msgstr "%s: قيمة `%s' لا تطابق قيمة `%s'" + +#: locale/programs/ld-address.c:310 +#, c-format +msgid "%s: numeric country code `%d' not valid" +msgstr "%s: كود الدولة الرقمي `%d' غير صالح" + +#: locale/programs/ld-address.c:431 locale/programs/ld-address.c:468 +#: locale/programs/ld-address.c:506 locale/programs/ld-ctype.c:2478 +#: locale/programs/ld-identification.c:308 locale/programs/ld-measurement.c:195 +#: locale/programs/ld-messages.c:263 locale/programs/ld-monetary.c:610 +#: locale/programs/ld-monetary.c:645 locale/programs/ld-monetary.c:686 +#: locale/programs/ld-name.c:234 locale/programs/ld-numeric.c:216 +#: locale/programs/ld-paper.c:194 locale/programs/ld-telephone.c:250 +#: locale/programs/ld-time.c:863 locale/programs/ld-time.c:905 +#, c-format +msgid "%s: field `%s' declared more than once" +msgstr "%s: الحقل `%s' تم التصريح عنه أكثر من مرة" + +#: locale/programs/ld-address.c:435 locale/programs/ld-address.c:473 +#: locale/programs/ld-identification.c:312 locale/programs/ld-messages.c:273 +#: locale/programs/ld-monetary.c:614 locale/programs/ld-monetary.c:649 +#: locale/programs/ld-name.c:238 locale/programs/ld-numeric.c:220 +#: locale/programs/ld-telephone.c:254 locale/programs/ld-time.c:755 +#: locale/programs/ld-time.c:826 locale/programs/ld-time.c:868 +#, c-format +msgid "%s: unknown character in field `%s'" +msgstr "%s: محرف غير معروف في الحقل `%s'" + +#: locale/programs/ld-address.c:520 locale/programs/ld-collate.c:3797 +#: locale/programs/ld-ctype.c:2826 locale/programs/ld-identification.c:393 +#: locale/programs/ld-measurement.c:209 locale/programs/ld-messages.c:292 +#: locale/programs/ld-monetary.c:853 locale/programs/ld-name.c:259 +#: locale/programs/ld-numeric.c:322 locale/programs/ld-paper.c:209 +#: locale/programs/ld-telephone.c:273 locale/programs/ld-time.c:956 +#, c-format +msgid "%s: incomplete `END' line" +msgstr "%s: سطر `END' غير مكتمل" + +#: locale/programs/ld-address.c:530 locale/programs/ld-collate.c:553 +#: locale/programs/ld-collate.c:605 locale/programs/ld-collate.c:901 +#: locale/programs/ld-collate.c:914 locale/programs/ld-collate.c:2601 +#: locale/programs/ld-collate.c:2622 locale/programs/ld-collate.c:3982 +#: locale/programs/ld-ctype.c:1846 locale/programs/ld-ctype.c:2104 +#: locale/programs/ld-ctype.c:2676 locale/programs/ld-ctype.c:2837 +#: locale/programs/ld-identification.c:403 locale/programs/ld-measurement.c:219 +#: locale/programs/ld-messages.c:301 locale/programs/ld-monetary.c:862 +#: locale/programs/ld-name.c:268 locale/programs/ld-numeric.c:331 +#: locale/programs/ld-paper.c:218 locale/programs/ld-telephone.c:282 +#: locale/programs/ld-time.c:980 +#, c-format +msgid "%s: syntax error" +msgstr "%s: خطأ نحوي" + +#: locale/programs/ld-collate.c:428 +#, c-format +msgid "`%.*s' already defined in charmap" +msgstr "`%.*s' معرف مسبقاً في خريطة المحارف" + +#: locale/programs/ld-collate.c:437 +#, c-format +msgid "`%.*s' already defined in repertoire" +msgstr "`%.*s' معرف مسبقاً في الدليل (repertoire)" + +#: locale/programs/ld-collate.c:444 +#, c-format +msgid "`%.*s' already defined as collating symbol" +msgstr "`%.*s' معرف مسبقاً كرمز تجميع" + +#: locale/programs/ld-collate.c:451 +#, c-format +msgid "`%.*s' already defined as collating element" +msgstr "`%.*s' معرف مسبقاً كعنصر تجميع" + +#: locale/programs/ld-collate.c:482 locale/programs/ld-collate.c:508 +#, c-format +msgid "%s: `forward' and `backward' are mutually excluding each other" +msgstr "%s: `forward' و `backward' يستبعد كل منهما الآخر" + +#: locale/programs/ld-collate.c:492 locale/programs/ld-collate.c:518 +#: locale/programs/ld-collate.c:534 +#, c-format +msgid "%s: `%s' mentioned more than once in definition of weight %d" +msgstr "%s: `%s' ذكر أكثر من مرة في تعريف الوزن %d" + +#: locale/programs/ld-collate.c:590 +#, c-format +msgid "%s: too many rules; first entry only had %d" +msgstr "%s: قواعد كثيرة جداً؛ المدخل الأول كان يحتوي فقط على %d" + +#: locale/programs/ld-collate.c:626 +#, c-format +msgid "%s: not enough sorting rules" +msgstr "%s: لا توجد قواعد فرز كافية" + +#: locale/programs/ld-collate.c:791 +#, c-format +msgid "%s: empty weight string not allowed" +msgstr "%s: سلسلة وزن فارغة غير مسموح بها" + +#: locale/programs/ld-collate.c:886 +#, c-format +msgid "%s: weights must use the same ellipsis symbol as the name" +msgstr "%s: يجب أن تستخدم الأوزان نفس رمز الحذف المستخدم في الاسم" + +#: locale/programs/ld-collate.c:942 +#, c-format +msgid "%s: too many values" +msgstr "%s: قيم كثيرة جداً" + +#: locale/programs/ld-collate.c:1062 locale/programs/ld-collate.c:1237 +#, c-format +msgid "order for `%.*s' already defined at %s:%zu" +msgstr "ترتيب `%.*s' معرف مسبقاً في %s:%zu" + +#: locale/programs/ld-collate.c:1112 +#, c-format +msgid "%s: the start and the end symbol of a range must stand for characters" +msgstr "%s: يجب أن يمثل رمزا بداية ونهاية النطاق محارف" + +#: locale/programs/ld-collate.c:1139 +#, c-format +msgid "%s: byte sequences of first and last character must have the same length" +msgstr "%s: يجب أن يكون لـ تسلسلات البايت للمحرف الأول والأخير الطول ذاته" + +#: locale/programs/ld-collate.c:1181 +#, c-format +msgid "%s: byte sequence of first character of range is not lower than that of the last character" +msgstr "%s: تسلسل بايت المحرف الأول في النطاق ليس أقل من تسلسل المحرف الأخير" + +#: locale/programs/ld-collate.c:1306 +#, c-format +msgid "%s: symbolic range ellipsis must not directly follow `order_start'" +msgstr "%s: يجب ألا يتبع حذف النطاق الرمزي `order_start' مباشرة" + +#: locale/programs/ld-collate.c:1310 +#, c-format +msgid "%s: symbolic range ellipsis must not be directly followed by `order_end'" +msgstr "%s: يجب ألا يتبع حذف النطاق الرمزي بـ `order_end' مباشرة" + +#: locale/programs/ld-collate.c:1330 locale/programs/ld-ctype.c:1362 +#, c-format +msgid "`%s' and `%.*s' are not valid names for symbolic range" +msgstr "`%s' و `%.*s' ليسا اسمين صالحين لنطاق رمزي" + +#: locale/programs/ld-collate.c:1380 locale/programs/ld-collate.c:3731 +#, c-format +msgid "%s: order for `%.*s' already defined at %s:%zu" +msgstr "%s: ترتيب `%.*s' معرف مسبقاً في %s:%zu" + +#: locale/programs/ld-collate.c:1389 +#, c-format +msgid "%s: `%s' must be a character" +msgstr "%s: `%s' يجب أن يكون محرفاً" + +#: locale/programs/ld-collate.c:1590 +#, c-format +msgid "%s: `position' must be used for a specific level in all sections or none" +msgstr "%s: يجب استخدام `position' لمستوى محدد في جميع المقاطع أو لا شيء منها" + +#: locale/programs/ld-collate.c:1614 +#, c-format +msgid "symbol `%s' not defined" +msgstr "الرمز `%s' غير معرف" + +#: locale/programs/ld-collate.c:1690 locale/programs/ld-collate.c:1789 +#, c-format +msgid "symbol `%s' has the same encoding as" +msgstr "الرمز `%s' له نفس ترميز" + +#: locale/programs/ld-collate.c:1694 locale/programs/ld-collate.c:1793 +#, c-format +msgid "symbol `%s'" +msgstr "الرمز `%s'" + +#: locale/programs/ld-collate.c:1856 +msgid "too many errors; giving up" +msgstr "أخطاء كثيرة جداً؛ توقف العمل" + +#: locale/programs/ld-collate.c:2527 locale/programs/ld-collate.c:3921 +#, c-format +msgid "%s: nested conditionals not supported" +msgstr "%s: الشرطيات المتداخلة غير مدعومة" + +#: locale/programs/ld-collate.c:2545 +#, c-format +msgid "%s: more than one 'else'" +msgstr "%s: أكثر من 'else' واحدة" + +#: locale/programs/ld-collate.c:2724 +#, c-format +msgid "%s: duplicate definition of `%s'" +msgstr "%s: تعريف مكرر لـ `%s'" + +#: locale/programs/ld-collate.c:2760 +#, c-format +msgid "%s: duplicate declaration of section `%s'" +msgstr "%s: تصريح مكرر للمقطع `%s'" + +#: locale/programs/ld-collate.c:2896 +#, c-format +msgid "%s: unknown character in collating symbol name" +msgstr "%s: محرف مجهول في اسم رمز الترتيب" + +#: locale/programs/ld-collate.c:3025 +#, c-format +msgid "%s: unknown character in equivalent definition name" +msgstr "%s: محرف مجهول في اسم تعريف المكافئ" + +#: locale/programs/ld-collate.c:3036 +#, c-format +msgid "%s: unknown character in equivalent definition value" +msgstr "%s: محرف مجهول في قيمة تعريف المكافئ" + +#: locale/programs/ld-collate.c:3046 +#, c-format +msgid "%s: unknown symbol `%s' in equivalent definition" +msgstr "%s: رمز مجهول `%s' في تعريف المكافئ" + +#: locale/programs/ld-collate.c:3055 +msgid "error while adding equivalent collating symbol" +msgstr "خطأ أثناء إضافة رمز ترتيب مكافئ" + +#: locale/programs/ld-collate.c:3093 +#, c-format +msgid "duplicate definition of script `%s'" +msgstr "تعريف مكرر للبرنامج النصي `%s'" + +#: locale/programs/ld-collate.c:3141 +#, c-format +msgid "%s: unknown section name `%.*s'" +msgstr "%s: اسم مقطع مجهول `%.*s'" + +#: locale/programs/ld-collate.c:3170 +#, c-format +msgid "%s: multiple order definitions for section `%s'" +msgstr "%s: تعريفات ترتيب متعددة للمقطع `%s'" + +#: locale/programs/ld-collate.c:3198 +#, c-format +msgid "%s: invalid number of sorting rules" +msgstr "%s: عدد غير صالح لقواعد الفرز" + +#: locale/programs/ld-collate.c:3225 +#, c-format +msgid "%s: multiple order definitions for unnamed section" +msgstr "%s: تعريفات ترتيب متعددة لمقطع غير مسمى" + +#: locale/programs/ld-collate.c:3280 locale/programs/ld-collate.c:3410 +#: locale/programs/ld-collate.c:3775 +#, c-format +msgid "%s: missing `order_end' keyword" +msgstr "%s: كلمة `order_end' المفتاحية مفقودة" + +#: locale/programs/ld-collate.c:3343 +#, c-format +msgid "%s: order for collating symbol %.*s not yet defined" +msgstr "%s: ترتيب رمز الترتيب %.*s غير معرف بعد" + +#: locale/programs/ld-collate.c:3361 +#, c-format +msgid "%s: order for collating element %.*s not yet defined" +msgstr "%s: ترتيب عنصر الترتيب %.*s غير معرف بعد" + +#: locale/programs/ld-collate.c:3372 +#, c-format +msgid "%s: cannot reorder after %.*s: symbol not known" +msgstr "%s: لا يمكن إعادة الترتيب بعد %.*s: الرمز غير معروف" + +#: locale/programs/ld-collate.c:3424 locale/programs/ld-collate.c:3787 +#, c-format +msgid "%s: missing `reorder-end' keyword" +msgstr "%s: كلمة `reorder-end' المفتاحية مفقودة" + +#: locale/programs/ld-collate.c:3458 locale/programs/ld-collate.c:3656 +#, c-format +msgid "%s: section `%.*s' not known" +msgstr "%s: المقطع `%.*s' غير معروف" + +#: locale/programs/ld-collate.c:3523 +#, c-format +msgid "%s: bad symbol <%.*s>" +msgstr "%s: رمز سيء <%.*s>" + +#: locale/programs/ld-collate.c:3719 +#, c-format +msgid "%s: cannot have `%s' as end of ellipsis range" +msgstr "%s: لا يمكن لـ `%s' أن يكون نهاية لنطاق الحذف" + +#: locale/programs/ld-collate.c:3771 +#, c-format +msgid "%s: empty category description not allowed" +msgstr "%s: وصف الفئة الفارغ غير مسموح به" + +#: locale/programs/ld-collate.c:3790 +#, c-format +msgid "%s: missing `reorder-sections-end' keyword" +msgstr "%s: كلمة `reorder-sections-end' المفتاحية مفقودة" + +#: locale/programs/ld-collate.c:3954 +#, c-format +msgid "%s: '%s' without matching 'ifdef' or 'ifndef'" +msgstr "%s: '%s' بدون 'ifdef' أو 'ifndef' مطابقة" + +#: locale/programs/ld-collate.c:3972 +#, c-format +msgid "%s: 'endif' without matching 'ifdef' or 'ifndef'" +msgstr "%s: 'endif' بدون 'ifdef' أو 'ifndef' مطابقة" + +#: locale/programs/ld-ctype.c:447 +msgid "No character set name specified in charmap" +msgstr "لا يوجد اسم لمجموعة المحارف محدد في خارطة المحارف" + +#: locale/programs/ld-ctype.c:475 +#, c-format +msgid "character L'\\u%0*x' in class `%s' must be in class `%s'" +msgstr "المحرف L'\\u%0*x' في الفئة `%s' يجب أن يكون في الفئة `%s'" + +#: locale/programs/ld-ctype.c:489 +#, c-format +msgid "character L'\\u%0*x' in class `%s' must not be in class `%s'" +msgstr "المحرف L'\\u%0*x' في الفئة `%s' يجب ألا يكون في الفئة `%s'" + +#: locale/programs/ld-ctype.c:503 locale/programs/ld-ctype.c:559 +#, c-format +msgid "internal error in %s, line %u" +msgstr "خطأ داخلي في %s، سطر %u" + +#: locale/programs/ld-ctype.c:531 +#, c-format +msgid "character '%s' in class `%s' must be in class `%s'" +msgstr "المحرف '%s' في الفئة `%s' يجب أن يكون في الفئة `%s'" + +#: locale/programs/ld-ctype.c:546 +#, c-format +msgid "character '%s' in class `%s' must not be in class `%s'" +msgstr "المحرف '%s' في الفئة `%s' يجب ألا يكون في الفئة `%s'" + +#: locale/programs/ld-ctype.c:575 locale/programs/ld-ctype.c:610 +#, c-format +msgid " character not in class `%s'" +msgstr "محرف ليس في الفئة `%s'" + +#: locale/programs/ld-ctype.c:586 locale/programs/ld-ctype.c:620 +#, c-format +msgid " character must not be in class `%s'" +msgstr "يجب ألا يكون محرف في الفئة `%s'" + +#: locale/programs/ld-ctype.c:600 +msgid "character not defined in character map" +msgstr "المحرف غير معرف في خارطة المحارف" + +#: locale/programs/ld-ctype.c:734 +msgid "`digit' category has not entries in groups of ten" +msgstr "فئة `digit' ليس لها مدخلات في مجموعات من عشرة" + +#: locale/programs/ld-ctype.c:783 +msgid "no input digits defined and none of the standard names in the charmap" +msgstr "لا توجد أرقام مدخلة معرفة ولا أي من الأسماء القياسية في خارطة المحارف" + +#: locale/programs/ld-ctype.c:846 +msgid "not all characters used in `outdigit' are available in the charmap" +msgstr "ليست كل المحارف المستخدمة في `outdigit' متاحة في خارطة المحارف" + +#: locale/programs/ld-ctype.c:865 +msgid "not all characters used in `outdigit' are available in the repertoire" +msgstr "ليست كل المحارف المستخدمة في `outdigit' متاحة في الذخيرة" + +#: locale/programs/ld-ctype.c:1130 +#, c-format +msgid "character class `%s' already defined" +msgstr "فئة المحارف `%s' معرفة مسبقاً" + +#: locale/programs/ld-ctype.c:1136 +#, c-format +msgid "implementation limit: no more than %Zd character classes allowed" +msgstr "حد التنفيذ: لا يسمح بأكثر من %Zd من فئات المحارف" + +#: locale/programs/ld-ctype.c:1162 +#, c-format +msgid "character map `%s' already defined" +msgstr "خارطة المحارف `%s' معرفة مسبقاً" + +#: locale/programs/ld-ctype.c:1168 +#, c-format +msgid "implementation limit: no more than %d character maps allowed" +msgstr "حد التنفيذ: لا يسمح بأكثر من %d من خرائط المحارف" + +#: locale/programs/ld-ctype.c:1434 locale/programs/ld-ctype.c:1559 +#: locale/programs/ld-ctype.c:1665 locale/programs/ld-ctype.c:2341 +#: locale/programs/ld-ctype.c:3301 +#, c-format +msgid "%s: field `%s' does not contain exactly ten entries" +msgstr "%s: الحقل `%s' لا يحتوي على عشرة مدخلات بالضبط" + +#: locale/programs/ld-ctype.c:1462 locale/programs/ld-ctype.c:2036 +#, c-format +msgid "to-value of range is smaller than from-value " +msgstr "قيمة-إلى للنطاق أصغر من قيمة-من " + +#: locale/programs/ld-ctype.c:1589 +msgid "start and end character sequence of range must have the same length" +msgstr "يجب أن يكون لـ تسلسل محرف البداية والنهاية للنطاق الطول ذاته" + +#: locale/programs/ld-ctype.c:1596 +msgid "to-value character sequence is smaller than from-value sequence" +msgstr "تسلسل محرف قيمة-إلى أصغر من تسلسل قيمة-من" + +#: locale/programs/ld-ctype.c:1956 locale/programs/ld-ctype.c:2007 +msgid "premature end of `translit_ignore' definition" +msgstr "نهاية سابقة لأوانها لتعريف `translit_ignore'" + +#: locale/programs/ld-ctype.c:1962 locale/programs/ld-ctype.c:2013 +#: locale/programs/ld-ctype.c:2055 +msgid "syntax error" +msgstr "خطأ في بناء الجملة" + +#: locale/programs/ld-ctype.c:2188 +#, c-format +msgid "%s: syntax error in definition of new character class" +msgstr "%s: خطأ في بناء الجملة في تعريف فئة محارف جديدة" + +#: locale/programs/ld-ctype.c:2203 +#, c-format +msgid "%s: syntax error in definition of new character map" +msgstr "%s: خطأ في بناء الجملة في تعريف خارطة محارف جديدة" + +#: locale/programs/ld-ctype.c:2363 +msgid "ellipsis range must be marked by two operands of same type" +msgstr "يجب وسم نطاق الحذف بمعاملين من النوع ذاته" + +#: locale/programs/ld-ctype.c:2372 +msgid "with symbolic name range values the absolute ellipsis `...' must not be used" +msgstr "مع قيم نطاق الأسماء الرمزية يجب ألا يستخدم الحذف المطلق `...'" + +#: locale/programs/ld-ctype.c:2387 +msgid "with UCS range values one must use the hexadecimal symbolic ellipsis `..'" +msgstr "مع قيم نطاق UCS يجب استخدام الحذف الرمزي الست عشري `..'" + +#: locale/programs/ld-ctype.c:2401 +msgid "with character code range values one must use the absolute ellipsis `...'" +msgstr "مع قيم نطاق رموز المحارف يجب استخدام الحذف المطلق `...'" + +#: locale/programs/ld-ctype.c:2552 +#, c-format +msgid "duplicated definition for mapping `%s'" +msgstr "تعريف مكرر للمسح `%s'" + +#: locale/programs/ld-ctype.c:2638 locale/programs/ld-ctype.c:2782 +#, c-format +msgid "%s: `translit_start' section does not end with `translit_end'" +msgstr "%s: مقطع `translit_start' لا ينتهي بـ `translit_end'" + +#: locale/programs/ld-ctype.c:2733 +#, c-format +msgid "%s: duplicate `default_missing' definition" +msgstr "%s: تعريف `default_missing' مكرر" + +#: locale/programs/ld-ctype.c:2738 +msgid "previous definition was here" +msgstr "كان التعريف السابق هنا" + +#: locale/programs/ld-ctype.c:2760 +#, c-format +msgid "%s: no representable `default_missing' definition found" +msgstr "%s: لم يعثر على تعريف `default_missing' يمكن تمثيله" + +#: locale/programs/ld-ctype.c:2877 locale/programs/ld-ctype.c:2973 +#: locale/programs/ld-ctype.c:2992 locale/programs/ld-ctype.c:3012 +#: locale/programs/ld-ctype.c:3032 locale/programs/ld-ctype.c:3052 +#: locale/programs/ld-ctype.c:3072 locale/programs/ld-ctype.c:3111 +#: locale/programs/ld-ctype.c:3131 locale/programs/ld-ctype.c:3197 +#: locale/programs/ld-ctype.c:3238 locale/programs/ld-ctype.c:3261 +#, c-format +msgid "%s: character `%s' not defined while needed as default value" +msgstr "%s: المحرف `%s' غير معرف بينما هو مطلوب كقيمة مبدئية" + +#: locale/programs/ld-ctype.c:2882 locale/programs/ld-ctype.c:2978 +#: locale/programs/ld-ctype.c:2997 locale/programs/ld-ctype.c:3017 +#: locale/programs/ld-ctype.c:3037 locale/programs/ld-ctype.c:3057 +#: locale/programs/ld-ctype.c:3077 locale/programs/ld-ctype.c:3116 +#: locale/programs/ld-ctype.c:3136 locale/programs/ld-ctype.c:3202 +#, c-format +msgid "%s: character `%s' in charmap not representable with one byte" +msgstr "%s: المحرف `%s' في خارطة المحارف لا يمكن تمثيله ببايت واحد" + +#: locale/programs/ld-ctype.c:3244 locale/programs/ld-ctype.c:3267 +#, c-format +msgid "%s: character `%s' needed as default value not representable with one byte" +msgstr "%s: المحرف `%s' المطلوب كقيمة مبدئية لا يمكن تمثيله ببايت واحد" + +#: locale/programs/ld-ctype.c:3323 +msgid "no output digits defined and none of the standard names in the charmap" +msgstr "لا توجد أرقام مخرجة معرفة ولا أي من الأسماء القياسية في خارطة المحارف" + +#: locale/programs/ld-ctype.c:3545 +#, c-format +msgid "%s: transliteration data from locale `%s' not available" +msgstr "%s: بيانات النقحرة من المحل `%s' غير متاحة" + +#: locale/programs/ld-ctype.c:3644 +#, c-format +msgid "%s: table for class \"%s\": %lu bytes" +msgstr "%s: جدول للفئة \"%s\": %lu بايت" + +#: locale/programs/ld-ctype.c:3708 +#, c-format +msgid "%s: table for map \"%s\": %lu bytes" +msgstr "%s: جدول للخارطة \"%s\": %lu بايت" + +#: locale/programs/ld-ctype.c:3832 +#, c-format +msgid "%s: table for width: %lu bytes" +msgstr "%s: جدول للعرض: %lu بايت" + +#: locale/programs/ld-identification.c:172 +#, c-format +msgid "%s: no identification for category `%s'" +msgstr "%s: لا يوجد تعريف للفئة `%s'" + +#: locale/programs/ld-identification.c:196 +#, c-format +msgid "%s: unknown standard `%s' for category `%s'" +msgstr "%s: معيار مجهول `%s' للفئة `%s'" + +#: locale/programs/ld-identification.c:379 +#, c-format +msgid "%s: duplicate category version definition" +msgstr "%s: تعريف مكرر لإصدار الفئة" + +#: locale/programs/ld-measurement.c:110 +#, c-format +msgid "%s: invalid value for field `%s'" +msgstr "%s: قيمة غير صالحة للحقل `%s'" + +#: locale/programs/ld-messages.c:112 locale/programs/ld-messages.c:145 +#, c-format +msgid "%s: field `%s' undefined" +msgstr "%s: الحقل `%s' غير معرف" + +#: locale/programs/ld-messages.c:118 locale/programs/ld-messages.c:151 +#: locale/programs/ld-numeric.c:116 +#, c-format +msgid "%s: value for field `%s' must not be an empty string" +msgstr "%s: يجب ألا تكون قيمة الحقل `%s' سلسلة فارغة" + +#: locale/programs/ld-messages.c:134 locale/programs/ld-messages.c:167 +#, c-format +msgid "%s: no correct regular expression for field `%s': %s" +msgstr "%s: لا يوجد تعبير نمطي صحيح للحقل `%s': %s" + +#: locale/programs/ld-monetary.c:310 +#, c-format +msgid "%s: value of field `int_curr_symbol' has wrong length" +msgstr "%s: قيمة الحقل `int_curr_symbol' لها طول خاطئ" + +#: locale/programs/ld-monetary.c:327 +#, c-format +msgid "%s: value of field `int_curr_symbol' does not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]" +msgstr "%s: قيمة الحقل `int_curr_symbol' لا تقابل اسماً صالحاً في ISO 4217 [--no-warnings=intcurrsym]" + +#: locale/programs/ld-monetary.c:348 locale/programs/ld-monetary.c:358 +#, c-format +msgid "%s: field `%s' not defined, using defaults" +msgstr "%s: الحقل `%s' غير معرف، يتم استخدام القيم المبدئية" + +#: locale/programs/ld-monetary.c:396 locale/programs/ld-monetary.c:420 +#, c-format +msgid "%s: value for field `%s' must be in range %d...%d" +msgstr "%s: قيمة الحقل `%s' يجب أن تكون في النطاق %d...%d" + +#: locale/programs/ld-monetary.c:656 locale/programs/ld-numeric.c:227 +#, c-format +msgid "%s: value for field `%s' must be a single character" +msgstr "%s: قيمة الحقل `%s' يجب أن تكون محرفاً واحداً" + +#: locale/programs/ld-monetary.c:753 locale/programs/ld-numeric.c:271 +#, c-format +msgid "%s: `-1' must be last entry in `%s' field" +msgstr "%s: `-1' يجب أن يكون آخر مدخل في الحقل `%s'" + +#: locale/programs/ld-monetary.c:775 locale/programs/ld-numeric.c:288 +#, c-format +msgid "%s: values for field `%s' must be smaller than 127" +msgstr "%s: يجب أن تكون قيم الحقل `%s' أصغر من 127" + +#: locale/programs/ld-monetary.c:821 +msgid "conversion rate value cannot be zero" +msgstr "لا يمكن لقيمة معدل التحويل أن تكون صفراً" + +#: locale/programs/ld-name.c:127 locale/programs/ld-telephone.c:123 +#: locale/programs/ld-telephone.c:146 +#, c-format +msgid "%s: invalid escape sequence in field `%s'" +msgstr "%s: تسلسل هروب غير صالح في الحقل `%s'" + +#: locale/programs/ld-time.c:250 +#, c-format +msgid "%s: direction flag in string %Zd in `era' field is not '+' nor '-'" +msgstr "%s: علم الاتجاه في السلسلة %Zd في حقل `era' ليس '+' ولا '-'" + +#: locale/programs/ld-time.c:260 +#, c-format +msgid "%s: direction flag in string %Zd in `era' field is not a single character" +msgstr "%s: علم الاتجاه في السلسلة %Zd في حقل `era' ليس محرفاً واحداً" + +#: locale/programs/ld-time.c:272 +#, c-format +msgid "%s: invalid number for offset in string %Zd in `era' field" +msgstr "%s: عدد غير صالح للإزاحة في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:279 +#, c-format +msgid "%s: garbage at end of offset value in string %Zd in `era' field" +msgstr "%s: نفايات في نهاية قيمة الإزاحة في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:329 +#, c-format +msgid "%s: invalid starting date in string %Zd in `era' field" +msgstr "%s: تاريخ بدء غير صالح في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:337 +#, c-format +msgid "%s: garbage at end of starting date in string %Zd in `era' field " +msgstr "%s: نفايات في نهاية تاريخ البدء في السلسلة %Zd في حقل `era' " + +#: locale/programs/ld-time.c:355 +#, c-format +msgid "%s: starting date is invalid in string %Zd in `era' field" +msgstr "%s: تاريخ البدء غير صالح في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:403 locale/programs/ld-time.c:429 +#, c-format +msgid "%s: invalid stopping date in string %Zd in `era' field" +msgstr "%s: تاريخ توقف غير صالح في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:411 +#, c-format +msgid "%s: garbage at end of stopping date in string %Zd in `era' field" +msgstr "%s: نفايات في نهاية تاريخ التوقف في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:437 +#, c-format +msgid "%s: missing era name in string %Zd in `era' field" +msgstr "%s: اسم العصر مفقود في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:448 +#, c-format +msgid "%s: missing era format in string %Zd in `era' field" +msgstr "%s: تنسيق العصر مفقود في السلسلة %Zd في حقل `era'" + +#: locale/programs/ld-time.c:493 +#, c-format +msgid "%s: third operand for value of field `%s' must not be larger than %d" +msgstr "%s: المعامل الثالث لقيمة الحقل `%s' يجب ألا يكون أكبر من %d" + +#: locale/programs/ld-time.c:501 locale/programs/ld-time.c:509 +#: locale/programs/ld-time.c:517 +#, c-format +msgid "%s: values for field `%s' must not be larger than %d" +msgstr "%s: يجب ألا تكون قيم الحقل `%s' أكبر من %d" + +#: locale/programs/ld-time.c:739 +#, c-format +msgid "%s: too few values for field `%s'" +msgstr "%s: قيم قليلة جداً للحقل `%s'" + +#: locale/programs/ld-time.c:784 +msgid "extra trailing semicolon" +msgstr "فاصلة منقوطة تالية زائدة" + +#: locale/programs/ld-time.c:787 +#, c-format +msgid "%s: too many values for field `%s'" +msgstr "%s: قيم كثيرة جداً للحقل `%s'" + +#: locale/programs/linereader.c:130 +msgid "trailing garbage at end of line" +msgstr "نفايات تالية في نهاية السطر" + +#: locale/programs/linereader.c:298 +msgid "garbage at end of number" +msgstr "نفايات في نهاية الرقم" + +#: locale/programs/linereader.c:423 +msgid "garbage at end of character code specification" +msgstr "نفايات في نهاية تحديد رمز المحرف" + +#: locale/programs/linereader.c:531 +msgid "unterminated symbolic name" +msgstr "اسم رمزي غير منتهٍ" + +#: locale/programs/linereader.c:716 +#, c-format +msgid "invalid UTF-8 sequence %s" +msgstr "تسلسل UTF-8 غير صالح %s" + +#: locale/programs/linereader.c:796 +msgid "illegal 8-bit character in untranslated string" +msgstr "محرف 8-بت غير قانوني في سلسلة غير مترجمة" + +#: locale/programs/linereader.c:804 +msgid "illegal escape sequence at end of string" +msgstr "تسلسل هروب غير قانوني في نهاية السلسلة" + +#: locale/programs/linereader.c:808 locale/programs/linereader.c:979 +msgid "unterminated string" +msgstr "سلسلة غير منتهية" + +#: locale/programs/linereader.c:841 +msgid "illegal 8-bit escape sequence" +msgstr "تسلسل هروب 8-بت غير قانوني" + +#: locale/programs/linereader.c:940 +#, c-format +msgid "symbol `%.*s' not in charmap" +msgstr "الرمز `%.*s' ليس في خارطة المحارف" + +#: locale/programs/linereader.c:961 +#, c-format +msgid "symbol `%.*s' not in repertoire map" +msgstr "الرمز `%.*s' ليس في خارطة الذخيرة" + +#: locale/programs/locale-spec.c:129 +#, c-format +msgid "unknown name \"%s\"" +msgstr "اسم مجهول \"%s\"" + +#: locale/programs/locale.c:69 +msgid "System information:" +msgstr "معلومات النظام:" + +#: locale/programs/locale.c:71 +msgid "Write names of available locales" +msgstr "كتابة أسماء المحلات المتاحة" + +#: locale/programs/locale.c:73 +msgid "Write names of available charmaps" +msgstr "كتابة أسماء خرائط المحارف المتاحة" + +#: locale/programs/locale.c:74 +msgid "Modify output format:" +msgstr "تعديل تنسيق المخرجات:" + +#: locale/programs/locale.c:75 +msgid "Write names of selected categories" +msgstr "كتابة أسماء الفئات المختارة" + +#: locale/programs/locale.c:76 +msgid "Write names of selected keywords" +msgstr "كتابة أسماء الكلمات المفتاحية المختارة" + +#: locale/programs/locale.c:77 +msgid "Print more information" +msgstr "طباعة المزيد من المعلومات" + +#: locale/programs/locale.c:82 +msgid "Get locale-specific information." +msgstr "الحصول على معلومات خاصة بالمحل." + +#: locale/programs/locale.c:85 +msgid "" +"NAME\n" +"[-a|-m]" +msgstr "" +"الاسم\n" +"[-a|-m]" + +#: locale/programs/locale.c:521 +#, c-format +msgid "while preparing output" +msgstr "أثناء تحضير المخرجات" + +#: locale/programs/locale.c:999 +#, c-format +msgid "Cannot set %s to default locale" +msgstr "لا يمكن ضبط %s إلى المحل المبدئي" + +#: locale/programs/locale.c:1097 +#, c-format +msgid "warning: The LOCPATH variable is set to \"%s\"\n" +msgstr "تحذير: متغير LOCPATH مضبوط إلى \"%s\"\n" + +#: locale/programs/localedef.c:115 +msgid "Input Files:" +msgstr "ملفات المدخلات:" + +#: locale/programs/localedef.c:117 +msgid "Symbolic character names defined in FILE" +msgstr "أسماء المحارف الرمزية المعرفة في FILE" + +#: locale/programs/localedef.c:119 +msgid "Source definitions are found in FILE" +msgstr "تعريفات المصدر موجودة في FILE" + +#: locale/programs/localedef.c:121 +msgid "FILE contains mapping from symbolic names to UCS4 values" +msgstr "يحتوي FILE على مسح من الأسماء الرمزية إلى قيم UCS4" + +#: locale/programs/localedef.c:125 +msgid "Create output even if warning messages were issued" +msgstr "إنشاء المخرجات حتى لو صدرت رسائل تحذير" + +#: locale/programs/localedef.c:127 +msgid "Do not create hard links between installed locales" +msgstr "لا تنشئ روابط صلبة بين المحلات المثبتة" + +#: locale/programs/localedef.c:128 +msgid "Optional output file prefix" +msgstr "بادئة ملف مخرجات اختيارية" + +#: locale/programs/localedef.c:129 +msgid "Strictly conform to POSIX" +msgstr "الالتزام الصارم بمعيار POSIX" + +#: locale/programs/localedef.c:131 +msgid "Suppress warnings and information messages" +msgstr "كتم التحذيرات ورسائل المعلومات" + +#: locale/programs/localedef.c:132 +msgid "Print more messages" +msgstr "طباعة المزيد من الرسائل" + +#: locale/programs/localedef.c:133 locale/programs/localedef.c:136 +msgid "" +msgstr "<تحذيرات>" + +#: locale/programs/localedef.c:134 +msgid "Comma-separated list of warnings to disable; supported warnings are: ascii, intcurrsym" +msgstr "قائمة تحذيرات مفصولة بفواصل لتعطيلها؛ التحذيرات المدعومة هي: ascii, intcurrsym" + +#: locale/programs/localedef.c:137 +msgid "Comma-separated list of warnings to enable; supported warnings are: ascii, intcurrsym" +msgstr "قائمة تحذيرات مفصولة بفواصل لتمكينها؛ التحذيرات المدعومة هي: ascii, intcurrsym" + +#: locale/programs/localedef.c:140 +msgid "Archive control:" +msgstr "التحكم في الأرشيف:" + +#: locale/programs/localedef.c:142 +msgid "Don't add new data to archive" +msgstr "لا تضف بيانات جديدة للأرشيف" + +#: locale/programs/localedef.c:144 +msgid "Add locales named by parameters to archive" +msgstr "إضافة المحلات المسماة بالمعاملات إلى الأرشيف" + +#: locale/programs/localedef.c:145 +msgid "Replace existing archive content" +msgstr "استبدال محتوى الأرشيف الموجود" + +#: locale/programs/localedef.c:147 +msgid "Remove locales named by parameters from archive" +msgstr "إزالة المحلات المسماة بالمعاملات من الأرشيف" + +#: locale/programs/localedef.c:148 +msgid "List content of archive" +msgstr "سرد محتوى الأرشيف" + +#: locale/programs/localedef.c:150 +msgid "locale.alias file to consult when making archive" +msgstr "ملف locale.alias للاستشارة عند إنشاء الأرشيف" + +#: locale/programs/localedef.c:152 +msgid "Generate little-endian output" +msgstr "توليد مخرجات بنهاية صغرى (little-endian)" + +#: locale/programs/localedef.c:154 +msgid "Generate big-endian output" +msgstr "توليد مخرجات بنهاية كبرى (big-endian)" + +#: locale/programs/localedef.c:159 +msgid "Compile locale specification" +msgstr "ترجمة مواصفات المحل" + +#: locale/programs/localedef.c:162 +msgid "" +"NAME\n" +"[--add-to-archive|--delete-from-archive] FILE...\n" +"--list-archive [FILE]" +msgstr "" +"الاسم\n" +"[--add-to-archive|--delete-from-archive] ملف...\n" +"--list-archive [ملف]" + +#: locale/programs/localedef.c:238 +#, c-format +msgid "cannot create directory for output files" +msgstr "لا يمكن إنشاء دليل لملفات المخرجات" + +#: locale/programs/localedef.c:249 +msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'" +msgstr "فادح: النظام لا يعرف `_POSIX2_LOCALEDEF'" + +#: locale/programs/localedef.c:263 locale/programs/localedef.c:279 +#: locale/programs/localedef.c:677 locale/programs/localedef.c:697 +#, c-format +msgid "cannot open locale definition file `%s'" +msgstr "لا يمكن فتح ملف تعريف المحل `%s'" + +#: locale/programs/localedef.c:303 +#, c-format +msgid "cannot write output files to `%s'" +msgstr "لا يمكن كتابة ملفات المخرجات إلى `%s'" + +#: locale/programs/localedef.c:309 +msgid "no output file produced because errors were issued" +msgstr "لم ينتج ملف مخرجات بسبب صدور أخطاء" + +#: locale/programs/localedef.c:440 +#, c-format +msgid "" +"System's directory for character maps : %s\n" +"\t\t repertoire maps: %s\n" +"\t\t locale path : %s\n" +"%s" +msgstr "" +"دليل النظام لخرائط المحارف : %s\n" +"\t\t خرائط الذخيرة: %s\n" +"\t\t مسار المحل : %s\n" +"%s" + +#: locale/programs/localedef.c:545 +#, c-format +msgid "cannot create output path '%s': %s" +msgstr "لا يمكن إنشاء مسار المخرجات '%s': %s" + +#: locale/programs/localedef.c:553 +#, c-format +msgid "no write permission to output path '%s': %s" +msgstr "لا يوجد إذن كتابة لمسار المخرجات '%s': %s" + +#: locale/programs/localedef.c:645 +msgid "circular dependencies between locale definitions" +msgstr "تبعيات دائرية بين تعريفات المحلات" + +#: locale/programs/localedef.c:651 +#, c-format +msgid "cannot add already read locale `%s' a second time" +msgstr "لا يمكن إضافة المحل المقروء مسبقاً `%s' مرة ثانية" + +#: locale/programs/locarchive.c:132 locale/programs/locarchive.c:379 +#, c-format +msgid "cannot create temporary file: %s" +msgstr "لا يمكن إنشاء ملف مؤقت: %s" + +#: locale/programs/locarchive.c:166 locale/programs/locarchive.c:429 +#, c-format +msgid "cannot initialize archive file" +msgstr "لا يمكن تهيئة ملف الأرشيف" + +#: locale/programs/locarchive.c:173 locale/programs/locarchive.c:436 +#, c-format +msgid "cannot resize archive file" +msgstr "لا يمكن تغيير حجم ملف الأرشيف" + +#: locale/programs/locarchive.c:188 locale/programs/locarchive.c:451 +#: locale/programs/locarchive.c:686 +#, c-format +msgid "cannot map archive header" +msgstr "لا يمكن مسح ترويسة الأرشيف" + +#: locale/programs/locarchive.c:210 +#, c-format +msgid "failed to create new locale archive" +msgstr "فشل إنشاء أرشيف محل جديد" + +#: locale/programs/locarchive.c:222 +#, c-format +msgid "cannot change mode of new locale archive" +msgstr "لا يمكن تغيير نمط أرشيف المحل الجديد" + +#: locale/programs/locarchive.c:323 +msgid "cannot read data from locale archive" +msgstr "لا يمكن قراءة البيانات من أرشيف المحل" + +#: locale/programs/locarchive.c:354 +#, c-format +msgid "cannot map locale archive file" +msgstr "لا يمكن مسح ملف أرشيف المحل" + +#: locale/programs/locarchive.c:459 +#, c-format +msgid "cannot lock new archive" +msgstr "لا يمكن قفل الأرشيف الجديد" + +#: locale/programs/locarchive.c:528 +#, c-format +msgid "cannot extend locale archive file" +msgstr "لا يمكن تمديد ملف أرشيف المحل" + +#: locale/programs/locarchive.c:537 +#, c-format +msgid "cannot change mode of resized locale archive" +msgstr "لا يمكن تغيير نمط أرشيف المحل الذي غيّر حجمه" + +#: locale/programs/locarchive.c:545 +#, c-format +msgid "cannot rename new archive" +msgstr "لا يمكن إعادة تسمية الأرشيف الجديد" + +#: locale/programs/locarchive.c:607 +#, c-format +msgid "cannot open locale archive \"%s\"" +msgstr "لا يمكن فتح أرشيف المحل \"%s\"" + +#: locale/programs/locarchive.c:612 +#, c-format +msgid "cannot stat locale archive \"%s\"" +msgstr "لا يمكن فحص (stat) أرشيف المحل \"%s\"" + +#: locale/programs/locarchive.c:631 +#, c-format +msgid "cannot lock locale archive \"%s\"" +msgstr "لا يمكن قفل أرشيف المحل \"%s\"" + +#: locale/programs/locarchive.c:642 locale/programs/locarchive.c:656 +#: locale/programs/locarchive.c:664 locale/programs/locarchive.c:685 +#, c-format +msgid "cannot unlock archive header" +msgstr "لا يمكن إلغاء قفل ترويسة الأرشيف" + +#: locale/programs/locarchive.c:657 +#, c-format +msgid "cannot read archive header" +msgstr "لا يمكن قراءة ترويسة الأرشيف" + +#: locale/programs/locarchive.c:665 +#, c-format +msgid "bad magic value in archive header" +msgstr "قيمة سحرية سيئة في ترويسة الأرشيف" + +#: locale/programs/locarchive.c:740 +#, c-format +msgid "locale '%s' already exists" +msgstr "المحل '%s' موجود مسبقاً" + +#: locale/programs/locarchive.c:1015 locale/programs/locarchive.c:1030 +#: locale/programs/locarchive.c:1042 locale/programs/locarchive.c:1054 +#: locale/programs/locfile.c:349 +#, c-format +msgid "cannot add to locale archive" +msgstr "لا يمكن الإضافة إلى أرشيف المحل" + +#: locale/programs/locarchive.c:1223 +#, c-format +msgid "locale alias file `%s' not found" +msgstr "ملف اسم مستعار المحل `%s' غير موجود" + +#: locale/programs/locarchive.c:1371 +#, c-format +msgid "Adding %s\n" +msgstr "إضافة %s\n" + +#: locale/programs/locarchive.c:1377 +#, c-format +msgid "stat of \"%s\" failed: %s: ignored" +msgstr "فشل فحص (stat) لـ \"%s\": %s: تم تجاهله" + +#: locale/programs/locarchive.c:1383 +#, c-format +msgid "\"%s\" is no directory; ignored" +msgstr "\"%s\" ليس دليلاً؛ تم تجاهله" + +#: locale/programs/locarchive.c:1390 +#, c-format +msgid "cannot open directory \"%s\": %s: ignored" +msgstr "لا يمكن فتح الدليل \"%s\": %s: تم تجاهله" + +#: locale/programs/locarchive.c:1458 +#, c-format +msgid "incomplete set of locale files in \"%s\"" +msgstr "مجموعة غير مكتملة من ملفات المحل في \"%s\"" + +#: locale/programs/locarchive.c:1522 +#, c-format +msgid "cannot read all files in \"%s\": ignored" +msgstr "لا يمكن قراءة جميع الملفات في \"%s\": تم تجاهله" + +#: locale/programs/locarchive.c:1592 +#, c-format +msgid "locale \"%s\" not in archive" +msgstr "المحل \"%s\" ليس في الأرشيف" + +#: locale/programs/locfile.c:136 +#, c-format +msgid "argument to `%s' must be a single character" +msgstr "يجب أن يكون المعامل لـ `%s' محرفاً واحداً" + +#: locale/programs/locfile.c:256 +msgid "syntax error: not inside a locale definition section" +msgstr "خطأ في بناء الجملة: ليس داخل مقطع تعريف محل" + +#: locale/programs/locfile.c:798 +#, c-format +msgid "cannot open output file `%s' for category `%s'" +msgstr "لا يمكن فتح ملف المخرجات `%s' للفئة `%s'" + +#: locale/programs/locfile.c:821 +#, c-format +msgid "failure while writing data for category `%s'" +msgstr "فشل أثناء كتابة البيانات للفئة `%s'" + +#: locale/programs/locfile.c:929 +#, c-format +msgid "cannot create output file `%s' for category `%s'" +msgstr "لا يمكن إنشاء ملف المخرجات `%s' للفئة `%s'" + +#: locale/programs/locfile.c:965 +msgid "expecting string argument for `copy'" +msgstr "يتوقع معامل سلسلة لـ `copy'" + +#: locale/programs/locfile.c:969 +msgid "locale name should consist only of portable characters" +msgstr "يجب أن يتكون اسم المحل من محارف محمولة فقط" + +#: locale/programs/locfile.c:988 +msgid "no other keyword shall be specified when `copy' is used" +msgstr "يجب عدم تحديد أي كلمة مفتاحية أخرى عند استخدام `copy'" + +#: locale/programs/locfile.c:1002 +#, c-format +msgid "`%1$s' definition does not end with `END %1$s'" +msgstr "تعريف `%1$s' لا ينتهي بـ `END %1$s'" + +#: locale/programs/repertoire.c:227 locale/programs/repertoire.c:268 +#: locale/programs/repertoire.c:293 +#, c-format +msgid "syntax error in repertoire map definition: %s" +msgstr "خطأ في بناء الجملة في تعريف خارطة الذخيرة: %s" + +#: locale/programs/repertoire.c:269 +msgid "no or value given" +msgstr "لم تعطَ قيمة أو " + +#: locale/programs/repertoire.c:329 +msgid "cannot save new repertoire map" +msgstr "لا يمكن حفظ خارطة ذخيرة جديدة" + +#: locale/programs/repertoire.c:340 +#, c-format +msgid "repertoire map file `%s' not found" +msgstr "ملف خارطة الذخيرة `%s' غير موجود" + +#: login/programs/pt_chown.c:78 +#, c-format +msgid "Set the owner, group and access permission of the slave pseudo terminal corresponding to the master pseudo terminal passed on file descriptor `%d'. This is the helper program for the `grantpt' function. It is not intended to be run directly from the command line.\n" +msgstr "ضبط المالك والمجموعة وإذن الوصول للطرفية الوهمية التابعة المقابلة للطرفية الوهمية الرئيسية الممرة في واصف الملف `%d'. هذا برنامج مساعد لوظيفة `grantpt'. ليس من المقصود تشغيله مباشرة من سطر الأوامر.\n" + +#: login/programs/pt_chown.c:92 +#, c-format +msgid "" +"The owner is set to the current user, the group is set to `%s', and the access permission is set to `%o'.\n" +"\n" +"%s" +msgstr "" +"المالك مضبوط إلى المستخدم الحالي، والمجموعة مضبوطة إلى `%s'، وإذن الوصول مضبوط إلى `%o'.\n" +"\n" +"%s" + +#: login/programs/pt_chown.c:203 +#, c-format +msgid "too many arguments" +msgstr "معاملات كثيرة جداً" + +#: login/programs/pt_chown.c:211 +#, c-format +msgid "needs to be installed setuid `root'" +msgstr "يحتاج إلى التثبيت بـ setuid `root'" + +#: malloc/mcheck-impl.c:354 +msgid "memory is consistent, library is buggy\n" +msgstr "الذاكرة متسقة، المكتبة بها علل\n" + +#: malloc/mcheck-impl.c:357 +msgid "memory clobbered before allocated block\n" +msgstr "الذاكرة تضررت قبل الكتلة المخصصة\n" + +#: malloc/mcheck-impl.c:360 +msgid "memory clobbered past end of allocated block\n" +msgstr "الذاكرة تضررت بعد نهاية الكتلة المخصصة\n" + +#: malloc/mcheck-impl.c:363 +msgid "block freed twice\n" +msgstr "تم تحرير الكتلة مرتين\n" + +#: malloc/mcheck-impl.c:366 +msgid "bogus mcheck_status, library is buggy\n" +msgstr "حالة mcheck_status زائفة، المكتبة بها علل\n" + +#: malloc/memusage.sh:31 +msgid "%s: option '%s' requires an argument\\n" +msgstr "%s: الخيار '%s' يتطلب معامل\\n" + +#: malloc/memusage.sh:37 +msgid "" +"Usage: memusage [OPTION]... PROGRAM [PROGRAMOPTION]...\n" +"Profile memory usage of PROGRAM.\n" +"\n" +" -n,--progname=NAME Name of the program file to profile\n" +" -p,--png=FILE Generate PNG graphic and store it in FILE\n" +" -d,--data=FILE Generate binary data file and store it in FILE\n" +" -u,--unbuffered Don't buffer output\n" +" -b,--buffer=SIZE Collect SIZE entries before writing them out\n" +" --no-timer Don't collect additional information through timer\n" +" -m,--mmap Also trace mmap & friends\n" +"\n" +" -?,--help Print this help and exit\n" +" --usage Give a short usage message\n" +" -V,--version Print version information and exit\n" +"\n" +" The following options only apply when generating graphical output:\n" +" -t,--time-based Make graph linear in time\n" +" -T,--total Also draw graph of total memory use\n" +" --title=STRING Use STRING as title of the graph\n" +" -x,--x-size=SIZE Make graphic SIZE pixels wide\n" +" -y,--y-size=SIZE Make graphic SIZE pixels high\n" +"\n" +"Mandatory arguments to long options are also mandatory for any corresponding\n" +"short options.\n" +"\n" +msgstr "" +"الاستخدام: memusage [خيار]... البرنامج [خيار-البرنامج]...\n" +"توليد تشكيلة استخدام الذاكرة للبرنامج.\n" +"\n" +" -n,--progname=NAME اسم ملف البرنامج لتوليد تشكيلة له\n" +" -p,--png=FILE توليد رسم PNG وتخزينه في FILE\n" +" -d,--data=FILE توليد ملف بيانات ثنائي وتخزينه في FILE\n" +" -u,--unbuffered لا تضع المخرجات في ذاكرة وسيطة\n" +" -b,--buffer=SIZE جمع SIZE مدخلات قبل كتابتها\n" +" --no-timer لا تجمع معلومات إضافية عبر المؤقت\n" +" -m,--mmap تتبع أيضاً mmap وأخواتها\n" +"\n" +" -?,--help طباعة هذه المساعدة والخروج\n" +" --usage إعطاء رسالة استخدام قصيرة\n" +" -V,--version طباعة معلومات الإصدار والخروج\n" +"\n" +" الخيارات التالية تنطبق فقط عند توليد مخرجات رسومية:\n" +" -t,--time-based جعل الرسم بيانياً خطياً في الزمن\n" +" -T,--total رسم بياني أيضاً لإجمالي استخدام الذاكرة\n" +" --title=STRING استخدام STRING كعنوان للرسم البياني\n" +" -x,--x-size=SIZE جعل عرض الرسم SIZE بكسل\n" +" -y,--y-size=SIZE جعل ارتفاع الرسم SIZE بكسل\n" +"\n" +"المعاملات الإلزامية للخيارات الطويلة هي إلزامية أيضاً للخيارات القصيرة المقابلة.\n" +"\n" + +#: malloc/memusage.sh:98 +msgid "" +"Syntax: memusage [--data=FILE] [--progname=NAME] [--png=FILE] [--unbuffered]\n" +"\t [--buffer=SIZE] [--no-timer] [--time-based] [--total]\n" +"\t [--title=STRING] [--x-size=SIZE] [--y-size=SIZE]\n" +"\t PROGRAM [PROGRAMOPTION]..." +msgstr "" +"بناء الجملة: memusage [--data=ملف] [--progname=اسم] [--png=ملف] [--unbuffered]\n" +"\t [--buffer=حجم] [--no-timer] [--time-based] [--total]\n" +"\t [--title=سلسلة] [--x-size=حجم] [--y-size=حجم]\n" +"\t البرنامج [خيار-البرنامج]..." + +#: malloc/memusage.sh:190 +msgid "memusage: option \\`${1##*=}' is ambiguous" +msgstr "memusage: الخيار \\`${1##*=}' غامض" + +#: malloc/memusage.sh:199 +msgid "memusage: unrecognized option \\`$1'" +msgstr "memusage: خيار غير معروف \\`$1'" + +#: malloc/memusage.sh:212 +msgid "No program name given" +msgstr "لم يعطَ اسم برنامج" + +#: malloc/memusagestat.c:56 +msgid "Name output file" +msgstr "تسمية ملف المخرجات" + +#: malloc/memusagestat.c:57 +msgid "STRING" +msgstr "سلسلة" + +#: malloc/memusagestat.c:57 +msgid "Title string used in output graphic" +msgstr "سلسلة العنوان المستخدمة في الرسم البياني المخرج" + +#: malloc/memusagestat.c:58 +msgid "Generate output linear to time (default is linear to number of function calls)" +msgstr "توليد مخرجات خطية للزمن (المبدئي خطي لعدد استدعاءات الدالة)" + +#: malloc/memusagestat.c:62 +msgid "Also draw graph for total memory consumption" +msgstr "رسم بياني أيضاً لإجمالي استهلاك الذاكرة" + +#: malloc/memusagestat.c:63 +msgid "VALUE" +msgstr "قيمة" + +#: malloc/memusagestat.c:64 +msgid "Make output graphic VALUE pixels wide" +msgstr "جعل عرض الرسم المخرج VALUE بكسل" + +#: malloc/memusagestat.c:65 +msgid "Make output graphic VALUE pixels high" +msgstr "جعل ارتفاع الرسم المخرج VALUE بكسل" + +#: malloc/memusagestat.c:70 +msgid "Generate graphic from memory profiling data" +msgstr "توليد رسم بياني من بيانات تشكيلة الذاكرة" + +#: malloc/memusagestat.c:73 +msgid "DATAFILE [OUTFILE]" +msgstr "ملف-بيانات [ملف-مخرجات]" + +#: misc/error.c:192 +msgid "Unknown system error" +msgstr "خطأ نظام مجهول" + +#: nis/nis_callback.c:187 +msgid "unable to free arguments" +msgstr "غير قادر على تحرير المعاملات" + +#: nis/nis_error.h:1 nis/ypclnt.c:832 nis/ypclnt.c:921 posix/regcomp.c:135 +#: sysdeps/gnu/errlist.h:1 sysdeps/posix/gai_strerror-strs.h:1 +msgid "Success" +msgstr "نجاح" + +#: nis/nis_error.h:2 +msgid "Probable success" +msgstr "نجاح محتمل" + +#: nis/nis_error.h:3 +msgid "Not found" +msgstr "لم يُعثر عليه" + +#: nis/nis_error.h:4 +msgid "Probably not found" +msgstr "غالباً لم يُعثر عليه" + +#: nis/nis_error.h:5 +msgid "Cache expired" +msgstr "انتهت صلاحية الخبيئة" + +#: nis/nis_error.h:6 +msgid "NIS+ servers unreachable" +msgstr "لا يمكن الوصول لخوادم NIS+" + +#: nis/nis_error.h:7 +msgid "Unknown object" +msgstr "كائن مجهول" + +#: nis/nis_error.h:8 +msgid "Server busy, try again" +msgstr "الخادم مشغول، حاول ثانية" + +#: nis/nis_error.h:9 +msgid "Generic system error" +msgstr "خطأ نظام عام" + +#: nis/nis_error.h:10 +msgid "First/next chain broken" +msgstr "سلسلة الأول/التالي مكسورة" + +#. TRANS The file permissions do not allow the attempted operation. +#: nis/nis_error.h:11 nis/ypclnt.c:877 sysdeps/gnu/errlist.h:90 +msgid "Permission denied" +msgstr "الإذن مرفوض" + +#: nis/nis_error.h:12 +msgid "Not owner" +msgstr "ليس المالك" + +#: nis/nis_error.h:13 +msgid "Name not served by this server" +msgstr "الاسم لا يخدمه هذا الخادم" + +#: nis/nis_error.h:14 +msgid "Server out of memory" +msgstr "نفدت ذاكرة الخادم" + +#: nis/nis_error.h:15 +msgid "Object with same name exists" +msgstr "يوجد كائن بالاسم ذاته" + +#: nis/nis_error.h:16 +msgid "Not master server for this domain" +msgstr "ليس الخادم الرئيسي لهذا النطاق" + +#: nis/nis_error.h:17 +msgid "Invalid object for operation" +msgstr "كائن غير صالح للعملية" + +#: nis/nis_error.h:18 +msgid "Malformed name, or illegal name" +msgstr "اسم مشوه، أو اسم غير قانوني" + +#: nis/nis_error.h:19 +msgid "Unable to create callback" +msgstr "غير قادر على إنشاء استدعاء راجع" + +#: nis/nis_error.h:20 +msgid "Results sent to callback proc" +msgstr "أرسلت النتائج إلى إجراء الاستدعاء الراجع" + +#: nis/nis_error.h:21 +msgid "Not found, no such name" +msgstr "لم يُعثر عليه، لا يوجد اسم كهذا" + +#: nis/nis_error.h:22 +msgid "Name/entry isn't unique" +msgstr "الاسم/المدخل ليس فريداً" + +#: nis/nis_error.h:23 +msgid "Modification failed" +msgstr "فشل التعديل" + +#: nis/nis_error.h:24 +msgid "Database for table does not exist" +msgstr "قاعدة بيانات الجدول غير موجودة" + +#: nis/nis_error.h:25 +msgid "Entry/table type mismatch" +msgstr "عدم تطابق نوع المدخل/الجدول" + +#: nis/nis_error.h:26 +msgid "Link points to illegal name" +msgstr "الرابط يشير إلى اسم غير قانوني" + +#: nis/nis_error.h:27 +msgid "Partial success" +msgstr "نجاح جزئي" + +#: nis/nis_error.h:28 +msgid "Too many attributes" +msgstr "سمات كثيرة جداً" + +#: nis/nis_error.h:29 +msgid "Error in RPC subsystem" +msgstr "خطأ في نظام RPC الفرعي" + +#: nis/nis_error.h:30 +msgid "Missing or malformed attribute" +msgstr "سمة مفقودة أو مشوهة" + +#: nis/nis_error.h:31 +msgid "Named object is not searchable" +msgstr "الكائن المسمى غير قابل للبحث" + +#: nis/nis_error.h:32 +msgid "Error while talking to callback proc" +msgstr "خطأ أثناء التحدث مع إجراء الاستدعاء الراجع" + +#: nis/nis_error.h:33 +msgid "Non NIS+ namespace encountered" +msgstr "واجه مساحة أسماء ليست NIS+" + +#: nis/nis_error.h:34 +msgid "Illegal object type for operation" +msgstr "نوع كائن غير قانوني للعملية" + +#: nis/nis_error.h:35 +msgid "Passed object is not the same object on server" +msgstr "الكائن الممر ليس هو الكائن ذاته على الخادم" + +#: nis/nis_error.h:36 +msgid "Modify operation failed" +msgstr "فشلت عملية التعديل" + +#: nis/nis_error.h:37 +msgid "Query illegal for named table" +msgstr "استعلام غير قانوني للجدول المسمى" + +#: nis/nis_error.h:38 +msgid "Attempt to remove a non-empty table" +msgstr "محاولة إزالة جدول غير فارغ" + +#: nis/nis_error.h:39 +msgid "Error in accessing NIS+ cold start file. Is NIS+ installed?" +msgstr "خطأ في الوصول إلى ملف البدء البارد لـ NIS+. هل NIS+ مثبت؟" + +#: nis/nis_error.h:40 +msgid "Full resync required for directory" +msgstr "مزامنة كاملة مطلوبة للدليل" + +#: nis/nis_error.h:41 +msgid "NIS+ operation failed" +msgstr "فشلت عملية NIS+" + +#: nis/nis_error.h:42 +msgid "NIS+ service is unavailable or not installed" +msgstr "خدمة NIS+ غير متاحة أو غير مثبتة" + +#: nis/nis_error.h:43 +msgid "Yes, 42 is the meaning of life" +msgstr "نعم، 42 هي معنى الحياة" + +#: nis/nis_error.h:44 +msgid "Unable to authenticate NIS+ server" +msgstr "غير قادر على إجراء الاستيثاق لخادم NIS+" + +#: nis/nis_error.h:45 +msgid "Unable to authenticate NIS+ client" +msgstr "غير قادر على إجراء الاستيثاق لعميل NIS+" + +#: nis/nis_error.h:46 +msgid "No file space on server" +msgstr "لا توجد مساحة ملفات على الخادم" + +#: nis/nis_error.h:47 +msgid "Unable to create process on server" +msgstr "غير قادر على إنشاء عملية على الخادم" + +#: nis/nis_error.h:48 +msgid "Master server busy, full dump rescheduled." +msgstr "الخادم الرئيسي مشغول، أعيدت جدولة التفريغ الكامل." + +#: nis/nis_local_names.c:122 +#, c-format +msgid "LOCAL entry for UID %d in directory %s not unique\n" +msgstr "مدخل LOCAL لـ UID %d في الدليل %s ليس فريداً\n" + +#: nis/nis_print.c:51 +msgid "UNKNOWN" +msgstr "مجهول" + +#: nis/nis_print.c:61 +msgid "BOGUS OBJECT" +msgstr "كائن زائف" + +#: nis/nis_print.c:63 +msgid "NO OBJECT" +msgstr "لا كائن" + +#: nis/nis_print.c:65 +msgid "DIRECTORY" +msgstr "دليل" + +#: nis/nis_print.c:67 +msgid "GROUP" +msgstr "مجموعة" + +#: nis/nis_print.c:69 nscd/nscd.c:117 +msgid "TABLE" +msgstr "جدول" + +#: nis/nis_print.c:71 +msgid "ENTRY" +msgstr "مدخل" + +#: nis/nis_print.c:73 +msgid "LINK" +msgstr "رابط" + +#: nis/nis_print.c:75 +msgid "PRIVATE\n" +msgstr "خاص\n" + +#: nis/nis_print.c:77 +msgid "(Unknown object" +msgstr "(كائن مجهول" + +#: nis/nis_print.c:164 +#, c-format +msgid "Name : `%s'\n" +msgstr "الاسم : `%s'\n" + +#: nis/nis_print.c:165 +#, c-format +msgid "Type : %s\n" +msgstr "النوع : %s\n" + +#: nis/nis_print.c:170 +msgid "Master Server :\n" +msgstr "الخادم الرئيسي :\n" + +#: nis/nis_print.c:172 +msgid "Replicate :\n" +msgstr "نسخة مكررة :\n" + +#: nis/nis_print.c:173 +#, c-format +msgid "\tName : %s\n" +msgstr "\tالاسم : %s\n" + +#: nis/nis_print.c:174 +msgid "\tPublic Key : " +msgstr "\tالمفتاح العام : " + +#: nis/nis_print.c:178 +msgid "None.\n" +msgstr "لا شيء.\n" + +#: nis/nis_print.c:181 +#, c-format +msgid "Diffie-Hellmann (%d bits)\n" +msgstr "ديفي-هيلمان (%d بت)\n" + +#: nis/nis_print.c:186 +#, c-format +msgid "RSA (%d bits)\n" +msgstr "آر إس إيه (%d بت)\n" + +#: nis/nis_print.c:189 +msgid "Kerberos.\n" +msgstr "كيربيروس.\n" + +#: nis/nis_print.c:192 +#, c-format +msgid "Unknown (type = %d, bits = %d)\n" +msgstr "مجهول (النوع = %d، البتات = %d)\n" + +#: nis/nis_print.c:203 +#, c-format +msgid "\tUniversal addresses (%u)\n" +msgstr "\tعناوين عالمية (%u)\n" + +#: nis/nis_print.c:225 +msgid "Time to live : " +msgstr "زمن الحياة : " + +#: nis/nis_print.c:227 +msgid "Default Access rights :\n" +msgstr "حقوق الوصول المبدئية :\n" + +#: nis/nis_print.c:236 +#, c-format +msgid "\tType : %s\n" +msgstr "\tالنوع : %s\n" + +#: nis/nis_print.c:237 +msgid "\tAccess rights: " +msgstr "\tحقوق الوصول: " + +#: nis/nis_print.c:251 +msgid "Group Flags :" +msgstr "أعلام المجموعة :" + +#: nis/nis_print.c:254 +msgid "" +"\n" +"Group Members :\n" +msgstr "" +"\n" +"أعضاء المجموعة :\n" + +#: nis/nis_print.c:266 +#, c-format +msgid "Table Type : %s\n" +msgstr "نوع الجدول : %s\n" + +#: nis/nis_print.c:267 +#, c-format +msgid "Number of Columns : %d\n" +msgstr "عدد الأعمدة : %d\n" + +#: nis/nis_print.c:268 +#, c-format +msgid "Character Separator : %c\n" +msgstr "فاصل المحارف : %c\n" + +#: nis/nis_print.c:269 +#, c-format +msgid "Search Path : %s\n" +msgstr "مسار البحث : %s\n" + +#: nis/nis_print.c:270 +msgid "Columns :\n" +msgstr "الأعمدة :\n" + +#: nis/nis_print.c:273 +#, c-format +msgid "\t[%d]\tName : %s\n" +msgstr "\t[%d]\tالاسم : %s\n" + +#: nis/nis_print.c:275 +msgid "\t\tAttributes : " +msgstr "\t\tالسمات : " + +#: nis/nis_print.c:277 +msgid "\t\tAccess Rights : " +msgstr "\t\tحقوق الوصول : " + +#: nis/nis_print.c:287 +msgid "Linked Object Type : " +msgstr "نوع الكائن المرتبط : " + +#: nis/nis_print.c:289 +#, c-format +msgid "Linked to : %s\n" +msgstr "مرتبط بـ : %s\n" + +#: nis/nis_print.c:299 +#, c-format +msgid "\tEntry data of type %s\n" +msgstr "\tبيانات المدخل من النوع %s\n" + +#: nis/nis_print.c:302 +#, c-format +msgid "\t[%u] - [%u bytes] " +msgstr "\t[%u] - [%u بايت] " + +#: nis/nis_print.c:305 +msgid "Encrypted data\n" +msgstr "بيانات مشفرة\n" + +#: nis/nis_print.c:307 +msgid "Binary data\n" +msgstr "بيانات ثنائية\n" + +#: nis/nis_print.c:323 +#, c-format +msgid "Object Name : %s\n" +msgstr "اسم الكائن : %s\n" + +#: nis/nis_print.c:324 +#, c-format +msgid "Directory : %s\n" +msgstr "الدليل : %s\n" + +#: nis/nis_print.c:325 +#, c-format +msgid "Owner : %s\n" +msgstr "المالك : %s\n" + +#: nis/nis_print.c:326 +#, c-format +msgid "Group : %s\n" +msgstr "المجموعة : %s\n" + +#: nis/nis_print.c:327 +msgid "Access Rights : " +msgstr "حقوق الوصول : " + +#: nis/nis_print.c:329 +#, c-format +msgid "" +"\n" +"Time to Live : " +msgstr "" +"\n" +"زمن الحياة : " + +#: nis/nis_print.c:332 +#, c-format +msgid "Creation Time : %s" +msgstr "وقت الإنشاء : %s" + +#: nis/nis_print.c:334 +#, c-format +msgid "Mod. Time : %s" +msgstr "وقت التعديل : %s" + +#: nis/nis_print.c:335 +msgid "Object Type : " +msgstr "نوع الكائن : " + +#: nis/nis_print.c:355 +#, c-format +msgid " Data Length = %u\n" +msgstr " طول البيانات = %u\n" + +#: nis/nis_print.c:369 +#, c-format +msgid "Status : %s\n" +msgstr "الحالة : %s\n" + +#: nis/nis_print.c:370 +#, c-format +msgid "Number of objects : %u\n" +msgstr "عدد الكائنات : %u\n" + +#: nis/nis_print.c:374 +#, c-format +msgid "Object #%d:\n" +msgstr "كائن رقم %d:\n" + +#: nis/nis_print_group_entry.c:116 +#, c-format +msgid "Group entry for \"%s.%s\" group:\n" +msgstr "مدخل مجموعة لمجموعة \"%s.%s\":\n" + +#: nis/nis_print_group_entry.c:124 +msgid " Explicit members:\n" +msgstr " أعضاء صريحون:\n" + +#: nis/nis_print_group_entry.c:129 +msgid " No explicit members\n" +msgstr " لا يوجد أعضاء صريحون\n" + +#: nis/nis_print_group_entry.c:132 +msgid " Implicit members:\n" +msgstr " أعضاء ضمنيون:\n" + +#: nis/nis_print_group_entry.c:137 +msgid " No implicit members\n" +msgstr " لا يوجد أعضاء ضمنيون\n" + +#: nis/nis_print_group_entry.c:140 +msgid " Recursive members:\n" +msgstr " أعضاء متكررون:\n" + +#: nis/nis_print_group_entry.c:145 +msgid " No recursive members\n" +msgstr " لا يوجد أعضاء متكررون\n" + +#: nis/nis_print_group_entry.c:148 +msgid " Explicit nonmembers:\n" +msgstr " غير أعضاء صريحون:\n" + +#: nis/nis_print_group_entry.c:153 +msgid " No explicit nonmembers\n" +msgstr " لا يوجد غير أعضاء صريحون\n" + +#: nis/nis_print_group_entry.c:156 +msgid " Implicit nonmembers:\n" +msgstr " غير أعضاء ضمنيون:\n" + +#: nis/nis_print_group_entry.c:161 +msgid " No implicit nonmembers\n" +msgstr " لا يوجد غير أعضاء ضمنيون\n" + +#: nis/nis_print_group_entry.c:164 +msgid " Recursive nonmembers:\n" +msgstr " غير أعضاء متكررون:\n" + +#: nis/nis_print_group_entry.c:169 +msgid " No recursive nonmembers\n" +msgstr " لا يوجد غير أعضاء متكررون\n" + +#: nis/ypclnt.c:835 +msgid "Request arguments bad" +msgstr "معاملات الطلب سيئة" + +#: nis/ypclnt.c:838 +msgid "RPC failure on NIS operation" +msgstr "فشل RPC في عملية NIS" + +#: nis/ypclnt.c:841 +msgid "Can't bind to server which serves this domain" +msgstr "لا يمكن الربط بالخادم الذي يخدم هذا النطاق" + +#: nis/ypclnt.c:844 +msgid "No such map in server's domain" +msgstr "لا توجد خارطة كهذه في نطاق الخادم" + +#: nis/ypclnt.c:847 +msgid "No such key in map" +msgstr "لا يوجد مفتاح كهذا في الخارطة" + +#: nis/ypclnt.c:850 +msgid "Internal NIS error" +msgstr "خطأ NIS داخلي" + +#: nis/ypclnt.c:853 +msgid "Local resource allocation failure" +msgstr "فشل تخصيص الموارد المحلية" + +#: nis/ypclnt.c:856 +msgid "No more records in map database" +msgstr "لا توجد سجلات أخرى في قاعدة بيانات الخارطة" + +#: nis/ypclnt.c:859 +msgid "Can't communicate with portmapper" +msgstr "لا يمكن التواصل مع portmapper" + +#: nis/ypclnt.c:862 +msgid "Can't communicate with ypbind" +msgstr "لا يمكن التواصل مع ypbind" + +#: nis/ypclnt.c:865 +msgid "Can't communicate with ypserv" +msgstr "لا يمكن التواصل مع ypserv" + +#: nis/ypclnt.c:868 +msgid "Local domain name not set" +msgstr "اسم النطاق المحلي غير مضبوط" + +#: nis/ypclnt.c:871 +msgid "NIS map database is bad" +msgstr "قاعدة بيانات خارطة NIS سيئة" + +#: nis/ypclnt.c:874 +msgid "NIS client/server version mismatch - can't supply service" +msgstr "عدم تطابق إصدار عميل/خادم NIS - لا يمكن تقديم الخدمة" + +#: nis/ypclnt.c:880 +msgid "Database is busy" +msgstr "قاعدة البيانات مشغولة" + +#: nis/ypclnt.c:883 +msgid "Unknown NIS error code" +msgstr "رمز خطأ NIS مجهول" + +#: nis/ypclnt.c:924 +msgid "Internal ypbind error" +msgstr "خطأ ypbind داخلي" + +#: nis/ypclnt.c:927 +msgid "Domain not bound" +msgstr "النطاق غير مربوط" + +#: nis/ypclnt.c:930 +msgid "System resource allocation failure" +msgstr "فشل تخصيص موارد النظام" + +#: nis/ypclnt.c:933 +msgid "Unknown ypbind error" +msgstr "خطأ ypbind مجهول" + +#: nis/ypclnt.c:974 +msgid "yp_update: cannot convert host to netname\n" +msgstr "yp_update: لا يمكن تحويل المضيف إلى اسم شبكة\n" + +#: nis/ypclnt.c:992 +msgid "yp_update: cannot get server address\n" +msgstr "yp_update: لا يمكن الحصول على عنوان الخادم\n" + +#: nscd/aicache.c:68 nscd/hstcache.c:451 +#, c-format +msgid "Haven't found \"%s\" in hosts cache!" +msgstr "لم يعثر على \"%s\" في خبيئة المضيفين!" + +#: nscd/aicache.c:70 nscd/hstcache.c:453 +#, c-format +msgid "Reloading \"%s\" in hosts cache!" +msgstr "إعادة تحميل \"%s\" في خبيئة المضيفين!" + +#: nscd/cache.c:150 +#, c-format +msgid "add new entry \"%s\" of type %s for %s to cache%s" +msgstr "إضافة مدخل جديد \"%s\" من نوع %s لـ %s إلى الخبيئة %s" + +#: nscd/cache.c:152 +msgid " (first)" +msgstr " (أولاً)" + +#: nscd/cache.c:287 +#, c-format +msgid "checking for monitored file `%s': %s" +msgstr "فحص الملف المراقب `%s': %s" + +#: nscd/cache.c:297 +#, c-format +msgid "monitored file `%s` changed (mtime)" +msgstr "تغير الملف المراقب `%s` (mtime)" + +#: nscd/cache.c:340 +#, c-format +msgid "pruning %s cache; time %ld" +msgstr "تقليم خبيئة %s؛ الوقت %ld" + +#: nscd/cache.c:369 +#, c-format +msgid "considering %s entry \"%s\", timeout %" +msgstr "النظر في مدخل %s \"%s\"، مهلة %" + +#: nscd/cachedumper.c:168 +msgid " - all data: " +msgstr " - جميع البيانات: " + +#: nscd/cachedumper.c:362 +#, c-format +msgid " - remaining data %p: " +msgstr " - البيانات المتبقية %p: " + +#: nscd/connections.c:530 +#, c-format +msgid "invalid persistent database file \"%s\": %s" +msgstr "ملف قاعدة بيانات مستمر غير صالح \"%s\": %s" + +#: nscd/connections.c:538 +msgid "uninitialized header" +msgstr "ترويسة غير مهيأة" + +#: nscd/connections.c:543 +msgid "header size does not match" +msgstr "حجم الترويسة غير متطابق" + +#: nscd/connections.c:553 +msgid "file size does not match" +msgstr "حجم الملف غير متطابق" + +#: nscd/connections.c:570 +msgid "verification failed" +msgstr "فشل التحقق" + +#: nscd/connections.c:584 +#, c-format +msgid "suggested size of table for database %s larger than the persistent database's table" +msgstr "الحجم المقترح لجدول قاعدة البيانات %s أكبر من جدول قاعدة البيانات المستمرة" + +#: nscd/connections.c:595 nscd/connections.c:679 +#, c-format +msgid "cannot create read-only descriptor for \"%s\"; no mmap" +msgstr "لا يمكن إنشاء واصف للقراءة فقط لـ \"%s\"؛ لا يوجد mmap" + +#: nscd/connections.c:611 +#, c-format +msgid "cannot access '%s'" +msgstr "لا يمكن الوصول لـ '%s'" + +#: nscd/connections.c:659 +#, c-format +msgid "database for %s corrupted or simultaneously used; remove %s manually if necessary and restart" +msgstr "قاعدة بيانات %s تالفة أو مستخدمة في وقت واحد؛ أزل %s يدوياً إذا لزم الأمر وأعد التشغيل" + +#: nscd/connections.c:665 +#, c-format +msgid "cannot create %s; no persistent database used" +msgstr "لا يمكن إنشاء %s؛ لا توجد قاعدة بيانات مستمرة مستخدمة" + +#: nscd/connections.c:668 +#, c-format +msgid "cannot create %s; no sharing possible" +msgstr "يتعذر إنشاء %s؛ المشاركة غير ممكنة" + +#: nscd/connections.c:739 +#, c-format +msgid "cannot write to database file %s: %s" +msgstr "يتعذر الكتابة في ملف قاعدة البيانات %s: %s" + +#: nscd/connections.c:795 +#, c-format +msgid "cannot open socket: %s" +msgstr "يتعذر فتح المقبس: %s" + +#: nscd/connections.c:814 +#, c-format +msgid "cannot enable socket to accept connections: %s" +msgstr "يتعذر تفعيل المقبس لقبول الاتصالات: %s" + +#: nscd/connections.c:871 +#, c-format +msgid "disabled inotify-based monitoring for file `%s': %s" +msgstr "عُطلت المراقبة المعتمدة على inotify للملف `%s': %s" + +#: nscd/connections.c:875 +#, c-format +msgid "monitoring file `%s` (%d)" +msgstr "مراقبة الملف `%s` (%d)" + +#: nscd/connections.c:888 +#, c-format +msgid "disabled inotify-based monitoring for directory `%s': %s" +msgstr "عُطلت المراقبة المعتمدة على inotify للدليل `%s': %s" + +#: nscd/connections.c:892 +#, c-format +msgid "monitoring directory `%s` (%d)" +msgstr "مراقبة الدليل `%s` (%d)" + +#: nscd/connections.c:920 +#, c-format +msgid "monitoring file %s for database %s" +msgstr "مراقبة الملف %s لقاعدة البيانات %s" + +#: nscd/connections.c:930 +#, c-format +msgid "stat failed for file `%s'; will try again later: %s" +msgstr "فشل stat للملف `%s'؛ تجري المحاولة لاحقاً: %s" + +#: nscd/connections.c:1049 +#, c-format +msgid "provide access to FD %d, for %s" +msgstr "توفير الوصول إلى FD %d، لـ %s" + +#: nscd/connections.c:1061 +#, c-format +msgid "cannot handle old request version %d; current version is %d" +msgstr "يتعذر التعامل مع إصدار الطلب القديم %d؛ الإصدار الحالي هو %d" + +#: nscd/connections.c:1084 +#, c-format +msgid "request from %ld not handled due to missing permission" +msgstr "لم يُعالج الطلب من %ld بسبب فقدان التصريح" + +#: nscd/connections.c:1089 +#, c-format +msgid "request from '%s' [%ld] not handled due to missing permission" +msgstr "لم يُعالج الطلب من '%s' [%ld] بسبب فقدان التصريح" + +#: nscd/connections.c:1094 +msgid "request not handled due to missing permission" +msgstr "لم يُعالج الطلب بسبب فقدان التصريح" + +#: nscd/connections.c:1132 nscd/connections.c:1158 +#, c-format +msgid "cannot write result: %s" +msgstr "يتعذر كتابة النتيجة: %s" + +#: nscd/connections.c:1249 +#, c-format +msgid "error getting caller's id: %s" +msgstr "خطأ أثناء جلب معرف المستدعَي: %s" + +#: nscd/connections.c:1359 +#, c-format +msgid "cannot open /proc/self/cmdline: %m; disabling paranoia mode" +msgstr "يتعذر فتح /proc/self/cmdline: %m؛ يُعطل وضع البارانويا" + +#: nscd/connections.c:1382 +#, c-format +msgid "cannot change to old UID: %s; disabling paranoia mode" +msgstr "يتعذر التغيير إلى معرف المستخدم (UID) القديم: %s؛ يُعطل وضع البارانويا" + +#: nscd/connections.c:1393 +#, c-format +msgid "cannot change to old GID: %s; disabling paranoia mode" +msgstr "يتعذر التغيير إلى معرف المجموعة (GID) القديم: %s؛ يُعطل وضع البارانويا" + +#: nscd/connections.c:1407 +#, c-format +msgid "cannot change to old working directory: %s; disabling paranoia mode" +msgstr "يتعذر التغيير إلى دليل العمل القديم: %s؛ يُعطل وضع البارانويا" + +#: nscd/connections.c:1454 +#, c-format +msgid "re-exec failed: %s; disabling paranoia mode" +msgstr "فشل إعادة التنفيذ (re-exec): %s؛ يُعطل وضع البارانويا" + +#: nscd/connections.c:1463 +#, c-format +msgid "cannot change current working directory to \"/\": %s" +msgstr "يتعذر تغيير دليل العمل الحالي إلى \"/\": %s" + +#: nscd/connections.c:1647 +#, c-format +msgid "short read while reading request: %s" +msgstr "قراءة ناقصة أثناء قراءة الطلب: %s" + +#: nscd/connections.c:1680 +#, c-format +msgid "key length in request too long: %d" +msgstr "طول المفتاح في الطلب طويل جداً: %d" + +#: nscd/connections.c:1693 +#, c-format +msgid "short read while reading request key: %s" +msgstr "قراءة ناقصة أثناء قراءة مفتاح الطلب: %s" + +#: nscd/connections.c:1703 +#, c-format +msgid "handle_request: request received (Version = %d) from PID %ld" +msgstr "handle_request: استُقبل طلب (إصدار = %d) من PID %ld" + +#: nscd/connections.c:1708 +#, c-format +msgid "handle_request: request received (Version = %d)" +msgstr "handle_request: استُقبل طلب (إصدار = %d)" + +#: nscd/connections.c:1848 +#, c-format +msgid "ignored inotify event for `%s` (file exists)" +msgstr "تُجوهل حدث inotify لـ `%s` (الملف موجود)" + +#: nscd/connections.c:1853 +#, c-format +msgid "monitored file `%s` was %s, removing watch" +msgstr "الملف المراقب `%s` كان %s، تجري إزالة المراقبة" + +#: nscd/connections.c:1861 nscd/connections.c:1903 +#, c-format +msgid "failed to remove file watch `%s`: %s" +msgstr "فشل إزالة مراقبة الملف `%s`: %s" + +#: nscd/connections.c:1876 +#, c-format +msgid "monitored file `%s` was written to" +msgstr "الملف المراقب `%s` كُتب فيه" + +#: nscd/connections.c:1900 +#, c-format +msgid "monitored parent directory `%s` was %s, removing watch on `%s`" +msgstr "الدليل الأب المراقب `%s` كان %s، تجري إزالة المراقبة على `%s`" + +#: nscd/connections.c:1926 +#, c-format +msgid "monitored file `%s` was %s, adding watch" +msgstr "الملف المراقب `%s` كان %s، تجري إضافة مراقبة" + +#: nscd/connections.c:1938 +#, c-format +msgid "failed to add file watch `%s`: %s" +msgstr "فشل إضافة مراقبة الملف `%s`: %s" + +#: nscd/connections.c:2116 nscd/connections.c:2281 +#, c-format +msgid "disabled inotify-based monitoring after read error %d" +msgstr "عُطلت المراقبة المعتمدة على inotify بعد خطأ قراءة %d" + +#: nscd/connections.c:2397 +msgid "could not initialize conditional variable" +msgstr "يتعذر تهيئة المتغير الشرطي" + +#: nscd/connections.c:2405 +msgid "could not start clean-up thread; terminating" +msgstr "يتعذر بدء خيط التنظيف؛ يجري الإنهاء" + +#: nscd/connections.c:2419 +msgid "could not start any worker thread; terminating" +msgstr "يتعذر بدء أي خيط عامل؛ يجري الإنهاء" + +#: nscd/connections.c:2474 nscd/connections.c:2476 nscd/connections.c:2492 +#: nscd/connections.c:2502 nscd/connections.c:2520 nscd/connections.c:2531 +#: nscd/connections.c:2541 +#, c-format +msgid "Failed to run nscd as user '%s'" +msgstr "فشل تشغيل nscd كالمستخدم '%s'" + +#: nscd/connections.c:2494 +msgid "initial getgrouplist failed" +msgstr "فشل getgrouplist الأولي" + +#: nscd/connections.c:2503 +msgid "getgrouplist failed" +msgstr "فشل getgrouplist" + +#: nscd/connections.c:2521 +msgid "setgroups failed" +msgstr "فشل setgroups" + +#: nscd/grpcache.c:384 nscd/hstcache.c:401 nscd/initgrcache.c:377 +#: nscd/pwdcache.c:362 nscd/servicescache.c:309 +#, c-format +msgid "short write in %s: %s" +msgstr "كتابة ناقصة في %s: %s" + +#: nscd/grpcache.c:429 nscd/initgrcache.c:74 +#, c-format +msgid "Haven't found \"%s\" in group cache!" +msgstr "لم يُعثر على \"%s\" في خبيئة المجموعة!" + +#: nscd/grpcache.c:431 nscd/initgrcache.c:76 +#, c-format +msgid "Reloading \"%s\" in group cache!" +msgstr "إعادة تحميل \"%s\" في خبيئة المجموعة!" + +#: nscd/grpcache.c:491 +#, c-format +msgid "Invalid numeric gid \"%s\"!" +msgstr "معرف مجموعة (gid) رقمي غير صالح \"%s\"!" + +#: nscd/mem.c:420 +#, c-format +msgid "freed %zu bytes in %s cache" +msgstr "حُرّر %zu بايت في خبيئة %s" + +#: nscd/mem.c:563 +#, c-format +msgid "no more memory for database '%s'" +msgstr "لا توجد ذاكرة كافية لقاعدة البيانات '%s'" + +#: nscd/netgroupcache.c:198 +#, c-format +msgid "Haven't found \"%s\" in netgroup cache!" +msgstr "لم يُعثر على \"%s\" في خبيئة مجموعة الشبكة!" + +#: nscd/netgroupcache.c:200 +#, c-format +msgid "Reloading \"%s\" in netgroup cache!" +msgstr "إعادة تحميل \"%s\" في خبيئة مجموعة الشبكة!" + +#: nscd/netgroupcache.c:486 +#, c-format +msgid "Haven't found \"%s (%s,%s,%s)\" in netgroup cache!" +msgstr "لم يُعثر على \"%s (%s,%s,%s)\" في خبيئة مجموعة الشبكة!" + +#: nscd/netgroupcache.c:489 +#, c-format +msgid "Reloading \"%s (%s,%s,%s)\" in netgroup cache!" +msgstr "إعادة تحميل \"%s (%s,%s,%s)\" في خبيئة مجموعة الشبكة!" + +#: nscd/nscd.c:107 +msgid "Read configuration data from NAME" +msgstr "قراءة بيانات الضبط من NAME" + +#: nscd/nscd.c:109 +msgid "Do not fork and display messages on the current tty" +msgstr "عدم التفرع وعرض الرسائل على tty الحالي" + +#: nscd/nscd.c:111 +msgid "Print contents of the offline cache file NAME" +msgstr "طباعة محتويات ملف الخبيئة غير المتصل NAME" + +#: nscd/nscd.c:113 +msgid "Do not fork, but otherwise behave like a daemon" +msgstr "عدم التفرع، والتصرف كخادم خلفي" + +#: nscd/nscd.c:114 +msgid "NUMBER" +msgstr "NUMBER" + +#: nscd/nscd.c:114 +msgid "Start NUMBER threads" +msgstr "بدء عدد NUMBER من الخيوط" + +#: nscd/nscd.c:115 +msgid "Shut the server down" +msgstr "إيقاف الخادم" + +#: nscd/nscd.c:116 +msgid "Print current configuration statistics" +msgstr "طباعة إحصائيات الضبط الحالية" + +#: nscd/nscd.c:118 +msgid "Invalidate the specified cache" +msgstr "إبطال الخبيئة المحددة" + +#: nscd/nscd.c:119 +msgid "TABLE,yes" +msgstr "TABLE,yes" + +#: nscd/nscd.c:120 +msgid "Use separate cache for each user" +msgstr "استخدام خبيئة منفصلة لكل مستخدم" + +#: nscd/nscd.c:125 +msgid "Name Service Cache Daemon." +msgstr "خادم خبيئة خدمة الأسماء." + +#: nscd/nscd.c:158 nss/getent.c:995 nss/makedb.c:208 +#, c-format +msgid "wrong number of arguments" +msgstr "عدد معاملات خاطئ" + +#: nscd/nscd.c:173 +#, c-format +msgid "failure while reading configuration file; this is fatal" +msgstr "فشل أثناء قراءة ملف الضبط؛ هذا خطأ فادح" + +#: nscd/nscd.c:182 +#, c-format +msgid "already running" +msgstr "يعمل بالفعل" + +#: nscd/nscd.c:202 +#, c-format +msgid "cannot create a pipe to talk to the child" +msgstr "يتعذر إنشاء أنبوب للتحدث مع الابن" + +#: nscd/nscd.c:206 +#, c-format +msgid "cannot fork" +msgstr "يتعذر التفرع" + +#: nscd/nscd.c:276 +msgid "cannot change current working directory to \"/\"" +msgstr "يتعذر تغيير دليل العمل الحالي إلى \"/\"" + +#: nscd/nscd.c:284 +msgid "Could not create log file" +msgstr "يتعذر إنشاء ملف السجل" + +#: nscd/nscd.c:363 nscd/nscd_stat.c:208 +#, c-format +msgid "write incomplete" +msgstr "كتابة غير مكتملة" + +#: nscd/nscd.c:374 +#, c-format +msgid "cannot read invalidate ACK" +msgstr "يتعذر قراءة تأكيد الإبطال (ACK)" + +#: nscd/nscd.c:380 +#, c-format +msgid "invalidation failed" +msgstr "فشل الإبطال" + +#: nscd/nscd.c:429 nscd/nscd.c:454 nscd/nscd_stat.c:189 +#, c-format +msgid "Only root is allowed to use this option!" +msgstr "يُسمح للجذر (root) فقط باستخدام هذا الخيار!" + +#: nscd/nscd.c:449 +#, c-format +msgid "'%s' is not a known database" +msgstr "'%s' ليست قاعدة بيانات معروفة" + +#: nscd/nscd.c:464 +#, c-format +msgid "secure services not implemented anymore" +msgstr "الخدمات الآمنة لم تعد مدعومة" + +#: nscd/nscd.c:497 +#, c-format +msgid "" +"Supported tables:\n" +"%s\n" +"\n" +"For bug reporting instructions, please see:\n" +"%s.\n" +msgstr "" +"الجداول المدعومة:\n" +"%s\n" +"\n" +"لتعليمات الإبلاغ عن العيوب، يرجى مراجعة:\n" +"%s.\n" + +#: nscd/nscd.c:647 +#, c-format +msgid "'wait' failed\n" +msgstr "فشل 'wait'\n" + +#: nscd/nscd.c:654 +#, c-format +msgid "child exited with status %d\n" +msgstr "خرج الابن بالحالة %d\n" + +#: nscd/nscd.c:659 +#, c-format +msgid "child terminated by signal %d\n" +msgstr "أُنهي الابن بالإشارة %d\n" + +#: nscd/nscd_conf.c:53 +#, c-format +msgid "database %s is not supported" +msgstr "قاعدة البيانات %s غير مدعومة" + +#: nscd/nscd_conf.c:104 +#, c-format +msgid "Parse error: %s" +msgstr "خطأ تحليل: %s" + +#: nscd/nscd_conf.c:190 +#, c-format +msgid "Must specify user name for server-user option" +msgstr "يجب تحديد اسم المستخدم لخيار server-user" + +#: nscd/nscd_conf.c:200 +#, c-format +msgid "Must specify user name for stat-user option" +msgstr "يجب تحديد اسم المستخدم لخيار stat-user" + +#: nscd/nscd_conf.c:258 +#, c-format +msgid "Must specify value for restart-interval option" +msgstr "يجب تحديد قيمة لخيار restart-interval" + +#: nscd/nscd_conf.c:272 +#, c-format +msgid "Unknown option: %s %s %s" +msgstr "خيار غير معروف: %s %s %s" + +#: nscd/nscd_conf.c:285 +#, c-format +msgid "cannot get current working directory: %s; disabling paranoia mode" +msgstr "يتعذر جلب دليل العمل الحالي: %s؛ يُعطل وضع البارانويا" + +#: nscd/nscd_conf.c:305 +#, c-format +msgid "maximum file size for %s database too small" +msgstr "أقصى حجم ملف لقاعدة بيانات %s صغير جداً" + +#: nscd/nscd_stat.c:158 +#, c-format +msgid "cannot write statistics: %s" +msgstr "يتعذر كتابة الإحصائيات: %s" + +#: nscd/nscd_stat.c:173 +msgid "yes" +msgstr "نعم" + +#: nscd/nscd_stat.c:174 +msgid "no" +msgstr "لا" + +#: nscd/nscd_stat.c:185 +#, c-format +msgid "Only root or %s is allowed to use this option!" +msgstr "يُسمح للجذر (root) أو %s فقط باستخدام هذا الخيار!" + +#: nscd/nscd_stat.c:196 +#, c-format +msgid "nscd not running!\n" +msgstr "nscd لا يعمل!\n" + +#: nscd/nscd_stat.c:220 +#, c-format +msgid "cannot read statistics data" +msgstr "يتعذر قراءة بيانات الإحصائيات" + +#: nscd/nscd_stat.c:223 +#, c-format +msgid "" +"nscd configuration:\n" +"\n" +"%15d server debug level\n" +msgstr "" +"ضبط nscd:\n" +"\n" +"%15d مستوى تنقيح الخادم\n" + +#: nscd/nscd_stat.c:247 +#, c-format +msgid "%3ud %2uh %2um %2lus server runtime\n" +msgstr "%3ud %2uh %2um %2lus وقت تشغيل الخادم\n" + +#: nscd/nscd_stat.c:250 +#, c-format +msgid " %2uh %2um %2lus server runtime\n" +msgstr " %2uh %2um %2lus وقت تشغيل الخادم\n" + +#: nscd/nscd_stat.c:252 +#, c-format +msgid " %2um %2lus server runtime\n" +msgstr " %2um %2lus وقت تشغيل الخادم\n" + +#: nscd/nscd_stat.c:254 +#, c-format +msgid " %2lus server runtime\n" +msgstr " %2lus وقت تشغيل الخادم\n" + +#: nscd/nscd_stat.c:256 +#, c-format +msgid "" +"%15d current number of threads\n" +"%15d maximum number of threads\n" +"%15lu number of times clients had to wait\n" +"%15s paranoia mode enabled\n" +"%15lu restart internal\n" +"%15u reload count\n" +msgstr "" +"%15d عدد الخيوط الحالي\n" +"%15d أقصى عدد خيوط\n" +"%15lu عدد المرات التي اضطر فيها العملاء للانتظار\n" +"%15s وضع البارانويا مفعل\n" +"%15lu الفاصل الزمني لإعادة التشغيل\n" +"%15u عدد مرات إعادة التحميل\n" + +#: nscd/nscd_stat.c:291 +#, c-format +msgid "" +"\n" +"%s cache:\n" +"\n" +"%15s cache is enabled\n" +"%15s cache is persistent\n" +"%15s cache is shared\n" +"%15zu suggested size\n" +"%15zu total data pool size\n" +"%15zu used data pool size\n" +"%15lu seconds time to live for positive entries\n" +"%15lu seconds time to live for negative entries\n" +"%15 cache hits on positive entries\n" +"%15 cache hits on negative entries\n" +"%15 cache misses on positive entries\n" +"%15 cache misses on negative entries\n" +"%15lu%% cache hit rate\n" +"%15zu current number of cached values\n" +"%15zu maximum number of cached values\n" +"%15zu maximum chain length searched\n" +"%15 number of delays on rdlock\n" +"%15 number of delays on wrlock\n" +"%15 memory allocations failed\n" +"%15s check /etc/%s for changes\n" +msgstr "" +"\n" +"خبيئة %s:\n" +"\n" +"%15s الخبيئة مفعلة\n" +"%15s الخبيئة مستمرة\n" +"%15s الخبيئة مشتركة\n" +"%15zu الحجم المقترح\n" +"%15zu إجمالي حجم تجمع البيانات\n" +"%15zu حجم تجمع البيانات المستخدم\n" +"%15lu ثواني وقت الحياة للمدخلات الإيجابية\n" +"%15lu ثواني وقت الحياة للمدخلات السلبية\n" +"%15 إصابات الخبيئة للمدخلات الإيجابية\n" +"%15 إصابات الخبيئة للمدخلات السلبية\n" +"%15 إخفاقات الخبيئة للمدخلات الإيجابية\n" +"%15 إخفاقات الخبيئة للمدخلات السلبية\n" +"%15lu%% معدل إصابة الخبيئة\n" +"%15zu العدد الحالي للقيم المخبأة\n" +"%15zu أقصى عدد للقيم المخبأة\n" +"%15zu أقصى طول لسلسلة البحث\n" +"%15 عدد التأخيرات في قفل القراءة\n" +"%15 عدد التأخيرات في قفل الكتابة\n" +"%15 فشل تخصيص الذاكرة\n" +"%15s تحقق من /etc/%s للتغييرات\n" + +#: nscd/pwdcache.c:406 +#, c-format +msgid "Haven't found \"%s\" in user database cache!" +msgstr "لم يُعثر على \"%s\" في خبيئة قاعدة بيانات المستخدمين!" + +#: nscd/pwdcache.c:408 +#, c-format +msgid "Reloading \"%s\" in user database cache!" +msgstr "إعادة تحميل \"%s\" في خبيئة قاعدة بيانات المستخدمين!" + +#: nscd/pwdcache.c:470 +#, c-format +msgid "Invalid numeric uid \"%s\"!" +msgstr "معرف مستخدم (uid) رقمي غير صالح \"%s\"!" + +#: nscd/selinux.c:154 +#, c-format +msgid "Failed opening connection to the audit subsystem: %m" +msgstr "فشل فتح اتصال بنظام المراجعة الفرعي: %m" + +#: nscd/selinux.c:175 +msgid "Failed to set keep-capabilities" +msgstr "فشل ضبط keep-capabilities" + +#: nscd/selinux.c:176 nscd/selinux.c:239 +msgid "prctl(KEEPCAPS) failed" +msgstr "فشل prctl(KEEPCAPS)" + +#: nscd/selinux.c:190 +msgid "Failed to initialize drop of capabilities" +msgstr "فشل تهيئة إسقاط القدرات" + +#: nscd/selinux.c:191 +msgid "cap_init failed" +msgstr "فشل cap_init" + +#: nscd/selinux.c:212 nscd/selinux.c:229 +msgid "Failed to drop capabilities" +msgstr "فشل إسقاط القدرات" + +#: nscd/selinux.c:213 nscd/selinux.c:230 +msgid "cap_set_proc failed" +msgstr "فشل cap_set_proc" + +#: nscd/selinux.c:238 +msgid "Failed to unset keep-capabilities" +msgstr "فشل إلغاء ضبط keep-capabilities" + +#: nscd/selinux.c:254 +msgid "Failed to determine if kernel supports SELinux" +msgstr "فشل تحديد ما إذا كانت النواة تدعم SELinux" + +#: nscd/selinux.c:269 +msgid "Failed to start AVC thread" +msgstr "فشل بدء خيط AVC" + +#: nscd/selinux.c:291 +msgid "Failed to create AVC lock" +msgstr "فشل إنشاء قفل AVC" + +#: nscd/selinux.c:337 +msgid "Failed to start AVC" +msgstr "فشل بدء AVC" + +#: nscd/selinux.c:339 +msgid "Access Vector Cache (AVC) started" +msgstr "بُدئت خبيئة شعاع الوصول (AVC)" + +#: nscd/selinux.c:381 +msgid "Error querying policy for undefined object classes or permissions." +msgstr "خطأ أثناء الاستعلام عن السياسة لأصناف كائنات أو تصاريح غير معرفة." + +#: nscd/selinux.c:388 +msgid "Error getting security class for nscd." +msgstr "خطأ أثناء جلب صنف الأمان لـ nscd." + +#: nscd/selinux.c:393 +#, c-format +msgid "Error translating permission name \"%s\" to access vector bit." +msgstr "خطأ أثناء ترجمة اسم التصريح \"%s\" إلى بت شعاع الوصول." + +#: nscd/selinux.c:403 +msgid "Error getting context of socket peer" +msgstr "خطأ أثناء جلب سياق نظير المقبس" + +#: nscd/selinux.c:408 +msgid "Error getting context of nscd" +msgstr "خطأ أثناء جلب سياق nscd" + +#: nscd/selinux.c:414 +msgid "Error getting sid from context" +msgstr "خطأ أثناء جلب sid من السياق" + +#: nscd/selinux.c:453 +#, c-format +msgid "" +"\n" +"SELinux AVC Statistics:\n" +"\n" +"%15u entry lookups\n" +"%15u entry hits\n" +"%15u entry misses\n" +"%15u entry discards\n" +"%15u CAV lookups\n" +"%15u CAV hits\n" +"%15u CAV probes\n" +"%15u CAV misses\n" +msgstr "" +"\n" +"إحصائيات SELinux AVC:\n" +"\n" +"%15u عمليات بحث عن المدخلات\n" +"%15u إصابات المدخلات\n" +"%15u إخفاقات المدخلات\n" +"%15u المدخلات المهملة\n" +"%15u عمليات بحث CAV\n" +"%15u إصابات CAV\n" +"%15u فحوصات CAV\n" +"%15u إخفاقات CAV\n" + +#: nscd/servicescache.c:357 +#, c-format +msgid "Haven't found \"%s\" in services cache!" +msgstr "لم يُعثر على \"%s\" في خبيئة الخدمات!" + +#: nscd/servicescache.c:359 +#, c-format +msgid "Reloading \"%s\" in services cache!" +msgstr "إعادة تحميل \"%s\" في خبيئة الخدمات!" + +#: nss/getent.c:54 +msgid "database [key ...]" +msgstr "قاعدة البيانات [مفتاح ...]" + +#: nss/getent.c:59 +msgid "CONFIG" +msgstr "ضبط" + +#: nss/getent.c:59 +msgid "Service configuration to be used" +msgstr "ضبط الخدمة المراد استخدامه" + +#: nss/getent.c:60 +msgid "disable IDN encoding" +msgstr "تعطيل ترميز IDN" + +#: nss/getent.c:62 +msgid "do not filter out unsupported IPv4/IPv6 addresses (with ahosts*)" +msgstr "عدم تصفية عناوين IPv4/IPv6 غير المدعومة (مع ahosts*)" + +#: nss/getent.c:67 +msgid "Get entries from administrative database." +msgstr "جلب المدخلات من قاعدة البيانات الإدارية." + +#: nss/getent.c:154 nss/getent.c:466 nss/getent.c:513 +#, c-format +msgid "Enumeration not supported on %s\n" +msgstr "التعداد غير مدعوم على %s\n" + +#: nss/getent.c:521 nss/getent.c:534 +#, c-format +msgid "Could not allocate group list: %m\n" +msgstr "يتعذر تخصيص قائمة المجموعات: %m\n" + +#: nss/getent.c:905 +#, c-format +msgid "Unknown database name" +msgstr "اسم قاعدة بيانات غير معروف" + +#: nss/getent.c:939 +msgid "Supported databases:\n" +msgstr "قواعد البيانات المدعومة:\n" + +#: nss/getent.c:1005 +#, c-format +msgid "Unknown database: %s\n" +msgstr "قاعدة بيانات غير معروفة: %s\n" + +#: nss/makedb.c:121 +msgid "Convert key to lower case" +msgstr "تحويل المفتاح إلى حالة الأحرف الصغيرة" + +#: nss/makedb.c:124 +msgid "Do not print messages while building database" +msgstr "عدم طباعة رسائل أثناء بناء قاعدة البيانات" + +#: nss/makedb.c:126 +msgid "Print content of database file, one entry a line" +msgstr "طباعة محتوى ملف قاعدة البيانات، مدخل واحد في كل سطر" + +#: nss/makedb.c:127 +msgid "CHAR" +msgstr "محرف" + +#: nss/makedb.c:128 +msgid "Generated line not part of iteration" +msgstr "السطر المولد ليس جزءاً من التكرار" + +#: nss/makedb.c:133 +msgid "Create simple database from textual input." +msgstr "إنشاء قاعدة بيانات بسيطة من مدخلات نصية." + +#: nss/makedb.c:136 +msgid "" +"INPUT-FILE OUTPUT-FILE\n" +"-o OUTPUT-FILE INPUT-FILE\n" +"-u INPUT-FILE" +msgstr "" +"INPUT-FILE OUTPUT-FILE\n" +"-o OUTPUT-FILE INPUT-FILE\n" +"-u INPUT-FILE" + +#: nss/makedb.c:229 +#, c-format +msgid "cannot open database file `%s'" +msgstr "يتعذر فتح ملف قاعدة البيانات `%s'" + +#: nss/makedb.c:274 +#, c-format +msgid "no entries to be processed" +msgstr "لا توجد مدخلات للمعالجة" + +#: nss/makedb.c:284 +#, c-format +msgid "cannot create temporary file name" +msgstr "يتعذر إنشاء اسم ملف مؤقت" + +#: nss/makedb.c:290 +#, c-format +msgid "cannot create temporary file" +msgstr "يتعذر إنشاء ملف مؤقت" + +#: nss/makedb.c:306 +#, c-format +msgid "cannot stat newly created file" +msgstr "يتعذر إجراء stat للملف المنشأ حديثاً" + +#: nss/makedb.c:317 +#, c-format +msgid "cannot rename temporary file" +msgstr "يتعذر إعادة تسمية الملف مؤقت" + +#: nss/makedb.c:529 nss/makedb.c:552 +#, c-format +msgid "cannot create search tree" +msgstr "يتعذر إنشاء شجرة بحث" + +#: nss/makedb.c:558 +msgid "duplicate key" +msgstr "مفتاح مكرر" + +#: nss/makedb.c:570 +#, c-format +msgid "problems while reading `%s'" +msgstr "مشاكل أثناء قراءة `%s'" + +#: nss/makedb.c:748 +#, c-format +msgid "failed to allocate memory" +msgstr "فشل تخصيص الذاكرة" + +#: nss/makedb.c:814 +#, c-format +msgid "failed to write new database file" +msgstr "فشل كتابة ملف قاعدة بيانات جديد" + +#: nss/makedb.c:833 +#, c-format +msgid "cannot stat database file" +msgstr "يتعذر إجراء stat لملف قاعدة البيانات" + +#: nss/makedb.c:838 +#, c-format +msgid "cannot map database file" +msgstr "يتعذر تعيين (map) ملف قاعدة البيانات" + +#: nss/makedb.c:841 +#, c-format +msgid "file not a database file" +msgstr "الملف ليس ملف قاعدة بيانات" + +#: nss/makedb.c:893 +#, c-format +msgid "cannot initialize SELinux context" +msgstr "يتعذر تهيئة سياق SELinux" + +#: nss/makedb.c:902 +#, c-format +msgid "cannot set file creation context for `%s'" +msgstr "يتعذر ضبط سياق إنشاء الملف لـ `%s'" + +#: posix/getconf.c:462 +#, c-format +msgid "Usage: %s [-v specification] variable_name [pathname]\n" +msgstr "الاستخدام: %s [-v المواصفات] variable_name [pathname]\n" + +#: posix/getconf.c:465 +#, c-format +msgid " %s -a [pathname]\n" +msgstr " %s -a [pathname]\n" + +#: posix/getconf.c:544 +#, c-format +msgid "" +"Usage: getconf [-v SPEC] VAR\n" +" or: getconf [-v SPEC] PATH_VAR PATH\n" +"\n" +"Get the configuration value for variable VAR, or for variable PATH_VAR\n" +"for path PATH. If SPEC is given, give values for compilation\n" +"environment SPEC.\n" +"\n" +msgstr "" +"الاستخدام: getconf [-v SPEC] VAR\n" +" أو: getconf [-v SPEC] PATH_VAR PATH\n" +"\n" +"جلب قيمة الضبط للمتغير VAR، أو للمتغير PATH_VAR للمسار PATH.\n" +"إذا أُعطيت SPEC، تعطي القيم لبيئة التجميع SPEC.\n" +"\n" + +#: posix/getconf.c:620 +#, c-format +msgid "unknown specification \"%s\"" +msgstr "مواصفة غير معروفة \"%s\"" + +#: posix/getconf.c:672 +#, c-format +msgid "Couldn't execute %s" +msgstr "تعذر تنفيذ %s" + +#: posix/getconf.c:717 posix/getconf.c:733 +msgid "undefined" +msgstr "غير محدد" + +#: posix/getconf.c:761 +#, c-format +msgid "Unrecognized variable `%s'" +msgstr "متغير غير معروف `%s'" + +#: posix/getopt.c:278 +#, c-format +msgid "%s: option '%s%s' is ambiguous\n" +msgstr "%s: الخيار '%s%s' غامض\n" + +#: posix/getopt.c:284 +#, c-format +msgid "%s: option '%s%s' is ambiguous; possibilities:" +msgstr "%s: الخيار '%s%s' غامض؛ الاحتمالات:" + +#: posix/getopt.c:319 +#, c-format +msgid "%s: unrecognized option '%s%s'\n" +msgstr "%s: خيار غير معروف '%s%s'\n" + +#: posix/getopt.c:345 +#, c-format +msgid "%s: option '%s%s' doesn't allow an argument\n" +msgstr "%s: الخيار '%s%s' لا يسمح بمعامل\n" + +#: posix/getopt.c:360 +#, c-format +msgid "%s: option '%s%s' requires an argument\n" +msgstr "%s: الخيار '%s%s' يتطلب معاملاً\n" + +#: posix/getopt.c:621 +#, c-format +msgid "%s: invalid option -- '%c'\n" +msgstr "%s: خيار غير صالح -- '%c'\n" + +#: posix/getopt.c:636 posix/getopt.c:682 +#, c-format +msgid "%s: option requires an argument -- '%c'\n" +msgstr "%s: الخيار يتطلب معاملاً -- '%c'\n" + +#: posix/regcomp.c:138 +msgid "No match" +msgstr "لا يوجد تطابق" + +#: posix/regcomp.c:141 +msgid "Invalid regular expression" +msgstr "تعبير نمطي غير صالح" + +#: posix/regcomp.c:144 +msgid "Invalid collation character" +msgstr "محرف ترتيب (collation) غير صالح" + +#: posix/regcomp.c:147 +msgid "Invalid character class name" +msgstr "اسم صنف محرف غير صالح" + +#: posix/regcomp.c:150 +msgid "Trailing backslash" +msgstr "شرطة مائلة عكسية في النهاية" + +#: posix/regcomp.c:153 +msgid "Invalid back reference" +msgstr "مرجع خلفي غير صالح" + +#: posix/regcomp.c:156 +msgid "Unmatched [, [^, [:, [., or [=" +msgstr "[, [^, [:, [., أو [= بلا مقابل" + +#: posix/regcomp.c:159 +msgid "Unmatched ( or \\(" +msgstr "( أو \\( بلا مقابل" + +#: posix/regcomp.c:162 +msgid "Unmatched \\{" +msgstr "\\{ بلا مقابل" + +#: posix/regcomp.c:165 +msgid "Invalid content of \\{\\}" +msgstr "محتوى غير صالح في \\{\\}" + +#: posix/regcomp.c:168 +msgid "Invalid range end" +msgstr "نهاية نطاق غير صالحة" + +#: posix/regcomp.c:171 +msgid "Memory exhausted" +msgstr "نفدت الذاكرة" + +#: posix/regcomp.c:174 +msgid "Invalid preceding regular expression" +msgstr "تعبير نمطي سابق غير صالح" + +#: posix/regcomp.c:177 +msgid "Premature end of regular expression" +msgstr "نهاية سابقة لأوانها للتعبير النمطي" + +#: posix/regcomp.c:180 +msgid "Regular expression too big" +msgstr "التعبير النمطي كبير جداً" + +#: posix/regcomp.c:183 +msgid "Unmatched ) or \\)" +msgstr ") أو \\) بلا مقابل" + +#: posix/regcomp.c:676 +msgid "No previous regular expression" +msgstr "لا يوجد تعبير نمطي سابق" + +#: posix/wordexp.c:1794 +msgid "parameter null or not set" +msgstr "المعامل فارغ أو غير محدد" + +#: resolv/herror.c:63 +msgid "Resolver Error 0 (no error)" +msgstr "خطأ المحلل (Resolver) رقم 0 (لا يوجد خطأ)" + +#: resolv/herror.c:64 +msgid "Unknown host" +msgstr "حاسوب غير معروف" + +#: resolv/herror.c:65 +msgid "Host name lookup failure" +msgstr "فشل البحث عن اسم الحاسوب" + +#: resolv/herror.c:66 +msgid "Unknown server error" +msgstr "خطأ خادم غير معروف" + +#: resolv/herror.c:67 +msgid "No address associated with name" +msgstr "لا يوجد عنوان مرتبط بالاسم" + +#: resolv/herror.c:102 +msgid "Resolver internal error" +msgstr "خطأ داخلي في المحلل (Resolver)" + +#: resolv/herror.c:105 +msgid "Unknown resolver error" +msgstr "خطأ محلل (Resolver) غير معروف" + +#: resolv/res_hconf.c:118 +#, c-format +msgid "%s: line %d: cannot specify more than %d trim domains" +msgstr "%s: سطر %d: لا يمكن تحديد أكثر من %d نطاقات تهذيب (trim domains)" + +#: resolv/res_hconf.c:139 +#, c-format +msgid "%s: line %d: list delimiter not followed by domain" +msgstr "%s: سطر %d: محدد القائمة لم يتبعه نطاق" + +#: resolv/res_hconf.c:177 +#, c-format +msgid "%s: line %d: expected `on' or `off', found `%s'\n" +msgstr "%s: سطر %d: توقع 'on' أو 'off'، وُجد `%s'\n" + +#: resolv/res_hconf.c:220 +#, c-format +msgid "%s: line %d: bad command `%s'\n" +msgstr "%s: سطر %d: أمر سيئ `%s'\n" + +#: resolv/res_hconf.c:253 +#, c-format +msgid "%s: line %d: ignoring trailing garbage `%s'\n" +msgstr "%s: سطر %d: تجاهل المهملات في النهاية `%s'\n" + +#: stdio-common/psiginfo-data.h:2 +msgid "Illegal opcode" +msgstr "رمز عملية (opcode) غير قانوني" + +#: stdio-common/psiginfo-data.h:3 +msgid "Illegal operand" +msgstr "معامل (operand) غير قانوني" + +#: stdio-common/psiginfo-data.h:4 +msgid "Illegal addressing mode" +msgstr "نمط عنونة غير قانوني" + +#: stdio-common/psiginfo-data.h:5 +msgid "Illegal trap" +msgstr "مصيدة (trap) غير قانونية" + +#: stdio-common/psiginfo-data.h:6 +msgid "Privileged opcode" +msgstr "رمز عملية (opcode) مميز" + +#: stdio-common/psiginfo-data.h:7 +msgid "Privileged register" +msgstr "سجل مميز" + +#: stdio-common/psiginfo-data.h:8 +msgid "Coprocessor error" +msgstr "خطأ في المعالج المساعد" + +#: stdio-common/psiginfo-data.h:9 +msgid "Internal stack error" +msgstr "خطأ داخلي في المكدس" + +#: stdio-common/psiginfo-data.h:12 +msgid "Integer divide by zero" +msgstr "قسمة عدد صحيح على صفر" + +#: stdio-common/psiginfo-data.h:13 +msgid "Integer overflow" +msgstr "تجاوز سعة العدد الصحيح" + +#: stdio-common/psiginfo-data.h:14 +msgid "Floating-point divide by zero" +msgstr "قسمة الفاصلة العائمة على صفر" + +#: stdio-common/psiginfo-data.h:15 +msgid "Floating-point overflow" +msgstr "تجاوز سعة الفاصلة العائمة" + +#: stdio-common/psiginfo-data.h:16 +msgid "Floating-point underflow" +msgstr "انخفاض سعة الفاصلة العائمة" + +#: stdio-common/psiginfo-data.h:17 +msgid "Floating-poing inexact result" +msgstr "نتيجة غير دقيقة للفاصلة العائمة" + +#: stdio-common/psiginfo-data.h:18 +msgid "Invalid floating-point operation" +msgstr "عملية فاصلة عائمة غير صالحة" + +#: stdio-common/psiginfo-data.h:19 +msgid "Subscript out of range" +msgstr "المنخفض خارج النطاق" + +#: stdio-common/psiginfo-data.h:22 +msgid "Address not mapped to object" +msgstr "العنوان غير معين لكائن" + +#: stdio-common/psiginfo-data.h:23 +msgid "Invalid permissions for mapped object" +msgstr "تصاريح غير صالحة للكائن المعين" + +#: stdio-common/psiginfo-data.h:26 +msgid "Invalid address alignment" +msgstr "محاذاة عنوان غير صالحة" + +#: stdio-common/psiginfo-data.h:27 +msgid "Nonexisting physical address" +msgstr "عنوان فيزيائي غير موجود" + +#: stdio-common/psiginfo-data.h:28 +msgid "Object-specific hardware error" +msgstr "خطأ في العتاد خاص بالكائن" + +#: stdio-common/psiginfo-data.h:31 +msgid "Process breakpoint" +msgstr "نقطة توقف العملية" + +#: stdio-common/psiginfo-data.h:32 +msgid "Process trace trap" +msgstr "مصيدة تتبع العملية" + +#: stdio-common/psiginfo-data.h:35 +msgid "Child has exited" +msgstr "خرج الابن" + +#: stdio-common/psiginfo-data.h:36 +msgid "Child has terminated abnormally and did not create a core file" +msgstr "أُنهي الابن بشكل غير طبيعي ولم ينشئ ملف لب (core file)" + +#: stdio-common/psiginfo-data.h:37 +msgid "Child has terminated abnormally and created a core file" +msgstr "أُنهي الابن بشكل غير طبيعي وأنشأ ملف لب (core file)" + +#: stdio-common/psiginfo-data.h:38 +msgid "Traced child has trapped" +msgstr "الابن المتتبع وقع في المصيدة" + +#: stdio-common/psiginfo-data.h:39 +msgid "Child has stopped" +msgstr "توقف الابن" + +#: stdio-common/psiginfo-data.h:40 +msgid "Stopped child has continued" +msgstr "استمر الابن المتوقف" + +#: stdio-common/psiginfo-data.h:43 +msgid "Data input available" +msgstr "مدخلات البيانات متاحة" + +#: stdio-common/psiginfo-data.h:44 +msgid "Output buffers available" +msgstr "خبيئات المخرجات متاحة" + +#: stdio-common/psiginfo-data.h:45 +msgid "Input message available" +msgstr "رسالة المدخلات متاحة" + +#: stdio-common/psiginfo-data.h:46 timezone/zdump.c:445 timezone/zic.c:652 +msgid "I/O error" +msgstr "خطأ إدخال/إخراج" + +#: stdio-common/psiginfo-data.h:47 +msgid "High priority input available" +msgstr "مدخلات عالية الأولوية متاحة" + +#: stdio-common/psiginfo-data.h:48 +msgid "Device disconnected" +msgstr "انقطع اتصال الجهاز" + +#: stdio-common/psiginfo.c:140 +msgid "Signal sent by kill()" +msgstr "إشارة مرسلة بواسطة kill()" + +#: stdio-common/psiginfo.c:143 +msgid "Signal sent by sigqueue()" +msgstr "إشارة مرسلة بواسطة sigqueue()" + +#: stdio-common/psiginfo.c:146 +msgid "Signal generated by the expiration of a timer" +msgstr "إشارة ناتجة عن انتهاء صلاحية المؤقت" + +#: stdio-common/psiginfo.c:149 +msgid "Signal generated by the completion of an asynchronous I/O request" +msgstr "إشارة ناتجة عن اكتمال طلب إدخال/إخراج غير متزامن" + +#: stdio-common/psiginfo.c:153 +msgid "Signal generated by the arrival of a message on an empty message queue" +msgstr "إشارة ناتجة عن وصول رسالة إلى طابور رسائل فارغ" + +#: stdio-common/psiginfo.c:158 +msgid "Signal sent by tkill()" +msgstr "إشارة مرسلة بواسطة tkill()" + +#: stdio-common/psiginfo.c:163 +msgid "Signal generated by the completion of an asynchronous name lookup request" +msgstr "إشارة ناتجة عن اكتمال طلب بحث عن اسم غير متزامن" + +#: stdio-common/psiginfo.c:169 +msgid "Signal generated by the completion of an I/O request" +msgstr "إشارة ناتجة عن اكتمال طلب إدخال/إخراج" + +#: stdio-common/psiginfo.c:175 +msgid "Signal sent by the kernel" +msgstr "إشارة مرسلة من النواة" + +#: stdio-common/psiginfo.c:199 +#, c-format +msgid "Unknown signal %d\n" +msgstr "إشارة غير معروفة %d\n" + +#: stdio-common/psignal.c:43 +#, c-format +msgid "%s%sUnknown signal %d\n" +msgstr "%s%sإشارة غير معروفة %d\n" + +#: stdio-common/psignal.c:44 string/strsignal.c:57 +msgid "Unknown signal" +msgstr "إشارة غير معروفة" + +#: string/_strerror.c:30 sysdeps/mach/_strerror.c:55 +msgid "Unknown error " +msgstr "خطأ غير معروف " + +#: string/strsignal.c:42 +#, c-format +msgid "Real-time signal %d" +msgstr "إشارة وقت حقيقي %d" + +#: string/strsignal.c:46 +#, c-format +msgid "Unknown signal %d" +msgstr "إشارة غير معروفة %d" + +#: sunrpc/auth_unix.c:113 sunrpc/clnt_tcp.c:124 sunrpc/clnt_udp.c:140 +#: sunrpc/clnt_unix.c:125 sunrpc/svc_tcp.c:189 sunrpc/svc_tcp.c:233 +#: sunrpc/svc_udp.c:161 sunrpc/svc_unix.c:187 sunrpc/svc_unix.c:227 +#: sunrpc/xdr.c:631 sunrpc/xdr.c:791 sunrpc/xdr_array.c:102 +#: sunrpc/xdr_rec.c:153 sunrpc/xdr_ref.c:79 +msgid "out of memory\n" +msgstr "نفدت الذاكرة\n" + +#: sunrpc/auth_unix.c:350 +msgid "auth_unix.c: Fatal marshalling problem" +msgstr "auth_unix.c: مشكلة ترتيب (marshalling) فادحة" + +#: sunrpc/clnt_perr.c:92 sunrpc/clnt_perr.c:108 +#, c-format +msgid "%s: %s; low version = %lu, high version = %lu" +msgstr "%s: %s؛ الإصدار الأدنى = %lu، الإصدار الأعلى = %lu" + +#: sunrpc/clnt_perr.c:99 +#, c-format +msgid "%s: %s; why = %s\n" +msgstr "%s: %s؛ السبب = %s\n" + +#: sunrpc/clnt_perr.c:101 +#, c-format +msgid "%s: %s; why = (unknown authentication error - %d)\n" +msgstr "%s: %s؛ السبب = (خطأ استيثاق غير معروف - %d)\n" + +#: sunrpc/clnt_perr.c:150 +msgid "RPC: Success" +msgstr "RPC: نجاح" + +#: sunrpc/clnt_perr.c:153 +msgid "RPC: Can't encode arguments" +msgstr "RPC: يتعذر ترميز المعاملات" + +#: sunrpc/clnt_perr.c:157 +msgid "RPC: Can't decode result" +msgstr "RPC: يتعذر فك ترميز النتيجة" + +#: sunrpc/clnt_perr.c:161 +msgid "RPC: Unable to send" +msgstr "RPC: غير قادر على الإرسال" + +#: sunrpc/clnt_perr.c:165 +msgid "RPC: Unable to receive" +msgstr "RPC: غير قادر على الاستقبال" + +#: sunrpc/clnt_perr.c:169 +msgid "RPC: Timed out" +msgstr "RPC: انتهت المهلة" + +#: sunrpc/clnt_perr.c:173 +msgid "RPC: Incompatible versions of RPC" +msgstr "RPC: إصدارات RPC غير متوافقة" + +#: sunrpc/clnt_perr.c:177 +msgid "RPC: Authentication error" +msgstr "RPC: خطأ استيثاق" + +#: sunrpc/clnt_perr.c:181 +msgid "RPC: Program unavailable" +msgstr "RPC: البرنامج غير متاح" + +#: sunrpc/clnt_perr.c:185 +msgid "RPC: Program/version mismatch" +msgstr "RPC: عدم تطابق البرنامج/الإصدار" + +#: sunrpc/clnt_perr.c:189 +msgid "RPC: Procedure unavailable" +msgstr "RPC: الإجراء غير متاح" + +#: sunrpc/clnt_perr.c:193 +msgid "RPC: Server can't decode arguments" +msgstr "RPC: الخادم لا يمكنه فك ترميز المعاملات" + +#: sunrpc/clnt_perr.c:197 +msgid "RPC: Remote system error" +msgstr "RPC: خطأ في النظام البعيد" + +#: sunrpc/clnt_perr.c:201 +msgid "RPC: Unknown host" +msgstr "RPC: حاسوب غير معروف" + +#: sunrpc/clnt_perr.c:205 +msgid "RPC: Unknown protocol" +msgstr "RPC: بروتوكول غير معروف" + +#: sunrpc/clnt_perr.c:209 +msgid "RPC: Port mapper failure" +msgstr "RPC: فشل مخطط المنافذ" + +#: sunrpc/clnt_perr.c:213 +msgid "RPC: Program not registered" +msgstr "RPC: البرنامج غير مسجل" + +#: sunrpc/clnt_perr.c:217 +msgid "RPC: Failed (unspecified error)" +msgstr "RPC: فشل (خطأ غير محدد)" + +#: sunrpc/clnt_perr.c:258 +msgid "RPC: (unknown error code)" +msgstr "RPC: (رمز خطأ غير معروف)" + +#: sunrpc/clnt_perr.c:334 +msgid "Authentication OK" +msgstr "الاستيثاق مقبول" + +#: sunrpc/clnt_perr.c:337 +msgid "Invalid client credential" +msgstr "أوراق اعتماد العميل غير صالحة" + +#: sunrpc/clnt_perr.c:341 +msgid "Server rejected credential" +msgstr "رفض الخادم أوراق الاعتماد" + +#: sunrpc/clnt_perr.c:345 +msgid "Invalid client verifier" +msgstr "متحقق العميل غير صالح" + +#: sunrpc/clnt_perr.c:349 +msgid "Server rejected verifier" +msgstr "رفض الخادم المتحقق" + +#: sunrpc/clnt_perr.c:353 +msgid "Client credential too weak" +msgstr "أوراق اعتماد العميل ضعيفة جداً" + +#: sunrpc/clnt_perr.c:357 +msgid "Invalid server verifier" +msgstr "متحقق الخادم غير صالح" + +#: sunrpc/clnt_perr.c:361 +msgid "Failed (unspecified error)" +msgstr "فشل (خطأ غير محدد)" + +#: sunrpc/clnt_raw.c:112 +msgid "clnt_raw.c: fatal header serialization error" +msgstr "clnt_raw.c: خطأ تسلسل ترويسة فادح" + +#: sunrpc/pm_getmaps.c:78 +msgid "pmap_getmaps.c: rpc problem" +msgstr "pmap_getmaps.c: مشكلة rpc" + +#: sunrpc/pmap_clnt.c:128 +msgid "Cannot register service" +msgstr "يتعذر تسجيل الخدمة" + +#: sunrpc/pmap_rmt.c:244 +msgid "Cannot create socket for broadcast rpc" +msgstr "يتعذر إنشاء مقبس لـ broadcast rpc" + +#: sunrpc/pmap_rmt.c:251 +msgid "Cannot set socket option SO_BROADCAST" +msgstr "يتعذر ضبط خيار المقبس SO_BROADCAST" + +#: sunrpc/pmap_rmt.c:303 +msgid "Cannot send broadcast packet" +msgstr "يتعذر إرسال حزمة البث" + +#: sunrpc/pmap_rmt.c:328 +msgid "Broadcast poll problem" +msgstr "مشكلة استطلاع البث" + +#: sunrpc/pmap_rmt.c:341 +msgid "Cannot receive reply to broadcast" +msgstr "يتعذر استقبال رد على البث" + +#: sunrpc/svc_run.c:72 +msgid "svc_run: - out of memory" +msgstr "svc_run: - نفدت الذاكرة" + +#: sunrpc/svc_run.c:92 +msgid "svc_run: - poll failed" +msgstr "svc_run: - فشل الاستطلاع (poll)" + +#: sunrpc/svc_simple.c:72 +#, c-format +msgid "can't reassign procedure number %ld\n" +msgstr "يتعذر إعادة تعيين رقم الإجراء %ld\n" + +#: sunrpc/svc_simple.c:82 +msgid "couldn't create an rpc server\n" +msgstr "تعذر إنشاء خادم rpc\n" + +#: sunrpc/svc_simple.c:90 +#, c-format +msgid "couldn't register prog %ld vers %ld\n" +msgstr "تعذر تسجيل البرنامج %ld إصدار %ld\n" + +#: sunrpc/svc_simple.c:98 +msgid "registerrpc: out of memory\n" +msgstr "registerrpc: نفدت الذاكرة\n" + +#: sunrpc/svc_simple.c:161 +#, c-format +msgid "trouble replying to prog %d\n" +msgstr "مشكلة في الرد على البرنامج %d\n" + +#: sunrpc/svc_simple.c:170 +#, c-format +msgid "never registered prog %d\n" +msgstr "لم يُسجل البرنامج %d أبداً\n" + +#: sunrpc/svc_tcp.c:165 +msgid "svc_tcp.c - tcp socket creation problem" +msgstr "svc_tcp.c - مشكلة في إنشاء مقبس tcp" + +#: sunrpc/svc_tcp.c:180 +msgid "svc_tcp.c - cannot getsockname or listen" +msgstr "svc_tcp.c - يتعذر getsockname أو listen" + +#: sunrpc/svc_udp.c:136 +msgid "svcudp_create: socket creation problem" +msgstr "svcudp_create: مشكلة في إنشاء المقبس" + +#: sunrpc/svc_udp.c:150 +msgid "svcudp_create - cannot getsockname" +msgstr "svcudp_create - يتعذر getsockname" + +#: sunrpc/svc_udp.c:182 +msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n" +msgstr "svcudp_create: xp_pad صغير جداً لـ IP_PKTINFO\n" + +#: sunrpc/svc_udp.c:481 +msgid "enablecache: cache already enabled" +msgstr "enablecache: الخبيئة مفعلة بالفعل" + +#: sunrpc/svc_udp.c:487 +msgid "enablecache: could not allocate cache" +msgstr "enablecache: تعذر تخصيص خبيئة" + +#: sunrpc/svc_udp.c:496 +msgid "enablecache: could not allocate cache data" +msgstr "enablecache: تعذر تخصيص بيانات الخبيئة" + +#: sunrpc/svc_udp.c:504 +msgid "enablecache: could not allocate cache fifo" +msgstr "enablecache: تعذر تخصيص fifo للخبيئة" + +#: sunrpc/svc_udp.c:540 +msgid "cache_set: victim not found" +msgstr "cache_set: لم يُعثر على الضحية" + +#: sunrpc/svc_udp.c:551 +msgid "cache_set: victim alloc failed" +msgstr "cache_set: فشل تخصيص الضحية" + +#: sunrpc/svc_udp.c:558 +msgid "cache_set: could not allocate new rpc_buffer" +msgstr "cache_set: تعذر تخصيص rpc_buffer جديد" + +#: sunrpc/svc_unix.c:167 +msgid "svc_unix.c - AF_UNIX socket creation problem" +msgstr "svc_unix.c - مشكلة في إنشاء مقبس AF_UNIX" + +#: sunrpc/svc_unix.c:177 +msgid "svc_unix.c - cannot getsockname or listen" +msgstr "svc_unix.c - يتعذر getsockname أو listen" + +#: sysdeps/generic/dl-protected.h:55 +msgid "error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS" +msgstr "خطأ بسبب GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS" + +#: sysdeps/generic/siglist.h:29 +msgid "Hangup" +msgstr "تعليق" + +#: sysdeps/generic/siglist.h:30 +msgid "Interrupt" +msgstr "مقاطعة" + +#: sysdeps/generic/siglist.h:31 +msgid "Quit" +msgstr "إنهاء" + +#: sysdeps/generic/siglist.h:32 +msgid "Illegal instruction" +msgstr "تعليمة غير قانونية" + +#: sysdeps/generic/siglist.h:33 +msgid "Trace/breakpoint trap" +msgstr "مصيدة تتبع/نقطة توقف" + +#: sysdeps/generic/siglist.h:34 +msgid "Aborted" +msgstr "أُجهض" + +#: sysdeps/generic/siglist.h:35 +msgid "Floating point exception" +msgstr "استثناء فاصلة عائمة" + +#: sysdeps/generic/siglist.h:36 +msgid "Killed" +msgstr "قُتل" + +#: sysdeps/generic/siglist.h:37 +msgid "Bus error" +msgstr "خطأ ناقل" + +#: sysdeps/generic/siglist.h:38 +msgid "Bad system call" +msgstr "نداء نظام سيئ" + +#: sysdeps/generic/siglist.h:39 +msgid "Segmentation fault" +msgstr "خطأ في التقسيم" + +#. TRANS There is no process reading from the other end of a pipe. +#. TRANS Every library function that returns this error code also generates a +#. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled +#. TRANS or blocked. Thus, your program will never actually see @code{EPIPE} +#. TRANS unless it has handled or blocked @code{SIGPIPE}. +#: sysdeps/generic/siglist.h:40 sysdeps/gnu/errlist.h:216 +msgid "Broken pipe" +msgstr "أنبوب مكسور" + +#: sysdeps/generic/siglist.h:41 +msgid "Alarm clock" +msgstr "ساعة منبه" + +#: sysdeps/generic/siglist.h:42 +msgid "Terminated" +msgstr "أُنهي" + +#: sysdeps/generic/siglist.h:43 +msgid "Urgent I/O condition" +msgstr "حالة إدخال/إخراج عاجلة" + +#: sysdeps/generic/siglist.h:44 +msgid "Stopped (signal)" +msgstr "توقف (إشارة)" + +#: sysdeps/generic/siglist.h:45 +msgid "Stopped" +msgstr "توقف" + +#: sysdeps/generic/siglist.h:46 +msgid "Continued" +msgstr "استمر" + +#: sysdeps/generic/siglist.h:47 +msgid "Child exited" +msgstr "خرج الابن" + +#: sysdeps/generic/siglist.h:48 +msgid "Stopped (tty input)" +msgstr "توقف (مدخلات tty)" + +#: sysdeps/generic/siglist.h:49 +msgid "Stopped (tty output)" +msgstr "توقف (مخرجات tty)" + +#: sysdeps/generic/siglist.h:50 +msgid "I/O possible" +msgstr "إدخال/إخراج ممكن" + +#: sysdeps/generic/siglist.h:51 +msgid "CPU time limit exceeded" +msgstr "تجاوز حد وقت المعالج" + +#: sysdeps/generic/siglist.h:52 +msgid "File size limit exceeded" +msgstr "تجاوز حد حجم الملف" + +#: sysdeps/generic/siglist.h:53 +msgid "Virtual timer expired" +msgstr "انتهى المؤقت الافتراضي" + +#: sysdeps/generic/siglist.h:54 +msgid "Profiling timer expired" +msgstr "انتهى مؤقت التحليل (Profiling)" + +#: sysdeps/generic/siglist.h:55 +msgid "User defined signal 1" +msgstr "إشارة معرفة من المستخدم 1" + +#: sysdeps/generic/siglist.h:56 +msgid "User defined signal 2" +msgstr "إشارة معرفة من المستخدم 2" + +#: sysdeps/generic/siglist.h:57 +msgid "Window changed" +msgstr "تغيرت النافذة" + +#: sysdeps/generic/siglist.h:61 +msgid "EMT trap" +msgstr "مصيدة EMT" + +#: sysdeps/generic/siglist.h:64 +msgid "Stack fault" +msgstr "خطأ في المكدس" + +#: sysdeps/generic/siglist.h:67 +msgid "Power failure" +msgstr "فشل الطاقة" + +#: sysdeps/generic/siglist.h:70 +msgid "Information request" +msgstr "طلب معلومات" + +#: sysdeps/generic/siglist.h:73 +msgid "Resource lost" +msgstr "فُقد المورد" + +#. TRANS Only the owner of the file (or other resource) +#. TRANS or processes with special privileges can perform the operation. +#: sysdeps/gnu/errlist.h:6 +msgid "Operation not permitted" +msgstr "العملية غير مسموح بها" + +#. TRANS No process matches the specified process ID. +#: sysdeps/gnu/errlist.h:18 +msgid "No such process" +msgstr "لا توجد عملية كهذه" + +#. TRANS An asynchronous signal occurred and prevented +#. TRANS completion of the call. When this happens, you should try the call +#. TRANS again. +#. TRANS +#. TRANS You can choose to have functions resume after a signal that is handled, +#. TRANS rather than failing with @code{EINTR}; see @ref{Interrupted +#. TRANS Primitives}. +#: sysdeps/gnu/errlist.h:29 +msgid "Interrupted system call" +msgstr "نداء نظام مقطوع" + +#. TRANS Usually used for physical read or write errors. +#: sysdeps/gnu/errlist.h:34 +msgid "Input/output error" +msgstr "خطأ إدخال/إخراج" + +#. TRANS The system tried to use the device +#. TRANS represented by a file you specified, and it couldn't find the device. +#. TRANS This can mean that the device file was installed incorrectly, or that +#. TRANS the physical device is missing or not correctly attached to the +#. TRANS computer. +#: sysdeps/gnu/errlist.h:43 +msgid "No such device or address" +msgstr "لا يوجد جهاز أو عنوان كهذا" + +#. TRANS Used when the arguments passed to a new program +#. TRANS being executed with one of the @code{exec} functions (@pxref{Executing a +#. TRANS File}) occupy too much memory space. This condition never arises on +#. TRANS @gnuhurdsystems{}. +#: sysdeps/gnu/errlist.h:51 +msgid "Argument list too long" +msgstr "قائمة المعاملات طويلة جداً" + +#. TRANS Invalid executable file format. This condition is detected by the +#. TRANS @code{exec} functions; see @ref{Executing a File}. +#: sysdeps/gnu/errlist.h:57 +msgid "Exec format error" +msgstr "خطأ في تنسيق التنفيذ" + +#. TRANS For example, I/O on a descriptor that has been +#. TRANS closed or reading from a descriptor open only for writing (or vice +#. TRANS versa). +#: sysdeps/gnu/errlist.h:64 +msgid "Bad file descriptor" +msgstr "واصف ملف سيئ" + +#. TRANS This error happens on operations that are +#. TRANS supposed to manipulate child processes, when there aren't any processes +#. TRANS to manipulate. +#: sysdeps/gnu/errlist.h:71 +msgid "No child processes" +msgstr "لا توجد عمليات أبناء" + +#. TRANS Allocating a system resource would have resulted in a +#. TRANS deadlock situation. The system does not guarantee that it will notice +#. TRANS all such situations. This error means you got lucky and the system +#. TRANS noticed; it might just hang. @xref{File Locks}, for an example. +#: sysdeps/gnu/errlist.h:79 +msgid "Resource deadlock avoided" +msgstr "تُجنب مأزق (deadlock) المورد" + +#. TRANS The system cannot allocate more virtual memory +#. TRANS because its capacity is full. +#: sysdeps/gnu/errlist.h:85 +msgid "Cannot allocate memory" +msgstr "يتعذر تخصيص ذاكرة" + +#. TRANS An invalid pointer was detected. +#. TRANS On @gnuhurdsystems{}, this error never happens; you get a signal instead. +#: sysdeps/gnu/errlist.h:96 +msgid "Bad address" +msgstr "عنوان سيئ" + +#. TRANS A file that isn't a block special file was given in a situation that +#. TRANS requires one. For example, trying to mount an ordinary file as a file +#. TRANS system in Unix gives this error. +#: sysdeps/gnu/errlist.h:103 +msgid "Block device required" +msgstr "مطلوب جهاز كتلوي" + +#. TRANS A system resource that can't be shared is already in use. +#. TRANS For example, if you try to delete a file that is the root of a currently +#. TRANS mounted filesystem, you get this error. +#: sysdeps/gnu/errlist.h:110 +msgid "Device or resource busy" +msgstr "الجهاز أو المورد مشغول" + +#. TRANS An existing file was specified in a context where it only +#. TRANS makes sense to specify a new file. +#: sysdeps/gnu/errlist.h:116 +msgid "File exists" +msgstr "الملف موجود" + +#. TRANS An attempt to make an improper link across file systems was detected. +#. TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but +#. TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}). +#: sysdeps/gnu/errlist.h:123 +msgid "Invalid cross-device link" +msgstr "رابط عبر الأجهزة غير صالح" + +#. TRANS The wrong type of device was given to a function that expects a +#. TRANS particular sort of device. +#: sysdeps/gnu/errlist.h:129 +msgid "No such device" +msgstr "لا يوجد جهاز كهذا" + +#. TRANS A file that isn't a directory was specified when a directory is required. +#: sysdeps/gnu/errlist.h:134 +msgid "Not a directory" +msgstr "ليس دليلاً" + +#. TRANS You cannot open a directory for writing, +#. TRANS or create or remove hard links to it. +#: sysdeps/gnu/errlist.h:140 +msgid "Is a directory" +msgstr "إنه دليل" + +#. TRANS This is used to indicate various kinds of problems +#. TRANS with passing the wrong argument to a library function. +#: sysdeps/gnu/errlist.h:146 +msgid "Invalid argument" +msgstr "معامل غير صالح" + +#. TRANS The current process has too many files open and can't open any more. +#. TRANS Duplicate descriptors do count toward this limit. +#. TRANS +#. TRANS In BSD and GNU, the number of open files is controlled by a resource +#. TRANS limit that can usually be increased. If you get this error, you might +#. TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited; +#. TRANS @pxref{Limits on Resources}. +#: sysdeps/gnu/errlist.h:157 +msgid "Too many open files" +msgstr "ملفات مفتوحة كثيرة جداً" + +#. TRANS There are too many distinct file openings in the entire system. Note +#. TRANS that any number of linked channels count as just one file opening; see +#. TRANS @ref{Linked Channels}. This error never occurs on @gnuhurdsystems{}. +#: sysdeps/gnu/errlist.h:164 +msgid "Too many open files in system" +msgstr "ملفات مفتوحة كثيرة جداً في النظام" + +#. TRANS Inappropriate I/O control operation, such as trying to set terminal +#. TRANS modes on an ordinary file. +#: sysdeps/gnu/errlist.h:170 +msgid "Inappropriate ioctl for device" +msgstr "ioctl غير مناسب للجهاز" + +#. TRANS An attempt to execute a file that is currently open for writing, or +#. TRANS write to a file that is currently being executed. Often using a +#. TRANS debugger to run a program is considered having it open for writing and +#. TRANS will cause this error. (The name stands for ``text file busy''.) This +#. TRANS is not an error on @gnuhurdsystems{}; the text is copied as necessary. +#: sysdeps/gnu/errlist.h:179 +msgid "Text file busy" +msgstr "ملف نصي مشغول" + +#. TRANS The size of a file would be larger than allowed by the system. +#: sysdeps/gnu/errlist.h:184 +msgid "File too large" +msgstr "الملف كبير جداً" + +#. TRANS Write operation on a file failed because the +#. TRANS disk is full. +#: sysdeps/gnu/errlist.h:190 +msgid "No space left on device" +msgstr "لم تتبقَ مساحة على الجهاز" + +#. TRANS Invalid seek operation (such as on a pipe). +#: sysdeps/gnu/errlist.h:195 +msgid "Illegal seek" +msgstr "عملية بحث (seek) غير قانونية" + +#. TRANS An attempt was made to modify something on a read-only file system. +#: sysdeps/gnu/errlist.h:200 +msgid "Read-only file system" +msgstr "نظام ملفات للقراءة فقط" + +#. TRANS The link count of a single file would become too large. +#. TRANS @code{rename} can cause this error if the file being renamed already has +#. TRANS as many links as it can take (@pxref{Renaming Files}). +#: sysdeps/gnu/errlist.h:207 +msgid "Too many links" +msgstr "روابط كثيرة جداً" + +#. TRANS Used by mathematical functions when an argument value does +#. TRANS not fall into the domain over which the function is defined. +#: sysdeps/gnu/errlist.h:222 +msgid "Numerical argument out of domain" +msgstr "المعامل الرقمي خارج النطاق" + +#. TRANS Used by mathematical functions when the result value is +#. TRANS not representable because of overflow or underflow. +#: sysdeps/gnu/errlist.h:228 +msgid "Numerical result out of range" +msgstr "النتيجة الرقمية خارج النطاق" + +#. TRANS The call might work if you try again +#. TRANS later. The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN}; +#. TRANS they are always the same in @theglibc{}. +#. TRANS +#. TRANS This error can happen in a few different situations: +#. TRANS +#. TRANS @itemize @bullet +#. TRANS @item +#. TRANS An operation that would block was attempted on an object that has +#. TRANS non-blocking mode selected. Trying the same operation again will block +#. TRANS until some external condition makes it possible to read, write, or +#. TRANS connect (whatever the operation). You can use @code{select} to find out +#. TRANS when the operation will be possible; @pxref{Waiting for I/O}. +#. TRANS +#. TRANS @strong{Portability Note:} In many older Unix systems, this condition +#. TRANS was indicated by @code{EWOULDBLOCK}, which was a distinct error code +#. TRANS different from @code{EAGAIN}. To make your program portable, you should +#. TRANS check for both codes and treat them the same. +#. TRANS +#. TRANS @item +#. TRANS A temporary resource shortage made an operation impossible. @code{fork} +#. TRANS can return this error. It indicates that the shortage is expected to +#. TRANS pass, so your program can try the call again later and it may succeed. +#. TRANS It is probably a good idea to delay for a few seconds before trying it +#. TRANS again, to allow time for other processes to release scarce resources. +#. TRANS Such shortages are usually fairly serious and affect the whole system, +#. TRANS so usually an interactive program should report the error to the user +#. TRANS and return to its command loop. +#. TRANS @end itemize +#: sysdeps/gnu/errlist.h:261 +msgid "Resource temporarily unavailable" +msgstr "المورد غير متاح مؤقتاً" + +#. TRANS An operation that cannot complete immediately was initiated on an object +#. TRANS that has non-blocking mode selected. Some functions that must always +#. TRANS block (such as @code{connect}; @pxref{Connecting}) never return +#. TRANS @code{EAGAIN}. Instead, they return @code{EINPROGRESS} to indicate that +#. TRANS the operation has begun and will take some time. Attempts to manipulate +#. TRANS the object before the call completes return @code{EALREADY}. You can +#. TRANS use the @code{select} function to find out when the pending operation +#. TRANS has completed; @pxref{Waiting for I/O}. +#: sysdeps/gnu/errlist.h:273 +msgid "Operation now in progress" +msgstr "العملية جارية الآن" + +#. TRANS An operation is already in progress on an object that has non-blocking +#. TRANS mode selected. +#: sysdeps/gnu/errlist.h:279 +msgid "Operation already in progress" +msgstr "العملية جارية بالفعل" + +#. TRANS A file that isn't a socket was specified when a socket is required. +#: sysdeps/gnu/errlist.h:284 +msgid "Socket operation on non-socket" +msgstr "عملية مقبس على غير مقبس" + +#. TRANS The size of a message sent on a socket was larger than the supported +#. TRANS maximum size. +#: sysdeps/gnu/errlist.h:290 +msgid "Message too long" +msgstr "الرسالة طويلة جداً" + +#. TRANS The socket type does not support the requested communications protocol. +#: sysdeps/gnu/errlist.h:295 +msgid "Protocol wrong type for socket" +msgstr "نوع بروتوكول خاطئ للمقبس" + +#. TRANS You specified a socket option that doesn't make sense for the +#. TRANS particular protocol being used by the socket. @xref{Socket Options}. +#: sysdeps/gnu/errlist.h:301 +msgid "Protocol not available" +msgstr "البروتوكول غير متاح" + +#. TRANS The socket domain does not support the requested communications protocol +#. TRANS (perhaps because the requested protocol is completely invalid). +#. TRANS @xref{Creating a Socket}. +#: sysdeps/gnu/errlist.h:308 +msgid "Protocol not supported" +msgstr "البروتوكول غير مدعوم" + +#. TRANS The socket type is not supported. +#: sysdeps/gnu/errlist.h:313 +msgid "Socket type not supported" +msgstr "نوع المقبس غير مدعوم" + +#. TRANS The operation you requested is not supported. Some socket functions +#. TRANS don't make sense for all types of sockets, and others may not be +#. TRANS implemented for all communications protocols. On @gnuhurdsystems{}, this +#. TRANS error can happen for many calls when the object does not support the +#. TRANS particular operation; it is a generic indication that the server knows +#. TRANS nothing to do for that call. +#: sysdeps/gnu/errlist.h:323 +msgid "Operation not supported" +msgstr "العملية غير مدعومة" + +#. TRANS The socket communications protocol family you requested is not supported. +#: sysdeps/gnu/errlist.h:328 +msgid "Protocol family not supported" +msgstr "عائلة البروتوكولات غير مدعومة" + +#. TRANS The address family specified for a socket is not supported; it is +#. TRANS inconsistent with the protocol being used on the socket. @xref{Sockets}. +#: sysdeps/gnu/errlist.h:334 +msgid "Address family not supported by protocol" +msgstr "عائلة العناوين غير مدعومة من البروتوكول" + +#. TRANS The requested socket address is already in use. @xref{Socket Addresses}. +#: sysdeps/gnu/errlist.h:339 +msgid "Address already in use" +msgstr "العنوان مستخدم بالفعل" + +#. TRANS The requested socket address is not available; for example, you tried +#. TRANS to give a socket a name that doesn't match the local host name. +#. TRANS @xref{Socket Addresses}. +#: sysdeps/gnu/errlist.h:346 +msgid "Cannot assign requested address" +msgstr "يتعذر تعيين العنوان المطلوب" + +#. TRANS A socket operation failed because the network was down. +#: sysdeps/gnu/errlist.h:351 +msgid "Network is down" +msgstr "الشبكة متوقفة" + +#. TRANS A socket operation failed because the subnet containing the remote host +#. TRANS was unreachable. +#: sysdeps/gnu/errlist.h:357 +msgid "Network is unreachable" +msgstr "لا يمكن الوصول للشبكة" + +#. TRANS A network connection was reset because the remote host crashed. +#: sysdeps/gnu/errlist.h:362 +msgid "Network dropped connection on reset" +msgstr "أسقطت الشبكة الاتصال عند إعادة الضبط" + +#. TRANS A network connection was aborted locally. +#: sysdeps/gnu/errlist.h:367 +msgid "Software caused connection abort" +msgstr "تسبب برنامج في إجهاض الاتصال" + +#. TRANS A network connection was closed for reasons outside the control of the +#. TRANS local host, such as by the remote machine rebooting or an unrecoverable +#. TRANS protocol violation. +#: sysdeps/gnu/errlist.h:374 +msgid "Connection reset by peer" +msgstr "أعاد الند ضبط الاتصال" + +#. TRANS The kernel's buffers for I/O operations are all in use. In GNU, this +#. TRANS error is always synonymous with @code{ENOMEM}; you may get one or the +#. TRANS other from network operations. +#: sysdeps/gnu/errlist.h:381 +msgid "No buffer space available" +msgstr "لا تتوفر مساحة في المخزن المؤقت" + +#. TRANS You tried to connect a socket that is already connected. +#. TRANS @xref{Connecting}. +#: sysdeps/gnu/errlist.h:387 +msgid "Transport endpoint is already connected" +msgstr "نقطة نهاية النقل متصلة بالفعل" + +#. TRANS The socket is not connected to anything. You get this error when you +#. TRANS try to transmit data over a socket, without first specifying a +#. TRANS destination for the data. For a connectionless socket (for datagram +#. TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead. +#: sysdeps/gnu/errlist.h:395 +msgid "Transport endpoint is not connected" +msgstr "نقطة نهاية النقل غير متصلة" + +#. TRANS No default destination address was set for the socket. You get this +#. TRANS error when you try to transmit data over a connectionless socket, +#. TRANS without first specifying a destination for the data with @code{connect}. +#: sysdeps/gnu/errlist.h:402 +msgid "Destination address required" +msgstr "عنوان الوجهة مطلوب" + +#. TRANS The socket has already been shut down. +#: sysdeps/gnu/errlist.h:407 +msgid "Cannot send after transport endpoint shutdown" +msgstr "لا يمكن الإرسال بعد إغلاق نقطة نهاية النقل" + +#: sysdeps/gnu/errlist.h:410 +msgid "Too many references: cannot splice" +msgstr "مراجع كثيرة جداً: لا يمكن الوصل" + +#. TRANS A socket operation with a specified timeout received no response during +#. TRANS the timeout period. +#: sysdeps/gnu/errlist.h:416 +msgid "Connection timed out" +msgstr "انتهت مهلة الاتصال" + +#. TRANS A remote host refused to allow the network connection (typically because +#. TRANS it is not running the requested service). +#: sysdeps/gnu/errlist.h:422 +msgid "Connection refused" +msgstr "رُفض الاتصال" + +#. TRANS Too many levels of symbolic links were encountered in looking up a file name. +#. TRANS This often indicates a cycle of symbolic links. +#: sysdeps/gnu/errlist.h:428 +msgid "Too many levels of symbolic links" +msgstr "مستويات كثيرة جداً من الروابط الرمزية" + +#. TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for +#. TRANS Files}) or host name too long (in @code{gethostname} or +#. TRANS @code{sethostname}; @pxref{Host Identification}). +#: sysdeps/gnu/errlist.h:435 +msgid "File name too long" +msgstr "اسم الملف طويل جداً" + +#. TRANS The remote host for a requested network connection is down. +#: sysdeps/gnu/errlist.h:440 +msgid "Host is down" +msgstr "المضيف متوقف" + +#: sysdeps/gnu/errlist.h:445 +msgid "No route to host" +msgstr "لا يوجد مسار للمضيف" + +#. TRANS Directory not empty, where an empty directory was expected. Typically, +#. TRANS this error occurs when you are trying to delete a directory. +#: sysdeps/gnu/errlist.h:451 +msgid "Directory not empty" +msgstr "الدليل ليس فارغاً" + +#. TRANS The file quota system is confused because there are too many users. +#. TRANS @c This can probably happen in a GNU system when using NFS. +#: sysdeps/gnu/errlist.h:457 +msgid "Too many users" +msgstr "مستخدمون كثيرون جداً" + +#. TRANS The user's disk quota was exceeded. +#: sysdeps/gnu/errlist.h:462 +msgid "Disk quota exceeded" +msgstr "تجاوزت حصة القرص" + +#. TRANS This indicates an internal confusion in the +#. TRANS file system which is due to file system rearrangements on the server host +#. TRANS for NFS file systems or corruption in other file systems. +#. TRANS Repairing this condition usually requires unmounting, possibly repairing +#. TRANS and remounting the file system. +#: sysdeps/gnu/errlist.h:471 +msgid "Stale file handle" +msgstr "مقبض ملف قديم" + +#. TRANS An attempt was made to NFS-mount a remote file system with a file name that +#. TRANS already specifies an NFS-mounted file. +#. TRANS (This is an error on some operating systems, but we expect it to work +#. TRANS properly on @gnuhurdsystems{}, making this error code impossible.) +#: sysdeps/gnu/errlist.h:479 +msgid "Object is remote" +msgstr "الكائن بعيد" + +#. TRANS This is used by the file locking facilities; see +#. TRANS @ref{File Locks}. This error is never generated by @gnuhurdsystems{}, but +#. TRANS it can result from an operation to an NFS server running another +#. TRANS operating system. +#: sysdeps/gnu/errlist.h:487 +msgid "No locks available" +msgstr "لا توجد أقفال متاحة" + +#. TRANS This indicates that the function called is +#. TRANS not implemented at all, either in the C library itself or in the +#. TRANS operating system. When you get this error, you can be sure that this +#. TRANS particular function will always fail with @code{ENOSYS} unless you +#. TRANS install a new version of the C library or the operating system. +#: sysdeps/gnu/errlist.h:496 +msgid "Function not implemented" +msgstr "الدالة غير مدعومة" + +#. TRANS While decoding a multibyte character the function came along an invalid +#. TRANS or an incomplete sequence of bytes or the given wide character is invalid. +#: sysdeps/gnu/errlist.h:502 +msgid "Invalid or incomplete multibyte or wide character" +msgstr "محرف متعدد البايتات أو عريض غير صالح أو غير مكتمل" + +#: sysdeps/gnu/errlist.h:505 +msgid "Bad message" +msgstr "رسالة سيئة" + +#: sysdeps/gnu/errlist.h:508 +msgid "Identifier removed" +msgstr "أزيل المعرف" + +#: sysdeps/gnu/errlist.h:511 +msgid "Multihop attempted" +msgstr "محاولة قفزات متعددة" + +#: sysdeps/gnu/errlist.h:514 +msgid "No data available" +msgstr "لا تتوفر بيانات" + +#: sysdeps/gnu/errlist.h:517 +msgid "Link has been severed" +msgstr "انقطع الرابط" + +#: sysdeps/gnu/errlist.h:520 +msgid "No message of desired type" +msgstr "لا توجد رسالة من النوع المطلوب" + +#: sysdeps/gnu/errlist.h:523 +msgid "Out of streams resources" +msgstr "نفاد موارد الدفق" + +#: sysdeps/gnu/errlist.h:526 +msgid "Device not a stream" +msgstr "الجهاز ليس دفقاً" + +#: sysdeps/gnu/errlist.h:529 +msgid "Value too large for defined data type" +msgstr "القيمة كبيرة جداً لنوع البيانات المحدد" + +#: sysdeps/gnu/errlist.h:532 +msgid "Protocol error" +msgstr "خطأ في البروتوكول" + +#: sysdeps/gnu/errlist.h:535 +msgid "Timer expired" +msgstr "انتهى المؤقت" + +#. TRANS An asynchronous operation was canceled before it +#. TRANS completed. @xref{Asynchronous I/O}. When you call @code{aio_cancel}, +#. TRANS the normal result is for the operations affected to complete with this +#. TRANS error; @pxref{Cancel AIO Operations}. +#: sysdeps/gnu/errlist.h:543 +msgid "Operation canceled" +msgstr "أُلغيت العملية" + +#: sysdeps/gnu/errlist.h:546 +msgid "Owner died" +msgstr "توفي المالك" + +#: sysdeps/gnu/errlist.h:549 +msgid "State not recoverable" +msgstr "حالة لا يمكن استردادها" + +#: sysdeps/gnu/errlist.h:552 +msgid "Interrupted system call should be restarted" +msgstr "يجب إعادة تشغيل نداء النظام المقاطع" + +#: sysdeps/gnu/errlist.h:555 +msgid "Channel number out of range" +msgstr "رقم القناة خارج النطاق" + +#: sysdeps/gnu/errlist.h:558 +msgid "Level 2 not synchronized" +msgstr "المستوى 2 غير متزامن" + +#: sysdeps/gnu/errlist.h:561 +msgid "Level 3 halted" +msgstr "توقف المستوى 3" + +#: sysdeps/gnu/errlist.h:564 +msgid "Level 3 reset" +msgstr "إعادة ضبط المستوى 3" + +#: sysdeps/gnu/errlist.h:567 +msgid "Link number out of range" +msgstr "رقم الرابط خارج النطاق" + +#: sysdeps/gnu/errlist.h:570 +msgid "Protocol driver not attached" +msgstr "برنامج تشغيل البروتوكول غير متصل" + +#: sysdeps/gnu/errlist.h:573 +msgid "No CSI structure available" +msgstr "لا يتوفر هيكل CSI" + +#: sysdeps/gnu/errlist.h:576 +msgid "Level 2 halted" +msgstr "توقف المستوى 2" + +#: sysdeps/gnu/errlist.h:579 +msgid "Invalid exchange" +msgstr "تبادل غير صالح" + +#: sysdeps/gnu/errlist.h:582 +msgid "Invalid request descriptor" +msgstr "واصف طلب غير صالح" + +#: sysdeps/gnu/errlist.h:585 +msgid "Exchange full" +msgstr "التبادل ممتلئ" + +#: sysdeps/gnu/errlist.h:588 +msgid "No anode" +msgstr "لا توجد مصعدة (anode)" + +#: sysdeps/gnu/errlist.h:591 +msgid "Invalid request code" +msgstr "رمز طلب غير صالح" + +#: sysdeps/gnu/errlist.h:594 +msgid "Invalid slot" +msgstr "فتحة غير صالحة" + +#: sysdeps/gnu/errlist.h:597 +msgid "File locking deadlock error" +msgstr "خطأ مأزق قفل الملف" + +#: sysdeps/gnu/errlist.h:600 +msgid "Bad font file format" +msgstr "تنسيق ملف خط سيء" + +#: sysdeps/gnu/errlist.h:603 +msgid "Machine is not on the network" +msgstr "الجهاز ليس على الشبكة" + +#: sysdeps/gnu/errlist.h:606 +msgid "Package not installed" +msgstr "الحزمة غير مثبتة" + +#: sysdeps/gnu/errlist.h:609 +msgid "Advertise error" +msgstr "خطأ إعلان" + +#: sysdeps/gnu/errlist.h:612 +msgid "Srmount error" +msgstr "خطأ Srmount" + +#: sysdeps/gnu/errlist.h:615 +msgid "Communication error on send" +msgstr "خطأ اتصال عند الإرسال" + +#: sysdeps/gnu/errlist.h:618 +msgid "RFS specific error" +msgstr "خطأ خاص بـ RFS" + +#: sysdeps/gnu/errlist.h:621 +msgid "Name not unique on network" +msgstr "الاسم ليس فريداً على الشبكة" + +#: sysdeps/gnu/errlist.h:624 +msgid "File descriptor in bad state" +msgstr "واصف الملف في حالة سيئة" + +#: sysdeps/gnu/errlist.h:627 +msgid "Remote address changed" +msgstr "تغير العنوان البعيد" + +#: sysdeps/gnu/errlist.h:630 +msgid "Can not access a needed shared library" +msgstr "لا يمكن الوصول إلى مكتبة مشتركة مطلوبة" + +#: sysdeps/gnu/errlist.h:633 +msgid "Accessing a corrupted shared library" +msgstr "الوصول إلى مكتبة مشتركة تالفة" + +#: sysdeps/gnu/errlist.h:636 +msgid ".lib section in a.out corrupted" +msgstr "مقطع .lib في a.out تالف" + +#: sysdeps/gnu/errlist.h:639 +msgid "Attempting to link in too many shared libraries" +msgstr "محاولة ربط عدد كبير جداً من المكتبات المشتركة" + +#: sysdeps/gnu/errlist.h:642 +msgid "Cannot exec a shared library directly" +msgstr "لا يمكن تنفيذ مكتبة مشتركة مباشرة" + +#: sysdeps/gnu/errlist.h:645 +msgid "Streams pipe error" +msgstr "خطأ في أنبوب الدفق" + +#: sysdeps/gnu/errlist.h:648 +msgid "Structure needs cleaning" +msgstr "الهيكل يحتاج إلى تنظيف" + +#: sysdeps/gnu/errlist.h:651 +msgid "Not a XENIX named type file" +msgstr "ليس ملف نوع مسمى XENIX" + +#: sysdeps/gnu/errlist.h:654 +msgid "No XENIX semaphores available" +msgstr "لا تتوفر إشارات XENIX" + +#: sysdeps/gnu/errlist.h:657 +msgid "Is a named type file" +msgstr "هو ملف نوع مسمى" + +#: sysdeps/gnu/errlist.h:660 +msgid "Remote I/O error" +msgstr "خطأ إدخال/إخراج بعيد" + +#: sysdeps/gnu/errlist.h:663 +msgid "No medium found" +msgstr "لم يتم العثور على وسيط" + +#: sysdeps/gnu/errlist.h:666 +msgid "Wrong medium type" +msgstr "نوع وسيط خاطئ" + +#: sysdeps/gnu/errlist.h:669 +msgid "Required key not available" +msgstr "المفتاح المطلوب غير متاح" + +#: sysdeps/gnu/errlist.h:672 +msgid "Key has expired" +msgstr "انتهت صلاحية المفتاح" + +#: sysdeps/gnu/errlist.h:675 +msgid "Key has been revoked" +msgstr "أُلغي المفتاح" + +#: sysdeps/gnu/errlist.h:678 +msgid "Key was rejected by service" +msgstr "رفضت الخدمة المفتاح" + +#: sysdeps/gnu/errlist.h:681 +msgid "Operation not possible due to RF-kill" +msgstr "العملية غير ممكنة بسبب RF-kill" + +#: sysdeps/gnu/errlist.h:684 +msgid "Memory page has hardware error" +msgstr "صفحة الذاكرة بها خطأ عتادي" + +#: sysdeps/gnu/errlist.h:687 +msgid "RPC struct is bad" +msgstr "هيكل RPC سيء" + +#. TRANS The file was the wrong type for the +#. TRANS operation, or a data file had the wrong format. +#. TRANS +#. TRANS On some systems @code{chmod} returns this error if you try to set the +#. TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}. +#: sysdeps/gnu/errlist.h:696 +msgid "Inappropriate file type or format" +msgstr "نوع ملف أو تنسيق غير ملائم" + +#: sysdeps/gnu/errlist.h:699 +msgid "RPC bad procedure for program" +msgstr "إجراء RPC سيء للبرنامج" + +#: sysdeps/gnu/errlist.h:702 +msgid "Authentication error" +msgstr "خطأ في الاستيثاق" + +#. TRANS On @gnuhurdsystems{}, opening a file returns this error when the file is +#. TRANS translated by a program and the translator program dies while starting +#. TRANS up, before it has connected to the file. +#: sysdeps/gnu/errlist.h:709 +msgid "Translator died" +msgstr "توقف المترجم" + +#: sysdeps/gnu/errlist.h:712 +msgid "RPC version wrong" +msgstr "إصدار RPC خاطئ" + +#. TRANS You did @strong{what}? +#: sysdeps/gnu/errlist.h:717 +msgid "You really blew it this time" +msgstr "لقد أفسدت الأمر حقاً هذه المرة" + +#. TRANS This means that the per-user limit on new process would be exceeded by +#. TRANS an attempted @code{fork}. @xref{Limits on Resources}, for details on +#. TRANS the @code{RLIMIT_NPROC} limit. +#: sysdeps/gnu/errlist.h:724 +msgid "Too many processes" +msgstr "عمليات كثيرة جداً" + +#. TRANS This error code has no purpose. +#: sysdeps/gnu/errlist.h:729 +msgid "Gratuitous error" +msgstr "خطأ مجاني" + +#. TRANS A function returns this error when certain parameter +#. TRANS values are valid, but the functionality they request is not available. +#. TRANS This can mean that the function does not implement a particular command +#. TRANS or option value or flag bit at all. For functions that operate on some +#. TRANS object given in a parameter, such as a file descriptor or a port, it +#. TRANS might instead mean that only @emph{that specific object} (file +#. TRANS descriptor, port, etc.) is unable to support the other parameters given; +#. TRANS different file descriptors might support different ranges of parameter +#. TRANS values. +#. TRANS +#. TRANS If the entire function is not available at all in the implementation, +#. TRANS it returns @code{ENOSYS} instead. +#: sysdeps/gnu/errlist.h:745 +msgid "Not supported" +msgstr "غير مدعوم" + +#: sysdeps/gnu/errlist.h:748 +msgid "RPC program version wrong" +msgstr "إصدار برنامج RPC خاطئ" + +#. TRANS On @gnuhurdsystems{}, servers supporting the @code{term} protocol return +#. TRANS this error for certain operations when the caller is not in the +#. TRANS foreground process group of the terminal. Users do not usually see this +#. TRANS error because functions such as @code{read} and @code{write} translate +#. TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal. @xref{Job Control}, +#. TRANS for information on process groups and these signals. +#: sysdeps/gnu/errlist.h:758 +msgid "Inappropriate operation for background process" +msgstr "عملية غير ملائمة لعملية خلفية" + +#. TRANS Go home and have a glass of warm, dairy-fresh milk. +#. TRANS @c Okay. Since you are dying to know, I'll tell you. +#. TRANS @c This is a joke, obviously. There is a children's song which begins, +#. TRANS @c "Old McDonald had a farm, e-i-e-i-o." Every time I see the (real) +#. TRANS @c errno macro EIO, I think about that song. Probably most of my +#. TRANS @c compatriots who program on Unix do, too. One of them must have stayed +#. TRANS @c up a little too late one night and decided to add it to Hurd or Glibc. +#. TRANS @c Whoever did it should be castigated, but it made me laugh. +#. TRANS @c --jtobey@channel1.com +#. TRANS @c +#. TRANS @c "bought the farm" means "died". -jtobey +#. TRANS @c +#. TRANS @c Translators, please do not translate this litteraly, translate it into +#. TRANS @c an idiomatic funny way of saying that the computer died. +#: sysdeps/gnu/errlist.h:776 +msgid "Computer bought the farm" +msgstr "ودع الحاسوب الملاعب" + +#. TRANS In @theglibc{}, this is another name for @code{EAGAIN} (above). +#. TRANS The values are always the same, on every operating system. +#. TRANS +#. TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a +#. TRANS separate error code. +#: sysdeps/gnu/errlist.h:785 +msgid "Operation would block" +msgstr "العملية ستؤدي إلى حظر" + +#: sysdeps/gnu/errlist.h:788 +msgid "Need authenticator" +msgstr "بحاجة لموثق" + +#. TRANS The experienced user will know what is wrong. +#. TRANS @c This error code is a joke. Its perror text is part of the joke. +#. TRANS @c Don't change it. +#: sysdeps/gnu/errlist.h:795 +msgid "?" +msgstr "؟" + +#: sysdeps/gnu/errlist.h:798 +msgid "RPC program not available" +msgstr "برنامج RPC غير متاح" + +#: sysdeps/gnu/errlist.h:801 +msgid "Initialization error" +msgstr "خطأ في التهيئة" + +#: sysdeps/gnu/errlist.h:804 +msgid "Device is remote" +msgstr "الجهاز بعيد" + +#: sysdeps/gnu/errlist.h:807 +msgid "Too many levels of remote in path" +msgstr "مستويات كثيرة جداً من البعد في المسار" + +#: sysdeps/hppa/dl-fptr.c:96 +msgid "cannot map pages for fdesc table" +msgstr "لا يمكن مطابقة الصفحات لجدول fdesc" + +#: sysdeps/hppa/dl-fptr.c:214 +msgid "cannot map pages for fptr table" +msgstr "لا يمكن مطابقة الصفحات لجدول fptr" + +#: sysdeps/hppa/dl-fptr.c:243 +msgid "internal error: symidx out of range of fptr table" +msgstr "خطأ داخلي: symidx خارج نطاق جدول fptr" + +#: sysdeps/mach/_strerror.c:43 sysdeps/mach/xpg-strerror.c:55 +msgid "Error in unknown error system: " +msgstr "خطأ في نظام أخطاء مجهول: " + +#: sysdeps/mach/xpg-strerror.c:66 sysdeps/mach/xpg-strerror.c:74 +msgid "Unknown error code: " +msgstr "رمز خطأ مجهول: " + +#: sysdeps/posix/gai_strerror-strs.h:2 +msgid "Address family for hostname not supported" +msgstr "فئة العناوين لاسم المضيف غير مدعومة" + +#: sysdeps/posix/gai_strerror-strs.h:3 +msgid "Temporary failure in name resolution" +msgstr "فشل مؤقت في حل الاسم" + +#: sysdeps/posix/gai_strerror-strs.h:4 +msgid "Bad value for ai_flags" +msgstr "قيمة سيئة لـ ai_flags" + +#: sysdeps/posix/gai_strerror-strs.h:5 +msgid "Non-recoverable failure in name resolution" +msgstr "فشل غير قابل للاسترداد في حل الاسم" + +#: sysdeps/posix/gai_strerror-strs.h:6 +msgid "ai_family not supported" +msgstr "ai_family غير مدعومة" + +#: sysdeps/posix/gai_strerror-strs.h:7 +msgid "Memory allocation failure" +msgstr "فشل في تخصيص الذاكرة" + +#: sysdeps/posix/gai_strerror-strs.h:8 +msgid "No address associated with hostname" +msgstr "لا يوجد عنوان مرتبط باسم المضيف" + +#: sysdeps/posix/gai_strerror-strs.h:9 +msgid "Name or service not known" +msgstr "الاسم أو الخدمة غير معروفة" + +#: sysdeps/posix/gai_strerror-strs.h:10 +msgid "Servname not supported for ai_socktype" +msgstr "اسم الخدمة غير مدعوم لـ ai_socktype" + +#: sysdeps/posix/gai_strerror-strs.h:11 +msgid "ai_socktype not supported" +msgstr "ai_socktype غير مدعوم" + +#: sysdeps/posix/gai_strerror-strs.h:12 +msgid "System error" +msgstr "خطأ في النظام" + +#: sysdeps/posix/gai_strerror-strs.h:13 +msgid "Processing request in progress" +msgstr "معالجة الطلب قيد التنفيذ" + +#: sysdeps/posix/gai_strerror-strs.h:14 +msgid "Request canceled" +msgstr "أُلغي الطلب" + +#: sysdeps/posix/gai_strerror-strs.h:15 +msgid "Request not canceled" +msgstr "لم يُلغَ الطلب" + +#: sysdeps/posix/gai_strerror-strs.h:16 +msgid "All requests done" +msgstr "انتهت جميع الطلبات" + +#: sysdeps/posix/gai_strerror-strs.h:17 +msgid "Interrupted by a signal" +msgstr "قوطع بواسطة إشارة" + +#: sysdeps/posix/gai_strerror-strs.h:18 +msgid "Parameter string not correctly encoded" +msgstr "سلسلة المعاملات لم يتم ترميزها بشكل صحيح" + +#: sysdeps/posix/gai_strerror-strs.h:19 +msgid "Result too large for supplied buffer" +msgstr "النتيجة كبيرة جداً للمخزن المؤقت المقدم" + +#: sysdeps/x86/dl-prop.h:61 +msgid "CPU ISA level is lower than required" +msgstr "مستوى CPU ISA أقل من المطلوب" + +#: sysdeps/x86/readelflib.c:49 +#, c-format +msgid "%s is for unknown machine %d.\n" +msgstr "%s لآلة مجهولة %d.\n" + +#: sysdeps/x86_64/dl-cet.c:214 +msgid "rebuild shared object with IBT support enabled" +msgstr "أعد بناء الكائن المشترك مع تفعيل دعم IBT" + +#: sysdeps/x86_64/dl-cet.c:233 +msgid "rebuild shared object with SHSTK support enabled" +msgstr "أعد بناء الكائن المشترك مع تفعيل دعم SHSTK" + +#: sysdeps/x86_64/dl-cet.c:251 +msgid "can't disable IBT" +msgstr "لا يمكن تعطيل IBT" + +#: sysdeps/x86_64/dl-cet.c:253 +msgid "can't disable SHSTK" +msgstr "لا يمكن تعطيل SHSTK" + +#: timezone/zdump.c:131 +#, c-format +msgid "%s: size overflow\n" +msgstr "%s: تجاوز السعة\n" + +#: timezone/zdump.c:170 +#, c-format +msgid "%s: Memory exhausted\n" +msgstr "%s: نفدت الذاكرة\n" + +#: timezone/zdump.c:257 +#, c-format +msgid "%s: setenv: %s\n" +msgstr "%s: setenv: %s\n" + +#: timezone/zdump.c:337 timezone/zdump.c:604 +#, c-format +msgid "%s: unknown timezone '%s': %s\n" +msgstr "%s: منطقة زمنية مجهولة '%s': %s\n" + +#: timezone/zdump.c:402 +msgid "has characters other than ASCII alphanumerics, '-' or '+'" +msgstr "يحتوي محارف غير الحروف والأرقام و '-' أو '+'" + +#: timezone/zdump.c:404 +msgid "has fewer than 3 characters" +msgstr "يحتوي أقل من 3 محارف" + +#: timezone/zdump.c:406 +msgid "has more than 6 characters" +msgstr "يحتوي أكثر من 6 محارف" + +#: timezone/zdump.c:411 +#, c-format +msgid "%s: warning: zone \"%s\" abbreviation \"%s\" %s\n" +msgstr "%s: تحذير: اختصار المنطقة \"%s\" هو \"%s\" %s\n" + +#: timezone/zdump.c:457 +#, c-format +msgid "" +"%s: usage: %s OPTIONS TIMEZONE ...\n" +"Options include:\n" +" -c [L,]U Start at year L (default -500), end before year U (default 2500)\n" +" -t [L,]U Start at time L, end before time U (in seconds since 1970)\n" +" -i List transitions briefly (format is experimental)\n" +" -v List transitions verbosely\n" +" -V List transitions a bit less verbosely\n" +" --help Output this help\n" +" --version Output version info\n" +"\n" +"Report bugs to %s.\n" +msgstr "" +"%s: الاستخدام: %s خيارات المنطقة_الزمنية ...\n" +"الخيارات تشمل:\n" +" -c [L,]U البدء في السنة L (مبدئي -500)، والانتهاء قبل السنة U (مبدئي 2500)\n" +" -t [L,]U البدء في الوقت L، والانتهاء قبل الوقت U (بالثواني منذ 1970)\n" +" -i سرد التحولات باختصار (تنسيق تجريبي)\n" +" -v سرد التحولات بإسهاب\n" +" -V سرد التحولات بإسهاب أقل قليلاً\n" +" --help إخراج المساعدة\n" +" --version إخراج معلومات الإصدار\n" +"\n" +"أبلغ عن الأخطاء إلى %s.\n" + +#: timezone/zdump.c:543 +#, c-format +msgid "%s: wild -c argument %s\n" +msgstr "%s: معامل -c جامح %s\n" + +#: timezone/zdump.c:576 +#, c-format +msgid "%s: wild -t argument %s\n" +msgstr "%s: معامل -t جامح %s\n" + +#: timezone/zdump.c:857 +#, c-format +msgid " (gmtime failed)" +msgstr " (فشل gmtime)" + +#: timezone/zdump.c:867 +#, c-format +msgid " (localtime failed)" +msgstr " (فشل localtime)" + +#: timezone/zic.c:463 +#, c-format +msgid "%s: Memory exhausted: %s\n" +msgstr "%s: نفدت الذاكرة: %s\n" + +#: timezone/zic.c:470 +msgid "size overflow" +msgstr "تجاوز السعة" + +#: timezone/zic.c:559 +msgid "integer overflow" +msgstr "تجاوز سعة العدد الصحيح" + +#: timezone/zic.c:585 +msgid "command line" +msgstr "سطر الأوامر" + +#: timezone/zic.c:588 +msgid "standard input" +msgstr "الإدخال القياسي" + +#: timezone/zic.c:616 +#, c-format +msgid "\"%s\", line %: " +msgstr "\"%s\"، السطر %: " + +#: timezone/zic.c:620 +#, c-format +msgid " (rule from \"%s\", line %)" +msgstr " (قاعدة من \"%s\"، السطر %)" + +#: timezone/zic.c:639 +#, c-format +msgid "warning: " +msgstr "تحذير: " + +#: timezone/zic.c:669 +#, c-format +msgid "" +"%s: usage is %s [ --version ] [ --help ] [ -v ] \\\n" +"\t[ -b {slim|fat} ] [ -d directory ] [ -l localtime ] [ -L leapseconds ] \\\n" +"\t[ -p posixrules ] [ -r '[@lo][/@hi]' ] [ -R '@hi' ] \\\n" +"\t[ -t localtime-link ] \\\n" +"\t[ filename ... ]\n" +"\n" +"Report bugs to %s.\n" +msgstr "" +"%s: الاستخدام هو %s [ --version ] [ --help ] [ -v ] \\\n" +"\t[ -b {slim|fat} ] [ -d الدليل ] [ -l الوقت_المحلي ] [ -L الثواني_الكبيسة ] \\\n" +"\t[ -p قواعد_posix ] [ -r '[@lo][/@hi]' ] [ -R '@hi' ] \\\n" +"\t[ -t رابط_الوقت_المحلي ] \\\n" +"\t[ اسم_الملف ... ]\n" +"\n" +"أبلغ عن الأخطاء إلى %s.\n" + +#: timezone/zic.c:695 +#, c-format +msgid "%s: Can't chdir to %s: %s\n" +msgstr "%s: لا يمكن تغيير الدليل إلى %s: %s\n" + +#: timezone/zic.c:786 +#, c-format +msgid "\"Link %s %s\" is part of a link cycle" +msgstr "\"Link %s %s\" جزء من دورة روابط" + +#: timezone/zic.c:797 +#, c-format +msgid "link %s targets itself" +msgstr "الرابط %s يستهدف نفسه" + +#: timezone/zic.c:817 +#, c-format +msgid "link %s targeting link %s mishandled by pre-2023 zic" +msgstr "الرابط %s الذي يستهدف الرابط %s تم التعامل معه بشكل خاطئ بواسطة zic ما قبل 2023" + +#: timezone/zic.c:821 +#, c-format +msgid "link %s targeting link %s" +msgstr "الرابط %s يستهدف الرابط %s" + +#: timezone/zic.c:992 +msgid "wild compilation-time specification of zic_t" +msgstr "مواصفة وقت ترجمة جامحة لـ zic_t" + +#: timezone/zic.c:1011 timezone/zic.c:1015 +msgid "incompatible -b options" +msgstr "خيارات -b غير متوافقة" + +#: timezone/zic.c:1018 +#, c-format +msgid "invalid option: -b '%s'" +msgstr "خيار غير صالح: -b '%s'" + +#: timezone/zic.c:1025 +#, c-format +msgid "%s: More than one -d option specified\n" +msgstr "%s: تم تحديد أكثر من خيار -d\n" + +#: timezone/zic.c:1036 +#, c-format +msgid "%s: More than one -l option specified\n" +msgstr "%s: تم تحديد أكثر من خيار -l\n" + +#: timezone/zic.c:1047 +#, c-format +msgid "%s: More than one -p option specified\n" +msgstr "%s: تم تحديد أكثر من خيار -p\n" + +#: timezone/zic.c:1056 +#, c-format +msgid "%s: More than one -t option specified\n" +msgstr "%s: تم تحديد أكثر من خيار -t\n" + +#: timezone/zic.c:1064 +msgid "-y ignored" +msgstr "تم تجاهل -y" + +#: timezone/zic.c:1071 +#, c-format +msgid "%s: More than one -L option specified\n" +msgstr "%s: تم تحديد أكثر من خيار -L\n" + +#: timezone/zic.c:1083 +#, c-format +msgid "%s: More than one -r option specified\n" +msgstr "%s: تم تحديد أكثر من خيار -r\n" + +#: timezone/zic.c:1090 +#, c-format +msgid "%s: invalid time range: %s\n" +msgstr "%s: نطاق زمني غير صالح: %s\n" + +#: timezone/zic.c:1098 +#, c-format +msgid "%s: invalid time: %s\n" +msgstr "%s: وقت غير صالح: %s\n" + +#: timezone/zic.c:1104 +msgid "-s ignored" +msgstr "تم تجاهل -s" + +#: timezone/zic.c:1110 +#, c-format +msgid "%s: -R time exceeds -r cutoff\n" +msgstr "%s: وقت -R يتجاوز حد -r\n" + +#: timezone/zic.c:1171 +msgid "empty file name" +msgstr "اسم ملف فارغ" + +#: timezone/zic.c:1174 +#, c-format +msgid "file name '%s' begins with '/'" +msgstr "اسم الملف '%s' يبدأ بـ '/'" + +#: timezone/zic.c:1184 +#, c-format +msgid "file name '%s' contains '%.*s' component" +msgstr "اسم الملف '%s' يحتوي على المكون '%.*s'" + +#: timezone/zic.c:1190 +#, c-format +msgid "file name '%s' component contains leading '-'" +msgstr "مكون اسم الملف '%s' يحتوي على '-' في بدايته" + +#: timezone/zic.c:1193 +#, c-format +msgid "file name '%s' contains overlength component '%.*s...'" +msgstr "اسم الملف '%s' يحتوي على مكون زائد الطول '%.*s...'" + +#: timezone/zic.c:1221 +#, c-format +msgid "file name '%s' contains byte '%c'" +msgstr "اسم الملف '%s' يحتوي على البايت '%c'" + +#: timezone/zic.c:1222 +#, c-format +msgid "file name '%s' contains byte '\\%o'" +msgstr "اسم الملف '%s' يحتوي على البايت '\\%o'" + +#: timezone/zic.c:1369 +#, c-format +msgid "%s: Can't create %s/%s: %s\n" +msgstr "%s: لا يمكن إنشاء %s/%s: %s\n" + +#: timezone/zic.c:1388 +#, c-format +msgid "%s: rename to %s/%s: %s\n" +msgstr "%s: إعادة التسمية إلى %s/%s: %s\n" + +#: timezone/zic.c:1463 +#, c-format +msgid "%s: Can't remove %s/%s: %s\n" +msgstr "%s: لا يمكن إزالة %s/%s: %s\n" + +#: timezone/zic.c:1507 +#, c-format +msgid "%s: Can't link %s/%s to %s/%s: %s\n" +msgstr "%s: لا يمكن ربط %s/%s بـ %s/%s: %s\n" + +#: timezone/zic.c:1536 +#, c-format +msgid "symbolic link used because hard link failed: %s" +msgstr "استخدم رابط رمزي لأن الرابط الصلب فشل: %s" + +#: timezone/zic.c:1544 +#, c-format +msgid "%s: Can't read %s/%s: %s\n" +msgstr "%s: لا يمكن قراءة %s/%s: %s\n" + +#: timezone/zic.c:1554 +#, c-format +msgid "copy used because hard link failed: %s" +msgstr "استخدم النسخ لأن الرابط الصلب فشل: %s" + +#: timezone/zic.c:1557 +#, c-format +msgid "copy used because symbolic link failed: %s" +msgstr "استخدم النسخ لأن الرابط الرمزي فشل: %s" + +#: timezone/zic.c:1608 timezone/zic.c:1610 +msgid "same rule name in multiple files" +msgstr "نفس اسم القاعدة في ملفات متعددة" + +#: timezone/zic.c:1656 +#, c-format +msgid "%s in ruleless zone" +msgstr "%s في منطقة بلا قواعد" + +#: timezone/zic.c:1674 +msgid "input error" +msgstr "خطأ إدخال" + +#: timezone/zic.c:1679 +msgid "unterminated line" +msgstr "سطر غير منتهٍ" + +#: timezone/zic.c:1683 +msgid "NUL input byte" +msgstr "بايت إدخال NUL" + +#: timezone/zic.c:1688 +msgid "line too long" +msgstr "السطر طويل جداً" + +#: timezone/zic.c:1709 +#, c-format +msgid "%s: Can't open %s: %s\n" +msgstr "%s: لا يمكن فتح %s: %s\n" + +#: timezone/zic.c:1734 +msgid "input line of unknown type" +msgstr "سطر إدخال من نوع مجهول" + +#: timezone/zic.c:1761 +msgid "expected continuation line not found" +msgstr "السطر التكميلي المتوقع غير موجود" + +#: timezone/zic.c:1797 +msgid "fractional seconds rejected by pre-2018 versions of zic" +msgstr "الثواني الكسرية مرفوضة من قبل إصدارات zic ما قبل 2018" + +#: timezone/zic.c:1815 timezone/zic.c:3760 +msgid "time overflow" +msgstr "تجاوز وقت" + +#: timezone/zic.c:1821 +msgid "values over 24 hours not handled by pre-2007 versions of zic" +msgstr "القيم التي تزيد عن 24 ساعة لا تعالجها إصدارات zic ما قبل 2007" + +#: timezone/zic.c:1839 +msgid "invalid saved time" +msgstr "وقت محفوظ غير صالح" + +#: timezone/zic.c:1850 +msgid "wrong number of fields on Rule line" +msgstr "عدد حقول خاطئ في سطر القاعدة (Rule)" + +#: timezone/zic.c:1859 +#, c-format +msgid "Invalid rule name \"%s\"" +msgstr "اسم قاعدة غير صالح \"%s\"" + +#: timezone/zic.c:1883 +msgid "wrong number of fields on Zone line" +msgstr "عدد حقول خاطئ في سطر المنطقة (Zone)" + +#: timezone/zic.c:1887 +#, c-format +msgid "\"Zone %s\" line and -l option are mutually exclusive" +msgstr "سطر \"Zone %s\" والخيار -l متعارضان" + +#: timezone/zic.c:1892 +#, c-format +msgid "\"Zone %s\" line and -p option are mutually exclusive" +msgstr "سطر \"Zone %s\" والخيار -p متعارضان" + +#: timezone/zic.c:1899 +#, c-format +msgid "duplicate zone name %s (file \"%s\", line %)" +msgstr "اسم منطقة مكرر %s (الملف \"%s\"، السطر %)" + +#: timezone/zic.c:1913 +msgid "wrong number of fields on Zone continuation line" +msgstr "عدد حقول خاطئ في سطر تكملة المنطقة" + +#: timezone/zic.c:1952 +msgid "invalid UT offset" +msgstr "إزاحة UT غير صالحة" + +#: timezone/zic.c:1956 +msgid "invalid abbreviation format" +msgstr "تنسيق اختصار غير صالح" + +#: timezone/zic.c:1986 +msgid "Zone continuation line end time is not after end time of previous line" +msgstr "وقت نهاية سطر تكملة المنطقة ليس بعد وقت نهاية السطر السابق" + +#: timezone/zic.c:1997 +#, c-format +msgid "format '%s' not handled by pre-2015 versions of zic" +msgstr "التنسيق '%s' لا تعالجه إصدارات zic ما قبل 2015" + +#: timezone/zic.c:2027 +msgid "invalid leaping year" +msgstr "سنة كبيسة غير صالحة" + +#: timezone/zic.c:2049 timezone/zic.c:2154 +msgid "invalid month name" +msgstr "اسم شهر غير صالح" + +#: timezone/zic.c:2062 timezone/zic.c:2252 timezone/zic.c:2266 +msgid "invalid day of month" +msgstr "يوم شهر غير صالح" + +#: timezone/zic.c:2067 +msgid "time too small" +msgstr "وقت صغير جداً" + +#: timezone/zic.c:2071 +msgid "time too large" +msgstr "وقت كبير جداً" + +#: timezone/zic.c:2075 timezone/zic.c:2183 +msgid "invalid time of day" +msgstr "وقت اليوم غير صالح" + +#: timezone/zic.c:2078 +msgid "leap second precedes Epoch" +msgstr "الثانية الكبيسة تسبق الحقبة" + +#: timezone/zic.c:2086 +msgid "wrong number of fields on Leap line" +msgstr "عدد حقول خاطئ في سطر الكبيس (Leap)" + +#: timezone/zic.c:2092 +msgid "invalid Rolling/Stationary field on Leap line" +msgstr "حقل Rolling/Stationary غير صالح في سطر Leap" + +#: timezone/zic.c:2100 +msgid "invalid CORRECTION field on Leap line" +msgstr "حقل CORRECTION غير صالح في سطر Leap" + +#: timezone/zic.c:2112 +msgid "wrong number of fields on Expires line" +msgstr "عدد حقول خاطئ في سطر الانتهاء (Expires)" + +#: timezone/zic.c:2114 +msgid "multiple Expires lines" +msgstr "أسطر انتهاء متعددة" + +#: timezone/zic.c:2125 +msgid "wrong number of fields on Link line" +msgstr "عدد حقول خاطئ في سطر الرابط (Link)" + +#: timezone/zic.c:2129 +msgid "blank TARGET field on Link line" +msgstr "حقل TARGET فارغ في سطر الرابط" + +#: timezone/zic.c:2192 +#, c-format +msgid "FROM year \"%s\" is obsolete; treated as %d" +msgstr "السنة FROM \"%s\" مهجورة؛ ستعامل كـ %d" + +#: timezone/zic.c:2199 +msgid "invalid starting year" +msgstr "سنة بدء غير صالحة" + +#: timezone/zic.c:2214 +msgid "invalid ending year" +msgstr "سنة انتهاء غير صالحة" + +#: timezone/zic.c:2218 +msgid "starting year greater than ending year" +msgstr "سنة البدء أكبر من سنة الانتهاء" + +#: timezone/zic.c:2222 +#, c-format +msgid "year type \"%s\" is unsupported; use \"-\" instead" +msgstr "نوع السنة \"%s\" غير مدعوم؛ استخدم \"-\" بدلاً منه" + +#: timezone/zic.c:2257 +msgid "invalid weekday name" +msgstr "اسم يوم أسبوع غير صالح" + +#: timezone/zic.c:2435 +#, c-format +msgid "reference clients mishandle more than %d transition times" +msgstr "عملاء المرجع يسيئون التعامل مع أكثر من %d أوقات تحول" + +#: timezone/zic.c:2439 +msgid "pre-2014 clients may mishandle more than 1200 transition times" +msgstr "عملاء ما قبل 2014 قد يسيئون التعامل مع أكثر من 1200 وقت تحول" + +#: timezone/zic.c:2480 +#, c-format +msgid "%s: pre-2021b clients may mishandle leap second expiry" +msgstr "%s: عملاء ما قبل 2021b قد يسيئون التعامل مع انتهاء صلاحية الثانية الكبيسة" + +#: timezone/zic.c:2488 +#, c-format +msgid "%s: pre-2021b clients may mishandle leap second table truncation" +msgstr "%s: عملاء ما قبل 2021b قد يسيئون التعامل مع بتر جدول الثواني الكبيسة" + +#: timezone/zic.c:2537 +msgid "too many transition times" +msgstr "أوقات تحول كثيرة جداً" + +#: timezone/zic.c:2801 +#, c-format +msgid "%%z UT offset magnitude exceeds 99:59:59" +msgstr "قيمة إزاحة %%z UT تتجاوز 99:59:59" + +#: timezone/zic.c:3180 +msgid "no proleptic TZ string for zone" +msgstr "لا توجد سلسلة TZ استباقية للمنطقة" + +#: timezone/zic.c:3186 +#, c-format +msgid "%s: pre-%d clients may mishandle distant timestamps" +msgstr "%s: عملاء ما قبل %d قد يسيئون التعامل مع الطوابع الزمنية البعيدة" + +#: timezone/zic.c:3315 +msgid "two rules for same instant" +msgstr "قاعدتان لنفس اللحظة" + +#: timezone/zic.c:3388 +msgid "can't determine time zone abbreviation to use just after until time" +msgstr "لا يمكن تحديد اختصار المنطقة الزمنية للاستخدام مباشرة بعد وقت \"حتى\" (until)" + +#: timezone/zic.c:3489 +msgid "UT offset out of range" +msgstr "إزاحة UT خارج النطاق" + +#: timezone/zic.c:3512 +msgid "too many local time types" +msgstr "أنواع وقت محلي كثيرة جداً" + +#: timezone/zic.c:3530 +msgid "too many leap seconds" +msgstr "ثواني كبيسة كثيرة جداً" + +#: timezone/zic.c:3534 +msgid "Rolling leap seconds not supported with -r" +msgstr "الثواني الكبيسة المتناوبة (Rolling) غير مدعومة مع -r" + +#: timezone/zic.c:3561 +msgid "Leap seconds too close together" +msgstr "الثواني الكبيسة قريبة جداً من بعضها" + +#: timezone/zic.c:3572 +msgid "last Leap time does not precede Expires time" +msgstr "وقت الكبيس الأخير لا يسبق وقت الانتهاء" + +#: timezone/zic.c:3679 +#, c-format +msgid "\"%s\" is undocumented; use \"last%s\" instead" +msgstr "\"%s\" غير موثق؛ استخدم \"last%s\" بدلاً منه" + +#: timezone/zic.c:3710 +#, c-format +msgid "\"%s\" is ambiguous in pre-2017c zic" +msgstr "\"%s\" غامض في zic ما قبل 2017c" + +#: timezone/zic.c:3741 +msgid "Odd number of quotation marks" +msgstr "عدد فردي من علامات الاقتباس" + +#: timezone/zic.c:3749 +msgid "Too many input fields" +msgstr "حقول إدخال كثيرة جداً" + +#: timezone/zic.c:3838 +msgid "use of 2/29 in non leap-year" +msgstr "استخدام 29/2 في سنة غير كبيسة" + +#: timezone/zic.c:3864 +msgid "rule goes past start/end of month; will not work with pre-2004 versions of zic" +msgstr "القاعدة تتجاوز بداية/نهاية الشهر؛ لن تعمل مع إصدارات zic ما قبل 2004" + +#: timezone/zic.c:3891 +msgid "time zone abbreviation has fewer than 3 characters" +msgstr "اختصار المنطقة الزمنية يحتوي أقل من 3 محارف" + +#: timezone/zic.c:3893 +msgid "time zone abbreviation has too many characters" +msgstr "اختصار المنطقة الزمنية يحتوي محارف كثيرة جداً" + +#: timezone/zic.c:3895 +msgid "time zone abbreviation differs from POSIX standard" +msgstr "اختصار المنطقة الزمنية يختلف عن معيار POSIX" + +#: timezone/zic.c:3901 +msgid "too many, or too long, time zone abbreviations" +msgstr "اختصارات منطقة زمنية كثيرة جداً أو طويلة جداً" + +#: timezone/zic.c:3952 +#, c-format +msgid "%s: Can't create directory %s: %s" +msgstr "%s: لا يمكن إنشاء الدليل %s: %s" diff --git a/po/nl.po b/po/nl.po index 4bec5f448e..4d2a856496 100644 --- a/po/nl.po +++ b/po/nl.po @@ -1,5 +1,5 @@ # Dutch translations for GNU libc. -# Copyright (C) 2025 Free Software Foundation, Inc. +# Copyright (C) 2026 Free Software Foundation, Inc. # This file is distributed under the same license as the glibc package. # # "You don't get rich by treating other people well." @@ -8,13 +8,13 @@ # Erwin Poeze , 2009. # Benno Schulenberg , 2006, 2007, 2008, 2010, 2011, 2012. # Benno Schulenberg , 2013, 2014, 2015, 2017, 2018, 2019. -# Benno Schulenberg , 2020, 2021, 2022, 2023, 2025. +# Benno Schulenberg , 2020, 2021, 2022, 2023, 2025, 2026. msgid "" msgstr "" -"Project-Id-Version: libc-2.40.9000\n" +"Project-Id-Version: libc-2.42.9000\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-19 16:22+0100\n" -"PO-Revision-Date: 2025-01-06 15:44+0100\n" +"PO-Revision-Date: 2026-01-25 13:21+0100\n" "Last-Translator: Benno Schulenberg \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -112,6 +112,16 @@ msgstr "%s: Te veel argumenten\n" msgid "(PROGRAM ERROR) Option should have been recognized!?" msgstr "**Interne programmafout**: optie had herkend moeten worden!?" +#: assert/assert-perr.c:45 +#, c-format +msgid "%s%s%s:%s: %s%sUnexpected error: %s.\n" +msgstr "%s%s%s:%s: %s%sOnverwachte fout: %s.\n" + +#: assert/assert.c:37 +#, c-format +msgid "%s%s%s:%s: %s%sAssertion `%s' failed.\n" +msgstr "%s%s%s:%s: %s%sControletest '%s' faalt.\n" + #: catgets/gencat.c:112 msgid "Create C header file NAME containing symbol definitions" msgstr "headerbestand met symbooldefinities aanmaken" @@ -1301,6 +1311,16 @@ msgstr "kan interne descriptor niet aanmaken" msgid "Reopening shared object `%s' failed" msgstr "heropenen van gedeeld object '%s' is mislukt" +#: elf/sprof.c:556 elf/sprof.c:672 +#, c-format +msgid "stat(%s) failure" +msgstr "stat(%s) is mislukt" + +#: elf/sprof.c:573 +#, c-format +msgid "read outside of file extents %zu + %jd > %jd" +msgstr "leespoging buiten de bestands-extents -- %zu + %jd > %jd" + #: elf/sprof.c:582 elf/sprof.c:689 #, c-format msgid "reading of section headers failed" @@ -1326,6 +1346,11 @@ msgstr "kan bestandsnaam niet bepalen" msgid "reading of ELF header failed" msgstr "lezen van ELF-header is mislukt" +#: elf/sprof.c:683 +#, c-format +msgid "too many section headers" +msgstr "te veel sectiekoppen" + #: elf/sprof.c:720 #, c-format msgid "*** The file `%s' is stripped: no detailed analysis possible\n" @@ -2931,6 +2956,12 @@ msgstr "kan status van taalregio-archief '%s' niet opvragen" msgid "cannot lock locale archive \"%s\"" msgstr "kan taalregio-archief '%s' niet vergrendelen" +#: locale/programs/locarchive.c:642 locale/programs/locarchive.c:656 +#: locale/programs/locarchive.c:664 locale/programs/locarchive.c:685 +#, c-format +msgid "cannot unlock archive header" +msgstr "kan archiefkop niet ontgrendelen" + #: locale/programs/locarchive.c:657 #, c-format msgid "cannot read archive header" @@ -6070,7 +6101,7 @@ msgstr "Achterhaald bestandshandvat" #. TRANS properly on @gnuhurdsystems{}, making this error code impossible.) #: sysdeps/gnu/errlist.h:479 msgid "Object is remote" -msgstr "Object is al elders" +msgstr "Object is op afstand" #. TRANS This is used by the file locking facilities; see #. TRANS @ref{File Locks}. This error is never generated by @gnuhurdsystems{}, but @@ -6456,6 +6487,18 @@ msgstr "?" msgid "RPC program not available" msgstr "RPC-programma is niet beschikbaar" +#: sysdeps/gnu/errlist.h:801 +msgid "Initialization error" +msgstr "Initialisatiefout" + +#: sysdeps/gnu/errlist.h:804 +msgid "Device is remote" +msgstr "Apparaat is op afstand" + +#: sysdeps/gnu/errlist.h:807 +msgid "Too many levels of remote in path" +msgstr "Te veel niveaus op afstand in het pad" + #: sysdeps/hppa/dl-fptr.c:96 msgid "cannot map pages for fdesc table" msgstr "kan pagina's voor 'fdesc'-tabel niet in het geheugen plaatsen" @@ -7071,11 +7114,21 @@ msgstr "ongeldige naam voor weekdag" #: timezone/zic.c:2435 #, c-format msgid "reference clients mishandle more than %d transition times" -msgstr "meer dan %d overgangstijden worden door referentie-clients onjuist behandeld" +msgstr "meer dan %d overgangstijden worden door referentie-cliënten onjuist behandeld" #: timezone/zic.c:2439 msgid "pre-2014 clients may mishandle more than 1200 transition times" -msgstr "clients van voor 2014 zouden meer dan 1200 overgangstijden onjuist kunnen behandelen" +msgstr "cliënten van voor 2014 zouden meer dan 1200 overgangstijden onjuist kunnen behandelen" + +#: timezone/zic.c:2480 +#, c-format +msgid "%s: pre-2021b clients may mishandle leap second expiry" +msgstr "%s: cliënten van voor 2021b zouden het verlopen van een schrikkelseconde onjuist kunnen behandelen" + +#: timezone/zic.c:2488 +#, c-format +msgid "%s: pre-2021b clients may mishandle leap second table truncation" +msgstr "%s: cliënten van voor 2021b zouden afkapping van de schrikkelsecondetabel onjuist kunnen behandelen" #: timezone/zic.c:2537 msgid "too many transition times" @@ -7086,6 +7139,10 @@ msgstr "te veel overgangstijden" msgid "%%z UT offset magnitude exceeds 99:59:59" msgstr "verschuiving %%z t.o.v. UT is groter dan 99:59:59" +#: timezone/zic.c:3180 +msgid "no proleptic TZ string for zone" +msgstr "er is geen proleptische TZ-tekenreeks voor de zone" + #: timezone/zic.c:3186 #, c-format msgid "%s: pre-%d clients may mishandle distant timestamps" commit 856c426a753450b8c6861a5b994a564f4fc16d4b Author: Andreas Schwab Date: Tue Feb 3 12:41:23 2026 +0100 Don't include directly (bug 33848) Headers from bits directories should never be included directly, only via the official headers. (cherry picked from commit 0e47414ce87f3b088ff454fc6c7d1129ff9617ec) diff --git a/NEWS b/NEWS index b9953e9888..1f07633e57 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,8 @@ The following bugs are resolved with this release: [33623] [ldbl-128ibm] roundl, ceill, truncl, floorl bad sign of zero results + [33848] build: Build fails at openat2.h, redefinition of 'struct + open_how' Version 2.43 diff --git a/sysdeps/unix/sysv/linux/openat2.c b/sysdeps/unix/sysv/linux/openat2.c index 7587dd577a..ac7b70584e 100644 --- a/sysdeps/unix/sysv/linux/openat2.c +++ b/sysdeps/unix/sysv/linux/openat2.c @@ -17,7 +17,6 @@ . */ #include -#include #include int commit 140c760d711d03c0230dff218b5268b11935f92e Author: Florian Weimer Date: Fri Feb 13 09:02:07 2026 +0100 nss: Introduce dedicated struct nss_database_for_fork type The initialized field in struct nss_database_data is rather confusing because it is not used by the regular NSS code, only by the fork state synchronization code. Introduce a separate type and place the initialized field there. Reviewed-by: Sam James (cherry picked from commit 7bb859f4198d0be19c31a9937eae4f6c2c9a079e) diff --git a/nss/nss_database.c b/nss/nss_database.c index 6997b5bb04..19e752ef65 100644 --- a/nss/nss_database.c +++ b/nss/nss_database.c @@ -56,7 +56,6 @@ global_state_allocate (void *closure) { result->data.nsswitch_conf.size = -1; /* Force reload. */ memset (result->data.services, 0, sizeof (result->data.services)); - result->data.initialized = true; result->data.reload_disabled = false; __libc_lock_init (result->lock); result->root_ino = 0; @@ -439,8 +438,8 @@ nss_database_check_reload_and_get (struct nss_database_state *local, /* Avoid overwriting the global configuration until we have loaded everything successfully. Otherwise, if the file change information changes back to what is in the global configuration, - the lookups would use the partially-written configuration. */ - struct nss_database_data staging = { .initialized = true, }; + the lookups would use the partially-written configuration. */ + struct nss_database_data staging = { }; bool ok = nss_database_reload (&staging, &initial); @@ -491,7 +490,7 @@ __nss_database_freeres (void) } void -__nss_database_fork_prepare_parent (struct nss_database_data *data) +__nss_database_fork_prepare_parent (struct nss_database_for_fork *data) { /* Do not use allocate_once to trigger loading unnecessarily. */ struct nss_database_state *local = atomic_load_acquire (&global_database_state); @@ -503,20 +502,21 @@ __nss_database_fork_prepare_parent (struct nss_database_data *data) because it avoids acquiring the lock during the actual fork. */ __libc_lock_lock (local->lock); - *data = local->data; + data->data = local->data; __libc_lock_unlock (local->lock); + data->initialized = true; } } void -__nss_database_fork_subprocess (struct nss_database_data *data) +__nss_database_fork_subprocess (struct nss_database_for_fork *data) { struct nss_database_state *local = atomic_load_acquire (&global_database_state); if (data->initialized) { /* Restore the state at the point of the fork. */ assert (local != NULL); - local->data = *data; + local->data = data->data; __libc_lock_init (local->lock); } else if (local != NULL) diff --git a/nss/nss_database.h b/nss/nss_database.h index 1f2ff1639a..a4f3369eb0 100644 --- a/nss/nss_database.h +++ b/nss/nss_database.h @@ -70,15 +70,21 @@ struct nss_database_data struct file_change_detection nsswitch_conf; nss_action_list services[NSS_DATABASE_COUNT]; int reload_disabled; /* Actually bool; int for atomic access. */ - bool initialized; +}; + +/* Use to store a consistent state snapshot across fork. */ +struct nss_database_for_fork +{ + bool initialized; /* Set to true if the data field below is initialized. */ + struct nss_database_data data; }; /* Called by fork in the parent process, before forking. */ -void __nss_database_fork_prepare_parent (struct nss_database_data *data) +void __nss_database_fork_prepare_parent (struct nss_database_for_fork *) attribute_hidden; /* Called by fork in the new subprocess, after forking. */ -void __nss_database_fork_subprocess (struct nss_database_data *data) +void __nss_database_fork_subprocess (struct nss_database_for_fork *) attribute_hidden; #endif /* _NSS_DATABASE_H */ diff --git a/posix/fork.c b/posix/fork.c index 8e541ff985..933ac6fee7 100644 --- a/posix/fork.c +++ b/posix/fork.c @@ -50,7 +50,7 @@ __libc_fork (void) lastrun = __run_prefork_handlers (multiple_threads); - struct nss_database_data nss_database_data; + struct nss_database_for_fork nss_database_data; /* If we are not running multiple threads, we do not have to preserve lock state. If fork runs from a signal handler, only commit d6cb7ce0e98b2c16df5b2f5b9693d0130ccb8af5 Author: Florian Weimer Date: Fri Feb 13 09:02:07 2026 +0100 Linux: In getlogin_r, use utmp fallback only for specific errors Most importantly, if getwpuid_r fails, it does not make sense to retry via utmp because the user ID obtained from there is less reliable than the one from /proc/self/loginuid. Reviewed-by: Sam James (cherry picked from commit 28660f4b45afa8921c2faebaec2846f95f670ba0) diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c index 3b85e91be6..200c96860f 100644 --- a/sysdeps/unix/sysv/linux/getlogin_r.c +++ b/sysdeps/unix/sysv/linux/getlogin_r.c @@ -37,7 +37,12 @@ __getlogin_r_loginuid (char *name, size_t namesize) { int fd = __open_nocancel ("/proc/self/loginuid", O_RDONLY); if (fd == -1) - return -1; + { + if (errno == ENOENT) + /* Trigger utmp fallback. */ + return -1; + return errno; + } /* We are reading a 32-bit number. 12 bytes are enough for the text representation. If not, something is wrong. */ @@ -45,6 +50,8 @@ __getlogin_r_loginuid (char *name, size_t namesize) ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, uidbuf, sizeof (uidbuf))); __close_nocancel_nostatus (fd); + if (n < 0) + return errno; uid_t uid; char *endp; @@ -53,12 +60,13 @@ __getlogin_r_loginuid (char *name, size_t namesize) || (uidbuf[n] = '\0', uid = strtoul (uidbuf, &endp, 10), endp == uidbuf || *endp != '\0')) - return -1; + return EINVAL; /* If there is no login uid, linux sets /proc/self/loginid to the sentinel value of, (uid_t) -1, so check if that value is set and return early to avoid making unneeded nss lookups. */ if (uid == (uid_t) -1) + /* Trigger utmp fallback. */ return -1; struct passwd pwd; @@ -78,9 +86,14 @@ __getlogin_r_loginuid (char *name, size_t namesize) } } - if (res != 0 || tpwd == NULL) + if (res != 0) + { + result = res; + goto out; + } + if (tpwd == NULL) { - result = -1; + result = ENOENT; goto out; } commit 48f5a05a7a1eeb9e0567ab429f654648f831307f Author: Florian Weimer Date: Fri Feb 13 09:02:07 2026 +0100 nss: Missing checks in __nss_configure_lookup, __nss_database_get (bug 28940) This avoids a null pointer dereference in the nss_database_check_reload_and_get function, and assertion failures. Reviewed-by: Sam James (cherry picked from commit 5b713b49443eb6a4e54e50e2f0147105f86dab02) diff --git a/nss/Makefile b/nss/Makefile index b0d80bd642..1c48bd0876 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -326,6 +326,7 @@ tests := \ tst-gshadow \ tst-nss-getpwent \ tst-nss-hash \ + tst-nss-malloc-failure-getlogin_r \ tst-nss-test1 \ tst-nss-test2 \ tst-nss-test4 \ diff --git a/nss/nss_database.c b/nss/nss_database.c index 19e752ef65..076d5a63fe 100644 --- a/nss/nss_database.c +++ b/nss/nss_database.c @@ -241,9 +241,12 @@ __nss_configure_lookup (const char *dbname, const char *service_line) /* Force any load/cache/read whatever to happen, so we can override it. */ - __nss_database_get (db, &result); + if (!__nss_database_get (db, &result)) + return -1; local = nss_database_state_get (); + if (local == NULL) + return -1; result = __nss_action_parse (service_line); if (result == NULL) @@ -465,6 +468,8 @@ bool __nss_database_get (enum nss_database db, nss_action_list *actions) { struct nss_database_state *local = nss_database_state_get (); + if (local == NULL) + return false; return nss_database_check_reload_and_get (local, actions, db); } libc_hidden_def (__nss_database_get) diff --git a/nss/tst-nss-malloc-failure-getlogin_r.c b/nss/tst-nss-malloc-failure-getlogin_r.c new file mode 100644 index 0000000000..0e2985ad57 --- /dev/null +++ b/nss/tst-nss-malloc-failure-getlogin_r.c @@ -0,0 +1,345 @@ +/* Test NSS/getlogin_r with injected allocation failures (bug 28940). + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* This test calls getpwuid_r via getlogin_r (on Linux). + + This test uses the NSS system configuration to exercise that code + path. It means that it can fail (crash) if malloc failure is not + handled by NSS modules for the passwd database. */ + +/* Data structure allocated via MAP_SHARED, so that writes from the + subprocess are visible. */ +struct shared_data +{ + /* Number of tracked allocations performed so far. */ + volatile unsigned int allocation_count; + + /* If this number is reached, one allocation fails. */ + volatile unsigned int failing_allocation; + + /* The number of allocations performed during initialization + (before the actual getlogin_r call). */ + volatile unsigned int init_allocation_count; + + /* Error code of an expected getlogin_r failure. */ + volatile int expected_failure; + + /* The subprocess stores the expected name here. */ + char name[100]; +}; + +/* Allocation count in shared mapping. */ +static struct shared_data *shared; + +/* Returns true if a failure should be injected for this allocation. */ +static bool +fail_this_allocation (void) +{ + if (shared != NULL) + { + unsigned int count = shared->allocation_count; + shared->allocation_count = count + 1; + return count == shared->failing_allocation; + } + else + return false; +} + +/* Failure-injecting wrappers for allocation functions used by glibc. */ + +void * +malloc (size_t size) +{ + if (fail_this_allocation ()) + { + errno = ENOMEM; + return NULL; + } + extern __typeof (malloc) __libc_malloc; + return __libc_malloc (size); +} + +void * +calloc (size_t a, size_t b) +{ + if (fail_this_allocation ()) + { + errno = ENOMEM; + return NULL; + } + extern __typeof (calloc) __libc_calloc; + return __libc_calloc (a, b); +} + +void * +realloc (void *ptr, size_t size) +{ + if (fail_this_allocation ()) + { + errno = ENOMEM; + return NULL; + } + extern __typeof (realloc) __libc_realloc; + return __libc_realloc (ptr, size); +} + +/* No-op subprocess to verify that support_isolate_in_subprocess does + not perform any heap allocations. */ +static void +no_op (void *ignored) +{ +} + +/* Perform a getlogin_r call in a subprocess, to obtain the number of + allocations used and the expected result of a successful call. */ +static void +initialize (void *configure_lookup) +{ + shared->init_allocation_count = 0; + if (configure_lookup != NULL) + { + TEST_COMPARE (__nss_configure_lookup ("passwd", configure_lookup), 0); + shared->init_allocation_count = shared->allocation_count; + } + + shared->name[0] = '\0'; + int ret = getlogin_r (shared->name, sizeof (shared->name)); + if (ret != 0) + { + printf ("info: getlogin_r failed: %s (%d)\n", + strerrorname_np (ret), ret); + shared->expected_failure = ret; + } + else + { + shared->expected_failure = 0; + if (shared->name[0] == '\0') + FAIL ("error: getlogin_r succeeded without result\n"); + else + printf ("info: getlogin_r: \"%s\"\n", shared->name); + } +} + +/* Perform getlogin_r in a subprocess with fault injection. */ +static void +test_in_subprocess (void *configure_lookup) +{ + if (configure_lookup != NULL + && __nss_configure_lookup ("passwd", configure_lookup) < 0) + { + printf ("info: __nss_configure_lookup failed: %s (%d)\n", + strerrorname_np (errno), errno); + TEST_COMPARE (errno, ENOMEM); + TEST_VERIFY (shared->allocation_count <= shared->init_allocation_count); + return; + } + + unsigned int inject_at = shared->failing_allocation; + char name[sizeof (shared->name)] = "name not set"; + int ret = getlogin_r (name, sizeof (name)); + shared->failing_allocation = ~0U; + + if (ret == 0) + { + TEST_COMPARE (shared->expected_failure, 0); + TEST_COMPARE_STRING (name, shared->name); + } + else + { + printf ("info: allocation %u failure results in error %s (%d)\n", + inject_at, strerrorname_np (ret), ret); + + if (ret != ENOMEM) + { + if (shared->expected_failure != 0) + TEST_COMPARE (ret, shared->expected_failure); + else if (configure_lookup == NULL) + /* The ENOENT failure can happen due to an issue related + to bug 22041: dlopen failure does not result in ENOMEM. */ + TEST_COMPARE (ret, ENOENT); + else + FAIL ("unexpected getlogin_r error"); + } + } + + if (shared->expected_failure == 0) + { + /* The second call should succeed. */ + puts ("info: about to perform second getlogin_r call"); + ret = getlogin_r (name, sizeof (name)); + if (configure_lookup == NULL) + { + /* This check can fail due to bug 22041 if the malloc error + injection causes a failure internally in dlopen. */ + if (ret != 0) + { + printf ("warning: second getlogin_r call failed with %s (%d)\n", + strerrorname_np (ret), ret); + TEST_COMPARE (ret, ENOENT); + } + } + else + /* If __nss_configure_lookup has been called, the error caching + bug does not happen because nss_files is built-in, and the + second getlogin_r is expected to succeed. */ + TEST_COMPARE (ret, 0); + if (ret == 0) + TEST_COMPARE_STRING (name, shared->name); + } +} + +/* Set by the --failing-allocation command line option. Together with + --direct, this can be used to trigger an allocation failure in the + original process, which may help with debugging. */ +static int option_failing_allocation = -1; + +/* Set by --override, to be used with --failing-allocation. Turns on + the __nss_configure_lookup call for passwd/files, which is disabled + by default. */ +static int option_override = 0; + +static int +do_test (void) +{ + char files[] = "files"; + + if (option_failing_allocation >= 0) + { + /* The test was invoked with --failing-allocation. Perform just + one test, using the original nsswitch.conf. This is a + condensed version of the probing/testing loop below. */ + printf ("info: testing with failing allocation %d\n", + option_failing_allocation); + shared = support_shared_allocate (sizeof (*shared)); + shared->failing_allocation = ~0U; + char *configure_lookup = option_override ? files : NULL; + support_isolate_in_subprocess (initialize, configure_lookup); + shared->allocation_count = 0; + shared->failing_allocation = option_failing_allocation; + test_in_subprocess (configure_lookup); /* No subprocess. */ + support_shared_free (shared); + shared = NULL; + return 0; + } + + bool any_success = false; + + for (int do_configure_lookup = 0; do_configure_lookup < 2; + ++do_configure_lookup) + { + if (do_configure_lookup) + puts ("info: testing with nsswitch.conf override"); + else + puts ("info: testing with original nsswitch.conf"); + + char *configure_lookup = do_configure_lookup ? files : NULL; + + shared = support_shared_allocate (sizeof (*shared)); + + /* Disable fault injection. */ + shared->failing_allocation = ~0U; + + support_isolate_in_subprocess (no_op, NULL); + TEST_COMPARE (shared->allocation_count, 0); + + support_isolate_in_subprocess (initialize, configure_lookup); + + if (shared->name[0] != '\0') + any_success = true; + + /* The number of allocations in the successful case. Once the + number of expected allocations is exceeded, injecting further + failures does not make a difference (assuming that the number + of malloc calls is deterministic). */ + unsigned int maximum_allocation_count = shared->allocation_count; + printf ("info: initial getlogin_r performed %u allocations\n", + maximum_allocation_count); + + for (unsigned int inject_at = 0; inject_at <= maximum_allocation_count; + ++inject_at) + { + printf ("info: running fault injection at allocation %u\n", + inject_at); + shared->allocation_count = 0; + shared->failing_allocation = inject_at; + support_isolate_in_subprocess (test_in_subprocess, configure_lookup); + } + + support_shared_free (shared); + shared = NULL; + } + + { + FILE *fp = fopen (_PATH_NSSWITCH_CONF, "r"); + if (fp == NULL) + printf ("info: no %s file\n", _PATH_NSSWITCH_CONF); + else + { + printf ("info: %s contents follows\n", _PATH_NSSWITCH_CONF); + int last_ch = '\n'; + while (true) + { + int ch = fgetc (fp); + if (ch == EOF) + break; + putchar (ch); + last_ch = ch; + } + if (last_ch != '\n') + putchar ('\n'); + printf ("(end of %s contents)\n", _PATH_NSSWITCH_CONF); + xfclose (fp); + } + } + + support_record_failure_barrier (); + + if (!any_success) + FAIL_UNSUPPORTED ("no successful getlogin_r calls"); + + return 0; +} + +static void +cmdline_process (int c) +{ + if (c == 'F') + option_failing_allocation = atoi (optarg); +} + +#define CMDLINE_OPTIONS \ + { "failing-allocation", required_argument, NULL, 'F' }, \ + { "override", no_argument, &option_override, 1 }, + +#define CMDLINE_PROCESS cmdline_process + +#include commit 911bd469f80c6378da9319fe7508d012f95fc20c Author: Adhemerval Zanella Date: Thu Feb 26 09:49:19 2026 -0300 debug: Fix build with --enable-fortify-source=1 (BZ 33904) The libio/bits/stdio2-decl.h only defined the prototypes for __vasprintf_chk and __vfprintf_chk for __USE_FORTIFY_LEVEL > 1. Also defined them for the internal header regardless. Checked with a build with --enable-fortify-source=1 and --enable-fortify-source=2 for all afftected ABIs. (cherry picked from commit f96e9bd2fecce3f0284479a5c0dac6989736c8c8) diff --git a/include/bits/stdio2-decl.h b/include/bits/stdio2-decl.h index 9758bf4b55..97c2236f24 100644 --- a/include/bits/stdio2-decl.h +++ b/include/bits/stdio2-decl.h @@ -3,6 +3,8 @@ #ifndef _ISOMAC libc_hidden_proto (__fgets_unlocked_chk) libc_hidden_ldbl_proto (vfprintf) +extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW; libc_hidden_ldbl_proto (__vasprintf_chk) +extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list); libc_hidden_ldbl_proto (__vfprintf_chk) #endif commit c3ceb93dc4f67253037644dc8f194831e27f3160 Author: Adhemerval Zanella Date: Thu Feb 26 10:21:24 2026 -0300 Add BZ 33904 entry to NEWS diff --git a/NEWS b/NEWS index 1f07633e57..cec8b61f55 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ The following bugs are resolved with this release: results [33848] build: Build fails at openat2.h, redefinition of 'struct open_how' + [33904] build: error: '__vasprintf_chk' undeclared here Version 2.43 commit 9898ea58b538e325a25f53bde021d0ca07d0a1c0 Author: Wilco Dijkstra Date: Fri Feb 27 20:20:45 2026 +0000 malloc: Avoid accessing /sys/kernel/mm files On AArch64 malloc always checks /sys/kernel/mm/transparent_hugepage/enabled to set the THP mode. However this check is quite expensive and the file may not be accessible in containers. If DEFAULT_THP_PAGESIZE is non-zero, use malloc_thp_mode_madvise so that we take advantage of THP in all cases. Since madvise is a fast systemcall, it adds only a small overhead compared to the cost of mmap and populating the pages. Reviewed-by: Aurelien Jarno (cherry picked from commit 2e8a940df14e9e03fd5bd01015ebbd00c1a5e9b4) diff --git a/malloc/arena.c b/malloc/arena.c index 5bfcd7f972..d83b4db068 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -276,6 +276,15 @@ __ptmalloc_init (void) __always_fail_morecore = true; #endif + /* Enable THP if DEFAULT_THP_PAGESIZE is non-zero. Avoid quering the THP + page size or mode since accessing /sys/kernel/mm is relatively slow and + might not be accessible in containers. */ + if (DEFAULT_THP_PAGESIZE > 0) + { + mp_.thp_mode = malloc_thp_mode_madvise; + mp_.thp_pagesize = DEFAULT_THP_PAGESIZE; + } + thread_arena = &main_arena; malloc_init_state (&main_arena); diff --git a/malloc/malloc.c b/malloc/malloc.c index a49e211925..771e7d40b7 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1902,26 +1902,11 @@ free_perturb (char *p, size_t n) /* ----------- Routines dealing with transparent huge pages ----------- */ -static __always_inline void -thp_init (void) -{ - /* Initialize only once if DEFAULT_THP_PAGESIZE is defined. */ - if (DEFAULT_THP_PAGESIZE == 0 || mp_.thp_mode != malloc_thp_mode_not_supported) - return; - - /* Set thp_pagesize even if thp_mode is never. This reduces frequency - of MORECORE () invocation. */ - mp_.thp_mode = __malloc_thp_mode (); - mp_.thp_pagesize = DEFAULT_THP_PAGESIZE; -} - static inline void madvise_thp (void *p, INTERNAL_SIZE_T size) { #ifdef MADV_HUGEPAGE - thp_init (); - /* Only use __madvise if the system is using 'madvise' mode and the size is at least a huge page, otherwise the call is wasteful. */ if (mp_.thp_mode != malloc_thp_mode_madvise || size < mp_.thp_pagesize) @@ -2472,9 +2457,6 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av) previous calls. Otherwise, we correct to page-align below. */ - /* Ensure thp_pagesize is initialized. */ - thp_init (); - if (__glibc_unlikely (mp_.thp_pagesize != 0)) { uintptr_t lastbrk = (uintptr_t) MORECORE (0); commit fa4a40c7d497fa99e578495f02b5ad5e449c72b1 Author: Yury Khrustalev Date: Mon Feb 16 12:46:39 2026 +0000 tests: aarch64: fix makefile dependencies for dlopen tests for BTI Some BTI tests in the sysdeps/aarch64 directory use test shared objects via dlopen. Due to lack of direct makefile level dependencies on these modules these tests could be run before the required .so files would be created. This could lead to flaky test results when running make check with -j flag. This commit fixes it. Reviewed-by: Wilco Dijkstra (cherry picked from commit 4db97f4d04cd2ad87f75b7219de2cb851fc62ebd) diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile index 0d32eddf36..ff4f72c45e 100644 --- a/sysdeps/aarch64/Makefile +++ b/sysdeps/aarch64/Makefile @@ -132,6 +132,12 @@ $(objpfx)tst-bti-permissive-transitive: $(objpfx)tst-bti-mod.so $(objpfx)tst-bti-ld-debug-shared: $(objpfx)tst-bti-mod.so $(objpfx)tst-bti-ld-debug-both: $(objpfx)tst-bti-mod-unprot.so +$(objpfx)tst-bti-dlopen-imm.out: $(objpfx)tst-bti-mod-unprot.so +$(objpfx)tst-bti-dlopen-prot.out: $(objpfx)tst-bti-mod-prot.so +$(objpfx)tst-bti-dlopen-transitive.out: $(objpfx)tst-bti-mod.so +$(objpfx)tst-bti-ld-debug-dlopen.out: $(objpfx)tst-bti-mod-unprot.so +$(objpfx)tst-bti-permissive-dlopen.out: $(objpfx)tst-bti-mod-unprot.so + $(objpfx)tst-bti-abort-unprot-preload.out: $(objpfx)tst-bti-mod-unprot-preload.so tst-bti-abort-unprot-preload-ENV = \ GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1 \ commit 2ee41ba6ecd34bf7e5c4f90fdfa20376c1dcecb0 Author: Yury Khrustalev Date: Mon Feb 2 18:27:53 2026 +0000 aarch64: Lock GCS status at startup If GCS is enabled (see tunable glibc.cpu.aarch64_gcs), we lock all GCS operations (including status, write on shadow stack, and push to shadow stack) unless OPTIONAL policy is used. Reviewed-by: Adhemerval Zanella (cherry picked from commit 5061f524a2976daf3062dd34beae1d7d15502770) diff --git a/manual/tunables.texi b/manual/tunables.texi index 7956df919b..29f2ba000f 100644 --- a/manual/tunables.texi +++ b/manual/tunables.texi @@ -620,42 +620,54 @@ This tunable controls Guarded Control Stack (GCS) for the process. Accepted values are: -0 = disabled: do not enable GCS. - -1 = enforced: check markings and fail if any binary is not marked. - -2 = optional: check markings but keep GCS off if any binary is unmarked. - -3 = override: enable GCS, markings are ignored. +@itemize @bullet +@item @code{0} = disabled: do not enable GCS. +@item @code{1} = enforced: check markings and abort if any binary is not +marked, otherwise enable GCS and lock all GCS features. +@item @code{2} = optional: check markings but keep GCS off if any binary +is unmarked, otherwise enable GCS but do not lock any GCS features. +@item @code{3} = override: enable GCS and lock all GCS features, markings +are ignored. +@end itemize If unmarked binary is loaded via @code{dlopen} when GCS is enabled and -markings are not ignored (@code{aarch64_gcs == 1} or @code{2}), then -the process will be aborted. +markings are not ignored (i.e. @code{aarch64_gcs == 1} or @code{2}), then +@code{dlopen} will return an error. Default is @code{0}, so GCS is disabled by default. -This tunable is specific to AArch64. On systems that do not support +This tunable is specific to AArch64. On systems that do not support Guarded Control Stack this tunable has no effect. +GCS features (or operations on shadow stack) such as @code{STATUS} (i.e. +enabling and disabling GCS), @code{WRITE}, and @code{PUSH}, will be locked +for the @code{enforced} and @code{override} tunable values. + Before enabling GCS for the process the value of this tunable is checked and depending on it the following outcomes are possible. -@code{aarch64_gcs == 0}: GCS will not be enabled and GCS markings will not be +@itemize @bullet +@item +@code{aarch64_gcs == 0}: GCS will remain disabled and GCS markings will not be checked for any binaries. - +@item @code{aarch64_gcs == 1}: GCS markings will be checked for all binaries loaded -at startup and, only if all binaries are GCS-marked, GCS will be enabled. If -any of the binaries are not GCS-marked, the process will abort. Subsequent call -to @code{dlopen} for an unmarked binary will also result in abort. - +at startup and, only if all binaries are GCS-marked, GCS will be enabled and +all GCS features will be locked. If any of the binaries are not GCS-marked, +the process will abort. Subsequent call to @code{dlopen} for an unmarked binary +will result in @code{dlopen} returning an error. +@item @code{aarch64_gcs == 2}: GCS markings will be checked for all binaries loaded at startup and, if any of such binaries are not GCS-marked, GCS will not be -enabled and there will be no more checks for GCS marking. If all binaries -loaded at startup are GCS-marked, then GCS will be enabled, in which case a -call to @code{dlopen} for an unmarked binary will also result in abort. +enabled and there will be no more checks for GCS marking. If all binaries +loaded at startup are GCS-marked, then GCS will be enabled but GCS features +will not be locked. In this case a call to @code{dlopen} for an unmarked binary +will result in @code{dlopen} returning an error. +@item +@code{aarch64_gcs == 3}: GCS will be enabled and all GCS features will be +locked. GCS markings will not be checked for any binaries. +@end itemize -@code{aarch64_gcs == 3}: GCS will be enabled and GCS markings will not be -checked for any binaries. @end deftp @node Memory Related Tunables diff --git a/sysdeps/aarch64/dl-gcs.c b/sysdeps/aarch64/dl-gcs.c index e1d1db4852..841d6428d6 100644 --- a/sysdeps/aarch64/dl-gcs.c +++ b/sysdeps/aarch64/dl-gcs.c @@ -147,3 +147,9 @@ void _dl_gcs_enable_failed (int code) { _dl_fatal_printf ("failed to enable GCS: %d\n", -code); } + +/* Used to report error when prctl system call to lock GCS fails. */ +void _dl_gcs_lock_failed (int code) +{ + _dl_fatal_printf ("failed to lock GCS: %d\n", -code); +} diff --git a/sysdeps/aarch64/dl-start.S b/sysdeps/aarch64/dl-start.S index 3b5ff2cccb..c278485cd3 100644 --- a/sysdeps/aarch64/dl-start.S +++ b/sysdeps/aarch64/dl-start.S @@ -35,12 +35,13 @@ ENTRY (_start) /* Use GL(dl_aarch64_gcs) to set the shadow stack status. */ adrp x16, _rtld_local add x16, x16, :lo12:_rtld_local - ldr x1, [x16, GL_DL_AARCH64_GCS_OFFSET] - cbz x1, L(skip_gcs_enable) + ldr x22, [x16, GL_DL_AARCH64_GCS_OFFSET] + cbz x22, L(skip_gcs_enable) /* Enable GCS before user code runs. Note that IFUNC resolvers and LD_AUDIT hooks may run before, but should not create threads. */ #define PR_SET_SHADOW_STACK_STATUS 75 +#define PR_LOCK_SHADOW_STACK_STATUS 76 #define PR_SHADOW_STACK_ENABLE (1UL << 0) mov x0, PR_SET_SHADOW_STACK_STATUS mov x1, PR_SHADOW_STACK_ENABLE @@ -50,6 +51,19 @@ ENTRY (_start) mov x8, #SYS_ify(prctl) svc 0x0 cbnz w0, L(failed_gcs_enable) + /* Check if we need to lock GCS features. */ + /* If the aarch64_gcs tunable is either 0 or 2 do not lock GCS. */ + tst x22, #-3 + beq L(skip_gcs_enable) + mov x0, PR_LOCK_SHADOW_STACK_STATUS + /* Lock everything including future operations. */ + mov x1, ~0 + mov x2, 0 + mov x3, 0 + mov x4, 0 + mov x8, #SYS_ify(prctl) + svc 0x0 + cbnz w0, L(failed_gcs_lock) L(skip_gcs_enable): .globl _dl_start_user @@ -75,4 +89,7 @@ _dl_start_user: L(failed_gcs_enable): b _dl_gcs_enable_failed +L(failed_gcs_lock): + b _dl_gcs_lock_failed + END (_start) diff --git a/sysdeps/unix/sysv/linux/aarch64/libc-start.h b/sysdeps/unix/sysv/linux/aarch64/libc-start.h index 9eecc557fd..4ccd13741b 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc-start.h +++ b/sysdeps/unix/sysv/linux/aarch64/libc-start.h @@ -25,9 +25,17 @@ # ifndef PR_SET_SHADOW_STACK_STATUS # define PR_SET_SHADOW_STACK_STATUS 75 +# define PR_LOCK_SHADOW_STACK_STATUS 76 # define PR_SHADOW_STACK_ENABLE (1UL << 0) # endif +# ifndef GCS_POLICY_DISABLED +/* GCS is disabled. */ +# define GCS_POLICY_DISABLED 0 +/* Optionally enable GCS if all startup dependencies are marked. */ +# define GCS_POLICY_OPTIONAL 2 +# endif + /* Must be on a top-level stack frame that does not return. */ static inline void __attribute__((always_inline)) aarch64_libc_setup_tls (void) @@ -46,12 +54,23 @@ aarch64_libc_setup_tls (void) _rtld_main_check (main_map, _dl_argv[0]); - if (GL(dl_aarch64_gcs) != 0) + uint64_t gcs = GL (dl_aarch64_gcs); + if (gcs != GCS_POLICY_DISABLED) { - int ret = INLINE_SYSCALL_CALL (prctl, PR_SET_SHADOW_STACK_STATUS, - PR_SHADOW_STACK_ENABLE, 0, 0, 0); - if (ret) - _dl_fatal_printf ("failed to enable GCS: %d\n", -ret); + int ret; + ret = INLINE_SYSCALL_CALL (prctl, PR_SET_SHADOW_STACK_STATUS, + PR_SHADOW_STACK_ENABLE, 0, 0, 0); + if (ret != 0) + _dl_fatal_printf ("failed to enable GCS: %d\n", -ret); + /* Do not lock GCS features if policy is OPTIONAL. */ + if (gcs != GCS_POLICY_OPTIONAL) + { + /* Lock all bits, including future bits. */ + ret = INLINE_SYSCALL_CALL (prctl, PR_LOCK_SHADOW_STACK_STATUS, + ~0, 0, 0, 0); + if (ret != 0) + _dl_fatal_printf ("failed to lock GCS: %d\n", -ret); + } } } commit 305ce0b58809869295e62c3caa7eda4c8e41134f Author: Yury Khrustalev Date: Tue Feb 3 15:51:11 2026 +0000 aarch64: Tests for locking GCS Check that GCS is locked properly based on the value of the glibc.cpu.aarch64_gcs tunable. Test tst-gcs-execv checks that a child process can be spawned correctly when GCS is locked for the parent process. Test tst-gcs-fork checks that if GCS is not locked for the parent process, the forked child can disable GCS. Tests tst-gcs-lock and tst-gcs-lock-static check that GCS is locked for dynamic and static executables when run with aarch64_gcs=1. Tests tst-gcs-unlock and tst-gcs-unlock-static check that GCS is not locked for dynamic and static executables when run with aarch64_gcs=0. Test tst-gcs-lock-ptrace checks via ptrace that when GCS is locked, all GCS features are locked. Reviewed-by: Adhemerval Zanella (cherry picked from commit ad9784419e274cef9ba7152d7cd2490d291f837b) diff --git a/sysdeps/unix/sysv/linux/aarch64/Makefile b/sysdeps/unix/sysv/linux/aarch64/Makefile index b8eb9c0752..89a02faed1 100644 --- a/sysdeps/unix/sysv/linux/aarch64/Makefile +++ b/sysdeps/unix/sysv/linux/aarch64/Makefile @@ -32,10 +32,14 @@ gcs-tests-dynamic = \ tst-gcs-dlopen-override \ tst-gcs-enforced \ tst-gcs-enforced-abort \ + tst-gcs-execv \ + tst-gcs-fork \ tst-gcs-ld-debug-both \ tst-gcs-ld-debug-dlopen \ tst-gcs-ld-debug-exe \ tst-gcs-ld-debug-shared \ + tst-gcs-lock \ + tst-gcs-lock-ptrace \ tst-gcs-noreturn \ tst-gcs-optional-off \ tst-gcs-optional-on \ @@ -48,15 +52,18 @@ gcs-tests-dynamic = \ tst-gcs-shared-enforced-abort \ tst-gcs-shared-optional \ tst-gcs-shared-override \ + tst-gcs-unlock \ # gcs-tests-dynamic gcs-tests-static = \ tst-gcs-disabled-static \ tst-gcs-enforced-static \ tst-gcs-enforced-static-abort \ + tst-gcs-lock-static \ tst-gcs-optional-static-off \ tst-gcs-optional-static-on \ tst-gcs-override-static \ + tst-gcs-unlock-static \ # gcs-tests-static tests += \ @@ -106,6 +113,24 @@ tst-gcs-optional-static-on-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=2 tst-gcs-optional-static-off-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=2 tst-gcs-override-static-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=3 +LDFLAGS-tst-gcs-execv += -Wl,-z,gcs=always +tst-gcs-execv-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=1 +tst-gcs-execv-ARGS = -- $(host-test-program-cmd) +LDFLAGS-tst-gcs-fork += -Wl,-z,gcs=always +tst-gcs-fork-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=2 + +LDFLAGS-tst-gcs-lock += -Wl,-z,gcs=always +tst-gcs-lock-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=1 +LDFLAGS-tst-gcs-lock-ptrace += -Wl,-z,gcs=always +tst-gcs-lock-ptrace-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=1 +tst-gcs-lock-ptrace-ARGS = -- $(host-test-program-cmd) +LDFLAGS-tst-gcs-lock-static += -Wl,-z,gcs=always +tst-gcs-lock-static-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=1 +LDFLAGS-tst-gcs-unlock += -Wl,-z,gcs=always +tst-gcs-unlock-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=2 +LDFLAGS-tst-gcs-unlock-static += -Wl,-z,gcs=always +tst-gcs-unlock-static-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_gcs=2 + # force one of the dependencies to be unmarked LDFLAGS-tst-gcs-mod2.so += -Wl,-z,gcs=never diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-execv.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-execv.c new file mode 100644 index 0000000000..91053a4726 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-execv.c @@ -0,0 +1,91 @@ +/* AArch64 test for GCS for creating child process. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-gcs-helper.h" + +#include +#include +#include +#include + +static int +target (void) +{ + /* In child. */ + printf ("in child: %u\n", getpid ()); + TEST_VERIFY (__check_gcs_status ()); + + /* Try disabling GCS (should fail with EBUSY). */ + int res = prctl (PR_SET_SHADOW_STACK_STATUS, 0, 0, 0, 0); + TEST_COMPARE (res, -1); + TEST_COMPARE (errno, EBUSY); + return 0; +} + +int main(int argc, char *argv[]) +{ + /* Check if GCS could possible by enabled. */ + if (!(getauxval (AT_HWCAP) & HWCAP_GCS)) + FAIL_UNSUPPORTED ("kernel or CPU does not support GCS"); + + /* GCS should be enabled for this test at the start. */ + TEST_VERIFY (__check_gcs_status ()); + + /* If last argument is 'target', we just run target code. */ + if (strcmp (argv[argc - 1], "target") == 0) + return target (); + + /* In parent, we should at least have 3 arguments. */ + if (argc < 3) + FAIL_EXIT1 ("wrong number of arguments: %d", argc); + + char *child_args[] = { NULL, NULL, NULL, NULL, NULL, NULL }; + + /* Check command line arguments to construct child command. */ + if (strcmp (argv[0], argv[2]) == 0) + { + /* Command looks like + /path/to/test -- /path/to/test */ + /* /path/to/test */ + child_args[0] = argv[0]; + /* Extra argument for the child process. */ + child_args[1] = (char *)"target"; + } + else + { + /* Command looks like + /path/to/test -- /path/to/ld.so ... */ + TEST_VERIFY_EXIT (argc > 5); + TEST_COMPARE_STRING (argv[3], "--library-path"); + /* /path/to/ld-linux-aarch64.so.1 */ + child_args[0] = argv[2]; + /* --library-path */ + child_args[1] = argv[3]; + /* Library path... */ + child_args[2] = argv[4]; + /* /path/to/test */ + child_args[3] = argv[5]; + /* Extra argument for the child process. */ + child_args[4] = (char *)"target"; + } + + printf ("in parent: %u\n", getpid ()); + /* Spawn child process. */ + execv (child_args[0], child_args); + FAIL_EXIT1 ("execv: %m"); +} diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-fork.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-fork.c new file mode 100644 index 0000000000..365807a562 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-fork.c @@ -0,0 +1,75 @@ +/* AArch64 test for GCS for creating child process using fork. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-gcs-helper.h" + +#include +#include +#include +#include +#include +#include +#include + +static int +do_test (void) +{ + /* Check if GCS could possible by enabled. */ + if (!(getauxval (AT_HWCAP) & HWCAP_GCS)) + FAIL_UNSUPPORTED ("kernel or CPU does not support GCS"); + + /* GCS should be enabled for this test at the start. */ + TEST_VERIFY (__check_gcs_status ()); + + pid_t pid = xfork (); + const char *name; + if (pid == 0) + name = "child"; + else + name = "parent"; + + /* Both parent and child should initially have GCS enabled. */ + TEST_VERIFY (__check_gcs_status ()); + uint64_t data; + if (prctl (PR_GET_SHADOW_STACK_STATUS, &data, 0, 0, 0)) + FAIL_EXIT1 ("prctl: %m"); + printf ("in %s: gcs status: %016lx\n", name, data); + + if (pid) + { + int status; + xwaitpid (pid, &status, 0); + printf ("in %s: child exited with code %u\n", name, WEXITSTATUS(status)); + } + else + { + /* Try disabling GCS for the child + (should succeed because of the tunable). */ + if (prctl (PR_SET_SHADOW_STACK_STATUS, 0, 0, 0, 0)) + FAIL_EXIT1 ("prctl: %m"); + /* GCS should be disabled. */ + TEST_VERIFY (!__check_gcs_status ()); + if (prctl (PR_GET_SHADOW_STACK_STATUS, &data, 0, 0, 0)) + FAIL_EXIT1 ("prctl: %m"); + printf ("in %s: gcs status: %016lx\n", name, data); + } + + return 0; +} + +#include diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-helper.h b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-helper.h index 35ce0036ec..c075fdc205 100644 --- a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-helper.h +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-helper.h @@ -26,7 +26,13 @@ #include #include -static bool __check_gcs_status (void) +#ifndef PR_SET_SHADOW_STACK_STATUS +# define PR_GET_SHADOW_STACK_STATUS 74 +# define PR_SET_SHADOW_STACK_STATUS 75 +#endif + +static bool +__check_gcs_status (void) { register unsigned long x16 asm ("x16"); asm volatile ( diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock-ptrace.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock-ptrace.c new file mode 100644 index 0000000000..27fa1d3dea --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock-ptrace.c @@ -0,0 +1,166 @@ +/* AArch64 test for GCS for creating child process using fork + with ptrace to check locked GCS operations. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-gcs-helper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Uapi struct for PTRACE_GETREGSET with NT_ARM_GCS. */ +struct user_gcs +{ + uint64_t enabled; + uint64_t locked; + uint64_t gcspr_el0; +}; + +static int +target (void) +{ + /* This signal is raised after the process has started + and has been initialised so we can ptrace it at this + point and obtain GCS locked features. */ + xraise (SIGUSR1); + return 0; +} + +static void +fork_target (char *args[], uint64_t aarch64_gcs) +{ + /* Currently kernel returns only lower 32 bits of locked + features so we only compare them. */ + bool lock_gcs = aarch64_gcs != 0 && aarch64_gcs != 2; + uint64_t expected_locked = lock_gcs ? 0xfffffffful : 0ul; + pid_t pid = xfork (); + if (pid == 0) + { + char tunables[90]; + snprintf (tunables, sizeof (tunables), "GLIBC_TUNABLES=" + "glibc.cpu.aarch64_gcs=0x%016lx", aarch64_gcs); + char *envp[] = { tunables, NULL }; + /* We need to ptrace child process to use PTRACE_GETREGSET + with NT_ARM_GCS after it has started. */ + int res = ptrace (PTRACE_TRACEME, 0, NULL, NULL); + if (res != 0) + FAIL_EXIT1 ("ptrace: %m"); + execve (args[0], args, envp); + FAIL_EXIT1 ("execve: %m"); + } + bool checked = false; + while (true) + { + int status; + xwaitpid (pid, &status, 0); + if (WIFSTOPPED (status)) + { + /* Child stopped by signal. */ + int sig = WSTOPSIG (status); + if (sig == SIGUSR1) + { + struct user_gcs ugcs = {}; + struct iovec io; + io.iov_base = &ugcs; + io.iov_len = sizeof (struct user_gcs); + if (ptrace (PTRACE_GETREGSET, pid, NT_ARM_GCS, &io)) + FAIL_EXIT1 ("ptrace (PTRACE_GETREGSET): %m"); + printf ("expected vs locked: %016lx %016lx\n", + expected_locked, ugcs.locked); + if (lock_gcs) + TEST_VERIFY_EXIT (ugcs.enabled); + TEST_VERIFY_EXIT (ugcs.locked == expected_locked); + if (aarch64_gcs != 0) + TEST_VERIFY_EXIT ((void *) ugcs.gcspr_el0 != NULL); + checked = true; + } + } + else if (WIFSIGNALED (status)) + { + /* Child terminated by signal. */ + break; + } + else if (WIFEXITED (status)) + { + /* Child terminated by normally. */ + break; + } + ptrace (PTRACE_CONT, pid, 0, 0); + } + /* If child process hasn't run correctly, this will remain false. */ + TEST_VERIFY_EXIT (checked); +} + +int main(int argc, char *argv[]) +{ + /* Check if GCS could possible by enabled. */ + if (!(getauxval (AT_HWCAP) & HWCAP_GCS)) + FAIL_UNSUPPORTED ("kernel or CPU does not support GCS"); + + /* GCS should be enabled for this test. */ + TEST_VERIFY (__check_gcs_status ()); + + /* If last argument is 'target', we just run target code. */ + if (strcmp (argv[argc - 1], "target") == 0) + return target (); + + /* In parent, we should at least have 3 arguments. */ + if (argc < 3) + FAIL_EXIT1 ("wrong number of arguments: %d", argc); + + char *child_args[] = { NULL, NULL, NULL, NULL, NULL , NULL }; + + /* Check command line arguments to construct child command. */ + if (strcmp (argv[0], argv[2]) == 0) + { + /* Command looks like + /path/to/test -- /path/to/test */ + /* /path/to/test */ + child_args[0] = argv[0]; + /* Extra argument for the child process. */ + child_args[1] = (char *)"target"; + } + else + { + /* Command looks like + /path/to/test -- /path/to/ld.so ... */ + TEST_VERIFY_EXIT (argc > 5); + TEST_COMPARE_STRING (argv[3], "--library-path"); + /* /path/to/ld-linux-aarch64.so.1 */ + child_args[0] = argv[2]; + /* --library-path */ + child_args[1] = argv[3]; + /* Library path... */ + child_args[2] = argv[4]; + /* /path/to/test */ + child_args[3] = argv[5]; + /* Extra argument for the child process. */ + child_args[4] = (char *)"target"; + } + + /* Check all 4 values for the aarch64_gcs tunable. */ + for (uint64_t aarch64_gcs = 0; aarch64_gcs < 4; aarch64_gcs++) + fork_target (child_args, aarch64_gcs); + return 0; +} diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock-static.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock-static.c new file mode 100644 index 0000000000..b80e2f70e8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock-static.c @@ -0,0 +1 @@ +#include "tst-gcs-lock.c" diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock.c new file mode 100644 index 0000000000..9a17ef514d --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-lock.c @@ -0,0 +1,58 @@ +/* AArch64 test for GCS locking. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-gcs-helper.h" + +#include +#include +#include + +static int +do_test (void) +{ + /* Check if GCS could possible by enabled. */ + if (!(getauxval (AT_HWCAP) & HWCAP_GCS)) + FAIL_UNSUPPORTED ("kernel or CPU does not support GCS"); + + TEST_VERIFY (__check_gcs_status ()); + + /* Try disabling GCS. */ + int res = prctl (PR_SET_SHADOW_STACK_STATUS, 0, 0, 0, 0); + if (res) + { + TEST_COMPARE (errno, EBUSY); +#ifdef GCS_SHOULD_UNLOCK + FAIL_EXIT1 ("GCS was not unlocked (was supposed to): %m"); +#else + TEST_VERIFY (__check_gcs_status ()); +#endif + } + else + { +#ifdef GCS_SHOULD_UNLOCK + TEST_VERIFY (!__check_gcs_status ()); + puts ("GCS unlocked successfully"); +#else + FAIL_EXIT1 ("GCS was unlocked (was not supposed to)"); +#endif + } + + return 0; +} + +#include diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-unlock-static.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-unlock-static.c new file mode 100644 index 0000000000..7e02820031 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-unlock-static.c @@ -0,0 +1,2 @@ +#define GCS_SHOULD_UNLOCK +#include "tst-gcs-lock.c" diff --git a/sysdeps/unix/sysv/linux/aarch64/tst-gcs-unlock.c b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-unlock.c new file mode 100644 index 0000000000..7e02820031 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/tst-gcs-unlock.c @@ -0,0 +1,2 @@ +#define GCS_SHOULD_UNLOCK +#include "tst-gcs-lock.c" commit 2be6cf2e75d091f2aef606af4ddd876855b77abb Author: Florian Weimer Date: Mon Jan 26 17:12:37 2026 +0100 posix: Run tst-wordexp-reuse-mem test The test was not properly scheduled for execution with a Makefile dependency. Fixes commit 80cc58ea2de214f85b0a1d902a3b668ad2ecb302 ("posix: Reset wordexp_t fields with WRDE_REUSE (CVE-2025-15281 / BZ 33814"). (cherry picked from commit bed2db02f3183e93f21d506786c5f884a1dec9e7) diff --git a/posix/Makefile b/posix/Makefile index 71a1906168..f377948462 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -499,7 +499,7 @@ tests-special += \ $(objpfx)tst-pcre-mem.out \ $(objpfx)tst-rxspencer-no-utf8-mem.out \ $(objpfx)tst-vfork3-mem.out \ - $(objpfx)tst-wordexp-reuse.out \ + $(objpfx)tst-wordexp-reuse-mem.out \ # tests-special endif endif commit 5c6fca0c62ce5bd6e68e259f138097756cbafd4d Author: Carlos O'Donell Date: Fri Mar 20 16:43:33 2026 -0400 resolv: Count records correctly (CVE-2026-4437) The answer section boundary was previously ignored, and the code in getanswer_ptr would iterate past the last resource record, but not beyond the end of the returned data. This could lead to subsequent data being interpreted as answer records, thus violating the DNS specification. Such resource records could be maliciously crafted and hidden from other tooling, but processed by the glibc stub resolver and acted upon by the application. While we trust the data returned by the configured recursive resolvers, we should not trust its format and should validate it as required. It is a security issue to incorrectly process the DNS protocol. A regression test is added for response section crossing. No regressions on x86_64-linux-gnu. Reviewed-by: Collin Funk (cherry picked from commit 9f5f18aab40ec6b61fa49a007615e6077e9a979b) diff --git a/resolv/Makefile b/resolv/Makefile index b74c8f325e..d5ef63cdbc 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -107,6 +107,7 @@ tests += \ tst-resolv-basic \ tst-resolv-binary \ tst-resolv-byaddr \ + tst-resolv-dns-section \ tst-resolv-edns \ tst-resolv-invalid-cname \ tst-resolv-network \ @@ -118,6 +119,7 @@ tests += \ tst-resolv-semi-failure \ tst-resolv-short-response \ tst-resolv-trailing \ + # tests # This test calls __res_context_send directly, which is not exported # from libresolv. @@ -301,6 +303,8 @@ $(objpfx)tst-resolv-aliases: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-basic: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-binary: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-byaddr: $(objpfx)libresolv.so $(shared-thread-library) +$(objpfx)tst-resolv-dns-section: $(objpfx)libresolv.so \ + $(shared-thread-library) $(objpfx)tst-resolv-edns: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-network: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-res_init: $(objpfx)libresolv.so diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 6a60c87532..893137027e 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -820,7 +820,7 @@ getanswer_ptr (unsigned char *packet, size_t packetlen, /* expected_name may be updated to point into this buffer. */ unsigned char name_buffer[NS_MAXCDNAME]; - while (ancount > 0) + for (; ancount > 0; --ancount) { struct ns_rr_wire rr; if (!__ns_rr_cursor_next (&c, &rr)) diff --git a/resolv/tst-resolv-dns-section.c b/resolv/tst-resolv-dns-section.c new file mode 100644 index 0000000000..1171baef51 --- /dev/null +++ b/resolv/tst-resolv-dns-section.c @@ -0,0 +1,162 @@ +/* Test handling of invalid section transitions (bug 34014). + Copyright (C) 2022-2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Name of test, and the second section type. */ +struct item { + const char *test; + int ns_section; +}; + +static const struct item test_items[] = + { + { "Test crossing from ns_s_an to ns_s_ar.", ns_s_ar }, + { "Test crossing from ns_s_an to ns_s_an.", ns_s_ns }, + + { NULL, 0 }, + }; + +/* The response is designed to contain the following: + - An Answer section with one T_PTR record that is skipped. + - A second section with a semantically invalid T_PTR record. + The original defect is that the response parsing would cross + section boundaries and handle the additional section T_PTR + as if it were an answer. A conforming implementation would + stop as soon as it reaches the end of the section. */ +static void +response (const struct resolv_response_context *ctx, + struct resolv_response_builder *b, + const char *qname, uint16_t qclass, uint16_t qtype) +{ + TEST_COMPARE (qclass, C_IN); + + /* We only test PTR. */ + TEST_COMPARE (qtype, T_PTR); + + unsigned int count; + char *tail = NULL; + + if (strstr (qname, "in-addr.arpa") != NULL + && sscanf (qname, "%u.%ms", &count, &tail) == 2) + TEST_COMPARE_STRING (tail, "0.168.192.in-addr.arpa"); + else if (sscanf (qname, "%x.%ms", &count, &tail) == 2) + { + TEST_COMPARE_STRING (tail, "\ +0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"); + } + else + FAIL_EXIT1 ("invalid QNAME: %s\n", qname); + free (tail); + + /* We have a bounded number of possible tests. */ + TEST_VERIFY (count >= 0); + TEST_VERIFY (count <= 15); + + struct resolv_response_flags flags = {}; + resolv_response_init (b, flags); + resolv_response_add_question (b, qname, qclass, qtype); + resolv_response_section (b, ns_s_an); + + /* Actual answer record, but the wrong name (skipped). */ + resolv_response_open_record (b, "1.0.0.10.in-addr.arpa", qclass, qtype, 60); + + /* Record the answer. */ + resolv_response_add_name (b, "test.ptr.example.net"); + resolv_response_close_record (b); + + /* Add a second section to test section boundary crossing. */ + resolv_response_section (b, test_items[count].ns_section); + /* Semantically incorrect, but hide a T_PTR entry. */ + resolv_response_open_record (b, qname, qclass, qtype, 60); + resolv_response_add_name (b, "wrong.ptr.example.net"); + resolv_response_close_record (b); +} + + +/* Perform one check using a reverse lookup. */ +static void +check_reverse (int af, int count) +{ + TEST_VERIFY (af == AF_INET || af == AF_INET6); + TEST_VERIFY (count < array_length (test_items)); + + char addr[sizeof (struct in6_addr)] = { 0 }; + socklen_t addrlen; + if (af == AF_INET) + { + addr[0] = (char) 192; + addr[1] = (char) 168; + addr[2] = (char) 0; + addr[3] = (char) count; + addrlen = 4; + } + else + { + addr[0] = 0x20; + addr[1] = 0x01; + addr[2] = 0x0d; + addr[3] = 0xb8; + addr[4] = addr[5] = addr[6] = addr[7] = 0x0; + addr[8] = addr[9] = addr[10] = addr[11] = 0x0; + addr[12] = 0x0; + addr[13] = 0x0; + addr[14] = 0x0; + addr[15] = count; + addrlen = 16; + } + + h_errno = 0; + struct hostent *answer = gethostbyaddr (addr, addrlen, af); + TEST_VERIFY (answer == NULL); + TEST_VERIFY (h_errno == NO_RECOVERY); + if (answer != NULL) + printf ("error: unexpected success: %s\n", + support_format_hostent (answer)); +} + +static int +do_test (void) +{ + struct resolv_test *obj = resolv_test_start + ((struct resolv_redirect_config) + { + .response_callback = response + }); + + for (int i = 0; test_items[i].test != NULL; i++) + { + check_reverse (AF_INET, i); + check_reverse (AF_INET6, i); + } + + resolv_test_end (obj); + + return 0; +} + +#include commit dd9945c0ba40d2dbc9eb7c99291ba6b69bd66718 Author: Carlos O'Donell Date: Fri Mar 20 17:14:33 2026 -0400 resolv: Check hostname for validity (CVE-2026-4438) The processed hostname in getanswer_ptr should be correctly checked to avoid invalid characters from being allowed, including shell metacharacters. It is a security issue to fail to check the returned hostname for validity. A regression test is added for invalid metacharacters and other cases of invalid or valid characters. No regressions on x86_64-linux-gnu. Reviewed-by: Adhemerval Zanella (cherry picked from commit e10977481f4db4b2a3ce34fa4c3a1e26651ae312) diff --git a/resolv/Makefile b/resolv/Makefile index d5ef63cdbc..79a1b9647f 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -110,6 +110,7 @@ tests += \ tst-resolv-dns-section \ tst-resolv-edns \ tst-resolv-invalid-cname \ + tst-resolv-invalid-ptr \ tst-resolv-network \ tst-resolv-noaaaa \ tst-resolv-noaaaa-vc \ @@ -314,6 +315,8 @@ $(objpfx)tst-resolv-res_init-thread: $(objpfx)libresolv.so \ $(shared-thread-library) $(objpfx)tst-resolv-invalid-cname: $(objpfx)libresolv.so \ $(shared-thread-library) +$(objpfx)tst-resolv-invalid-ptr: $(objpfx)libresolv.so \ + $(shared-thread-library) $(objpfx)tst-resolv-noaaaa: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-noaaaa-vc: $(objpfx)libresolv.so $(shared-thread-library) $(objpfx)tst-resolv-nondecimal: $(objpfx)libresolv.so $(shared-thread-library) diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 893137027e..728dae615d 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -866,7 +866,7 @@ getanswer_ptr (unsigned char *packet, size_t packetlen, char hname[MAXHOSTNAMELEN + 1]; if (__ns_name_unpack (c.begin, c.end, rr.rdata, name_buffer, sizeof (name_buffer)) < 0 - || !__res_binary_hnok (expected_name) + || !__res_binary_hnok (name_buffer) || __ns_name_ntop (name_buffer, hname, sizeof (hname)) < 0) { *h_errnop = NO_RECOVERY; diff --git a/resolv/tst-resolv-invalid-ptr.c b/resolv/tst-resolv-invalid-ptr.c new file mode 100644 index 0000000000..0c802ab967 --- /dev/null +++ b/resolv/tst-resolv-invalid-ptr.c @@ -0,0 +1,255 @@ +/* Test handling of invalid T_PTR results (bug 34015). + Copyright (C) 2022-2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Name of test, the answer, the expected error return, and if we + expect the call to fail. */ +struct item { + const char *test; + const char *answer; + int expected; + bool fail; +}; + +static const struct item test_items[] = + { + /* Test for invalid characters. */ + { "Invalid use of \"|\"", + "test.|.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"&\"", + "test.&.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \";\"", + "test.;.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"<\"", + "test.<.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \">\"", + "test.>.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"(\"", + "test.(.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \")\"", + "test.).ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"$\"", + "test.$.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"`\"", + "test.`.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"\\\"", + "test.\\.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"\'\"", + "test.'.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"\"\"", + "test.\".ptr.example", NO_RECOVERY, true }, + { "Invalid use of \" \"", + "test. .ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"\\t\"", + "test.\t.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"\\n\"", + "test.\n.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"\\r\"", + "test.\r.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"*\"", + "test.*.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"?\"", + "test.?.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"[\"", + "test.[.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"]\"", + "test.].ptr.example", NO_RECOVERY, true }, + { "Invalid use of \",\"", + "test.,.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"~\"", + "test.~.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \":\"", + "test.:.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"!\"", + "test.!.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"@\"", + "test.@.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"#\"", + "test.#.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"%\"", + "test.%%.ptr.example", NO_RECOVERY, true }, + { "Invalid use of \"^\"", + "test.^.ptr.example", NO_RECOVERY, true }, + + /* Test for invalid UTF-8 characters (2-byte, 4-byte, 6-byte). */ + { "Invalid use of UTF-8 (2-byte, U+00C0-U+00C2)", + "ÁÂÃ.test.ptr.example", NO_RECOVERY, true }, + { "Invalid use of UTF-8 (4-byte, U+0750-U+0752)", + "ݐݑݒ.test.ptr.example", NO_RECOVERY, true }, + { "Invalid use of UTF-8 (6-byte, U+0904-U+0906)", + "ऄअआ.test.ptr.example", NO_RECOVERY, true }, + + /* Test for "-" which may be valid depending on position. */ + { "Invalid leading \"-\"", + "-test.ptr.example", NO_RECOVERY, true }, + { "Valid trailing \"-\"", + "test-.ptr.example", 0, false }, + { "Valid mid-label use of \"-\"", + "te-st.ptr.example", 0, false }, + + /* Test for "_" which is always valid in any position. */ + { "Valid leading use of \"_\"", + "_test.ptr.example", 0, false }, + { "Valid mid-label use of \"_\"", + "te_st.ptr.example", 0, false }, + { "Valid trailing use of \"_\"", + "test_.ptr.example", 0, false }, + + /* Sanity test the broader set [A-Za-z0-9_-] of valid characters. */ + { "Valid \"[A-Z]\"", + "test.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ptr.example", 0, false }, + { "Valid \"[a-z]\"", + "test.abcdefghijklmnopqrstuvwxyz.ptr.example", 0, false }, + { "Valid \"[0-9]\"", + "test.0123456789.ptr.example", 0, false }, + { "Valid mixed use of \"[A-Za-z0-9_-]\"", + "test.012abcABZ_-.ptr.example", 0, false }, + }; + +static void +response (const struct resolv_response_context *ctx, + struct resolv_response_builder *b, + const char *qname, uint16_t qclass, uint16_t qtype) +{ + TEST_COMPARE (qclass, C_IN); + + /* We only test PTR. */ + TEST_COMPARE (qtype, T_PTR); + + unsigned int count, count1; + char *tail = NULL; + + /* The test implementation can handle up to 255 tests. */ + if (strstr (qname, "in-addr.arpa") != NULL + && sscanf (qname, "%u.%ms", &count, &tail) == 2) + TEST_COMPARE_STRING (tail, "0.168.192.in-addr.arpa"); + else if (sscanf (qname, "%x.%x.%ms", &count, &count1, &tail) == 3) + { + TEST_COMPARE_STRING (tail, "\ +0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"); + count |= count1 << 4; + } + else + FAIL_EXIT1 ("invalid QNAME: %s\n", qname); + free (tail); + + /* Cross check. Count has a fixed bound (soft limit). */ + TEST_VERIFY (count >= 0 && count <= 255); + + /* We have a fixed number of tests (hard limit). */ + TEST_VERIFY_EXIT (count < array_length (test_items)); + + struct resolv_response_flags flags = {}; + resolv_response_init (b, flags); + resolv_response_add_question (b, qname, qclass, qtype); + resolv_response_section (b, ns_s_an); + + /* Actual answer record. */ + resolv_response_open_record (b, qname, qclass, qtype, 60); + + /* Record the answer. */ + resolv_response_add_name (b, test_items[count].answer); + resolv_response_close_record (b); +} + +/* Perform one check using a reverse lookup. */ +static void +check_reverse (int af, int count) +{ + TEST_VERIFY (af == AF_INET || af == AF_INET6); + TEST_VERIFY_EXIT (count < array_length (test_items)); + + /* Generate an address to query for each test. */ + char addr[sizeof (struct in6_addr)] = { 0 }; + socklen_t addrlen; + if (af == AF_INET) + { + addr[0] = (char) 192; + addr[1] = (char) 168; + addr[2] = (char) 0; + addr[3] = (char) count; + addrlen = 4; + } + else + { + addr[0] = 0x20; + addr[1] = 0x01; + addr[2] = 0x0d; + addr[3] = 0xb8; + addr[4] = addr[5] = addr[6] = addr[7] = 0x0; + addr[8] = addr[9] = addr[10] = addr[11] = 0x0; + addr[12] = 0x0; + addr[13] = 0x0; + addr[14] = 0x0; + addr[15] = (char) count; + addrlen = 16; + } + + h_errno = 0; + struct hostent *answer = gethostbyaddr (addr, addrlen, af); + + /* Verify h_errno is as expected. */ + TEST_COMPARE (h_errno, test_items[count].expected); + if (h_errno != test_items[count].expected) + /* And print more information if it's not. */ + printf ("INFO: %s\n", test_items[count].test); + + if (test_items[count].fail) + { + /* We expected a failure so verify answer is NULL. */ + TEST_VERIFY (answer == NULL); + /* If it's not NULL we should print out what we received. */ + if (answer != NULL) + printf ("error: unexpected success: %s\n", + support_format_hostent (answer)); + } + else + /* We don't expect a failure so answer must be valid. */ + TEST_COMPARE_STRING (answer->h_name, test_items[count].answer); +} + +static int +do_test (void) +{ + struct resolv_test *obj = resolv_test_start + ((struct resolv_redirect_config) + { + .response_callback = response + }); + + for (int i = 0; i < array_length (test_items); i++) + { + check_reverse (AF_INET, i); + check_reverse (AF_INET6, i); + } + resolv_test_end (obj); + + return 0; +} + +#include commit 26953143787bf2f7e9a0bf88749f547efe029e67 Author: Xi Ruoyao Date: Tue Feb 3 16:20:12 2026 +0800 elf: parse /proc/self/maps as the last resort to find the gap for tst-link-map-contiguous-ldso The initialization process of libc.so calls mmap() several times and the kernel may lay the maps into the gap. If all pages in the gap are occupied, the test would not be able to find the gap with mmap() and the test would fail. The failure reproduces most frequently on LoongArch because with the commonly used page size (16 KiB) the gap only contains 4 pages and the probability they are all occupied is not near to zero. With the changes in the patch, a test run may output: info: ld.so link map is not contiguous info: object "/dev/zero" found at 0x7ffff1fe0000 - 0x7ffff1fe4000 info: anonymous mapping found at 0x7ffff1fe4000 - 0x7ffff1fec000 Also take the chance to fix a mistake in the "object found at" message which has puzzled me during the initial debug session. Signed-off-by: Xi Ruoyao Reviewed-by: Adhemerval Zanella (cherry picked from commit aed8390a6a22e5751fc12704c0c5f2a8271fc286) diff --git a/elf/tst-link-map-contiguous-ldso.c b/elf/tst-link-map-contiguous-ldso.c index 9f97b8b95a..4d04d37581 100644 --- a/elf/tst-link-map-contiguous-ldso.c +++ b/elf/tst-link-map-contiguous-ldso.c @@ -18,15 +18,73 @@ #include #include +#include #include #include #include #include +#include #include #include +#include #include #include +/* Slow path in case we cannot find a gap with mmap (when the runtime has + mapped all the pages in the gap for some reason). */ +static bool +find_gap_with_proc_self_map (const struct link_map *l) +{ + int pagesize = getpagesize (); + + support_need_proc ("Reads /proc/self/maps to find gap in ld.so mapping"); + + /* Parse /proc/self/maps and find all the mappings in the ld.so range + but not from ld.so. */ + FILE *f = xfopen ("/proc/self/maps", "r"); + char *line = NULL, *path_ldso = NULL; + size_t len; + bool found = false; + while (xgetline (&line, &len, f)) + { + uintptr_t from, to; + char *path = NULL; + int r = sscanf (line, "%" SCNxPTR "-%" SCNxPTR "%*s%*s%*s%*s%ms", + &from, &to, &path); + + TEST_VERIFY (r == 2 || r == 3); + TEST_COMPARE (from % pagesize, 0); + TEST_COMPARE (to % pagesize, 0); + + if (path_ldso == NULL && l->l_map_start == from) + { + TEST_COMPARE (r, 3); + path_ldso = path; + continue; + } + + if (from > l->l_map_start && to < l->l_map_end + && (r == 2 || (path_ldso != NULL && strcmp (path, path_ldso)))) + { + if (r == 2) + printf ("info: anonymous mapping found at 0x%" PRIxPTR " - 0x%" + PRIxPTR "\n", from, to); + else + printf ("info: object \"%s\" found at 0x%" PRIxPTR " - 0x%" + PRIxPTR "\n", path, from, to); + + found = true; + } + + free (path); + } + + free (path_ldso); + free (line); + xfclose (f); + return found; +} + static int do_test (void) { @@ -64,16 +122,18 @@ do_test (void) if ((void *) dlfo.dlfo_link_map != (void *) l) { printf ("info: object \"%s\" found at %p\n", - dlfo.dlfo_link_map->l_name, ptr); + dlfo.dlfo_link_map->l_name, expected); gap_found = true; } } else TEST_COMPARE (dlfo_ret, -1); + xmunmap (ptr, 1); addr += pagesize; } - if (!gap_found) + + if (!gap_found && !find_gap_with_proc_self_map (l)) FAIL ("no ld.so gap found"); } else commit 02ffd413cf83c07c5c419b5cba72990e1ed140ca Author: Adhemerval Zanella Date: Thu Feb 12 09:48:53 2026 -0300 elf: Use dl-symbol-redir-ifunc.h instead _dl_strlen Also replace the loop with strlen And remove -fno-tree-loop-distribute-patterns usage. It requires redirect the strlen to the baseline implementation for x86_64, aarch64, and loongarch64. Checked on x86_64-linux-gnu{-v2,v3} and aarch64-linux-gnu with both gcc-15 and clang-21. Reviewed-by: DJ Delorie (cherry picked from commit 15cc350e507101ac7b01e1343ac55087a6cd9317) diff --git a/elf/Makefile b/elf/Makefile index 01cc51636e..11029be0ae 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -97,12 +97,6 @@ ifeq (yesyes,$(build-shared)$(run-built-tests)) tests-special += $(objpfx)list-tunables.out endif -# Make sure that the compiler does not insert any library calls in tunables -# code paths. -ifeq (yes,$(have-loop-to-function)) -CFLAGS-dl-tunables.c += -fno-tree-loop-distribute-patterns -endif - all-dl-routines = $(dl-routines) $(sysdep-dl-routines) # But they are absent from the shared libc, because that code is in ld.so. elide-routines.os = \ diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c index 37ade374c6..bdb1de4ceb 100644 --- a/elf/dl-tunables.c +++ b/elf/dl-tunables.c @@ -37,16 +37,6 @@ #define TUNABLES_INTERNAL 1 #include "dl-tunables.h" -/* The function might be called before the process is self-relocated. */ -static size_t -__attribute_optimization_barrier__ -_dl_strlen (const char *s) -{ - const char *p = s; - for (; *s != '\0'; s++); - return s - p; -} - static char ** get_next_env (char **envp, char **name, char **val, char ***prev_envp) { @@ -335,10 +325,8 @@ __tunables_init (char **envp) if (tunable_is_name (name, envname)) { /* The environment variable is always null-terminated. */ - size_t envvallen = _dl_strlen (envval); - tunables_env_alias[i] = - (struct tunable_toset_t) { cur, envval, envvallen }; + (struct tunable_toset_t) { cur, envval, strlen (envval) }; break; } } diff --git a/string/Makefile b/string/Makefile index c4423c0437..aa0b0c2f57 100644 --- a/string/Makefile +++ b/string/Makefile @@ -286,6 +286,7 @@ CFLAGS-wordcopy.c += $(no-stack-protector) # Called during static initialization CFLAGS-strncmp.c += $(no-stack-protector) CFLAGS-memset.c += $(no-stack-protector) +CFLAGS-strlen.c += $(no-stack-protector) ifeq ($(run-built-tests),yes) $(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out diff --git a/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h index 647bdd66dd..9f772614bf 100644 --- a/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h +++ b/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h @@ -20,5 +20,6 @@ #define _DL_IFUNC_GENERIC_H asm ("memset = __memset_generic"); +asm ("strlen = __strlen_generic"); #endif diff --git a/sysdeps/aarch64/multiarch/strlen_generic.S b/sysdeps/aarch64/multiarch/strlen_generic.S index cb9d5759ac..a362328142 100644 --- a/sysdeps/aarch64/multiarch/strlen_generic.S +++ b/sysdeps/aarch64/multiarch/strlen_generic.S @@ -40,3 +40,7 @@ #endif #include "../strlen.S" + +#if IS_IN (rtld) +strong_alias (strlen, __strlen_generic) +#endif diff --git a/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h index 9fdd039da0..8af00d2846 100644 --- a/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h +++ b/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h @@ -22,6 +22,7 @@ #ifndef SHARED asm ("memset = __memset_aligned"); asm ("memcmp = __memcmp_aligned"); +asm ("strlen = __strlen_aligned"); #endif #endif diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile index 1d26966ded..a865090a53 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile @@ -9,4 +9,6 @@ sysdep_routines += \ # sysdep_routines CFLAGS-memcpy_noalignment.c += -mno-strict-align +# Called during static initialization +CFLAGS-memset-generic.c += $(no-stack-protector) endif diff --git a/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h index 04b6c1e6a3..b607e525f2 100644 --- a/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h +++ b/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h @@ -44,6 +44,16 @@ asm ("memset = " HAVE_MEMSET_IFUNC_GENERIC); asm ("memcmp = " HAVE_MEMCMP_IFUNC_GENERIC); +#if MINIMUM_X86_ISA_LEVEL >= 4 +# define HAVE_STRCMP_IFUNC_GENERIC "__strlen_evex" +#elif MINIMUM_X86_ISA_LEVEL == 3 +# define HAVE_STRCMP_IFUNC_GENERIC "__strlen_avx2" +#else +# define HAVE_STRCMP_IFUNC_GENERIC "__strlen_sse2" +#endif + +asm ("strlen = " HAVE_STRCMP_IFUNC_GENERIC); + #endif /* SHARED */ #endif commit 60cabd0464c6722d4e1f13bbbeef191ea40ef2ef Author: Adhemerval Zanella Netto Date: Sat Mar 21 08:11:06 2026 -0600 riscv: Resolve calls to memcpy using memcpy-generic in early startup This patch from Adhemerval sets up the ifunc redirections so that we resolve memcpy to memcpy_generic in early startup. This avoids infinite recursion for memcpy calls before the loader is fully initialized. Tested-by: Jeff Law (cherry picked from commit 0a9e54d40a4321ebf7d87cdbc0868c43d1e8a657) diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c index bdff2b5ee2..63ce609024 100644 --- a/elf/dl-reloc-static-pie.c +++ b/elf/dl-reloc-static-pie.c @@ -25,6 +25,7 @@ #include #include +#include #define RESOLVE_MAP(map, scope, sym, version, flags) map #include "dynamic-link.h" diff --git a/sysdeps/riscv/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/riscv/multiarch/dl-symbol-redir-ifunc.h index 24b78711e3..69a0790838 100644 --- a/sysdeps/riscv/multiarch/dl-symbol-redir-ifunc.h +++ b/sysdeps/riscv/multiarch/dl-symbol-redir-ifunc.h @@ -21,6 +21,7 @@ #ifndef SHARED asm ("memset = __memset_generic"); +asm ("memcpy = __memcpy_generic"); #endif #endif diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile index a865090a53..a033ea9569 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile @@ -11,4 +11,5 @@ sysdep_routines += \ CFLAGS-memcpy_noalignment.c += -mno-strict-align # Called during static initialization CFLAGS-memset-generic.c += $(no-stack-protector) +CFLAGS-memcpy-generic.c += $(no-stack-protector) endif commit ce1013a197eb4a3b8ff2b07e0672f4d0b976ce7c Author: Michael Jeanson Date: Fri Feb 20 11:01:00 2026 -0500 tests: fix tst-rseq with Linux 7.0 A sub-test of tst-rseq is to validate the return code and errno of the rseq syscall when attempting to register the exact same rseq area as was done in the dynamic loader. This involves finding the rseq area address by adding the '__rseq_offset' to the thread pointer and calculating the area size from the AT_RSEQ_FEATURE_SIZE auxiliary vector. However the test currently calculates the size of the rseq area allocation in the TLS block which must be a multiple of AT_RSEQ_ALIGN. Up until now that happened to be the same value since the feature size and alignment exposed by the kernel were below the minimum ABI size of 32. Starting with Linux 7.0 the feature size has reached 33 while the alignment is now 64. This results in the test trying to re-register the rseq area with a different size and thus not getting the expected errno value. Signed-off-by: Michael Jeanson Reviewed-by: Mathieu Desnoyers (cherry picked from commit 67f303b47dc584f204e3f2441b9832082415eebc) diff --git a/sysdeps/unix/sysv/linux/tst-rseq.c b/sysdeps/unix/sysv/linux/tst-rseq.c index 11371dc6c5..ba93d390f4 100644 --- a/sysdeps/unix/sysv/linux/tst-rseq.c +++ b/sysdeps/unix/sysv/linux/tst-rseq.c @@ -48,8 +48,7 @@ do_rseq_main_test (void) size_t rseq_align = MAX (getauxval (AT_RSEQ_ALIGN), RSEQ_MIN_ALIGN); size_t rseq_feature_size = MAX (getauxval (AT_RSEQ_FEATURE_SIZE), RSEQ_AREA_SIZE_INITIAL_USED); - size_t rseq_alloc_size = roundup (MAX (rseq_feature_size, - RSEQ_AREA_SIZE_INITIAL_USED), rseq_align); + size_t rseq_reg_size = MAX (rseq_feature_size, RSEQ_AREA_SIZE_INITIAL); struct rseq *rseq_abi = __thread_pointer () + __rseq_offset; TEST_VERIFY_EXIT (rseq_thread_registered ()); @@ -89,8 +88,8 @@ do_rseq_main_test (void) /* Test a rseq registration with the same arguments as the internal registration which should fail with errno == EBUSY. */ TEST_VERIFY (((unsigned long) rseq_abi % rseq_align) == 0); - TEST_VERIFY (__rseq_size <= rseq_alloc_size); - int ret = syscall (__NR_rseq, rseq_abi, rseq_alloc_size, 0, RSEQ_SIG); + TEST_VERIFY (__rseq_size <= rseq_reg_size); + int ret = syscall (__NR_rseq, rseq_abi, rseq_reg_size, 0, RSEQ_SIG); TEST_VERIFY (ret != 0); TEST_COMPARE (errno, EBUSY); } commit 8362e8ce10b24068bacc19552c128dd10e082fd9 Author: Florian Weimer Date: Thu Apr 16 19:13:43 2026 +0200 Use pending character state in IBM1390, IBM1399 character sets (CVE-2026-4046) Follow the example in iso-2022-jp-3.c and use the __count state variable to store the pending character. This avoids restarting the conversion if the output buffer ends between two 4-byte UCS-4 code points, so that the assert reported in the bug can no longer happen. Even though the fix is applied to ibm1364.c, the change is only effective for the two HAS_COMBINED codecs for IBM1390, IBM1399. The test case was mostly auto-generated using claude-4.6-opus-high-thinking, and composer-2-fast shows up in the log as well. During review, gpt-5.4-xhigh flagged that the original version of the test case was not exercising the new character flush logic. This fixes bug 33980. Assisted-by: LLM Reviewed-by: Carlos O'Donell (cherry picked from commit d6f08d1cf027f4eb2ba289a6cc66853722d4badc) diff --git a/iconvdata/Makefile b/iconvdata/Makefile index 26e888b443..fbb0067302 100644 --- a/iconvdata/Makefile +++ b/iconvdata/Makefile @@ -76,7 +76,7 @@ tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \ tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \ bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 \ bug-iconv13 bug-iconv14 bug-iconv15 \ - tst-iconv-iso-2022-cn-ext + tst-iconv-iso-2022-cn-ext tst-bug33980 ifeq ($(have-thread-library),yes) tests += bug-iconv3 endif @@ -333,6 +333,8 @@ $(objpfx)bug-iconv15.out: $(addprefix $(objpfx), $(gconv-modules)) \ $(addprefix $(objpfx),$(modules.so)) $(objpfx)tst-iconv-iso-2022-cn-ext.out: $(addprefix $(objpfx), $(gconv-modules)) \ $(addprefix $(objpfx),$(modules.so)) +$(objpfx)tst-bug33980.out: $(addprefix $(objpfx), $(gconv-modules)) \ + $(addprefix $(objpfx),$(modules.so)) $(objpfx)iconv-test.out: run-iconv-test.sh \ $(addprefix $(objpfx), $(gconv-modules)) \ diff --git a/iconvdata/ibm1364.c b/iconvdata/ibm1364.c index 4f41f22c12..8df66ea048 100644 --- a/iconvdata/ibm1364.c +++ b/iconvdata/ibm1364.c @@ -67,12 +67,29 @@ /* Since this is a stateful encoding we have to provide code which resets the output state to the initial state. This has to be done during the - flushing. */ + flushing. For the to-internal direction (FROM_DIRECTION is true), + there may be a pending character that needs flushing. */ #define EMIT_SHIFT_TO_INIT \ if ((data->__statep->__count & ~7) != sb) \ { \ if (FROM_DIRECTION) \ - data->__statep->__count &= 7; \ + { \ + uint32_t ch = data->__statep->__count >> 7; \ + if (__glibc_unlikely (ch != 0)) \ + { \ + if (__glibc_unlikely (outend - outbuf < 4)) \ + status = __GCONV_FULL_OUTPUT; \ + else \ + { \ + put32 (outbuf, ch); \ + outbuf += 4; \ + /* Clear character and db bit. */ \ + data->__statep->__count &= 7; \ + } \ + } \ + else \ + data->__statep->__count &= 7; \ + } \ else \ { \ /* We are not in the initial state. To switch back we have \ @@ -99,11 +116,13 @@ *curcsp = save_curcs -/* Current codeset type. */ +/* Current codeset type. The bit is stored in the __count variable of + the conversion state. If the db bit is set, bit 7 and above store + a pending UCS-4 code point if non-zero. */ enum { - sb = 0, - db = 64 + sb = 0, /* Single byte mode. */ + db = 64 /* Double byte mode. */ }; @@ -119,21 +138,29 @@ enum } \ else \ { \ - /* This is a combined character. Make sure we have room. */ \ - if (__glibc_unlikely (outptr + 8 > outend)) \ - { \ - result = __GCONV_FULL_OUTPUT; \ - break; \ - } \ - \ const struct divide *cmbp \ = &DB_TO_UCS4_COMB[ch - __TO_UCS4_COMBINED_MIN]; \ assert (cmbp->res1 != 0 && cmbp->res2 != 0); \ \ put32 (outptr, cmbp->res1); \ outptr += 4; \ - put32 (outptr, cmbp->res2); \ - outptr += 4; \ + \ + /* See whether we have room for the second character. */ \ + if (outend - outptr >= 4) \ + { \ + put32 (outptr, cmbp->res2); \ + outptr += 4; \ + } \ + else \ + { \ + /* Otherwise store only the first character now, and \ + put the second one into the queue. */ \ + curcs |= cmbp->res2 << 7; \ + inptr += 2; \ + /* Tell the caller why we terminate the loop. */ \ + result = __GCONV_FULL_OUTPUT; \ + break; \ + } \ } \ } #else @@ -153,7 +180,20 @@ enum #define LOOPFCT FROM_LOOP #define BODY \ { \ - uint32_t ch = *inptr; \ + uint32_t ch; \ + \ + ch = curcs >> 7; \ + if (__glibc_unlikely (ch != 0)) \ + { \ + put32 (outptr, ch); \ + outptr += 4; \ + /* Remove the pending character, but preserve state bits. */ \ + curcs &= (1 << 7) - 1; \ + continue; \ + } \ + \ + /* Otherwise read the next input byte. */ \ + ch = *inptr; \ \ if (__builtin_expect (ch, 0) == SO) \ { \ diff --git a/iconvdata/tst-bug33980.c b/iconvdata/tst-bug33980.c new file mode 100644 index 0000000000..c9693e0efe --- /dev/null +++ b/iconvdata/tst-bug33980.c @@ -0,0 +1,153 @@ +/* Test for bug 33980: combining characters in IBM1390/IBM1399. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +/* Run iconv in a loop with a small output buffer of OUTBUFSIZE bytes + starting at OUTBUF. OUTBUF should be right before an unmapped page + so that writing past the end will fault. Skip SHIFT bytes at the + start of the input and output, to exercise different buffer + alignment. TRUNCATE indicates skipped bytes at the end of + input (0 and 1 a valid). */ +static void +test_one (const char *encoding, unsigned int shift, unsigned int truncate, + char *outbuf, size_t outbufsize) +{ + /* In IBM1390 and IBM1399, the DBCS code 0xECB5 expands to two + Unicode code points when translated. */ + static char input[] = + { + /* 8 letters X. */ + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + /* SO, 0xECB5, SI: shift to DBCS, special character, shift back. */ + 0x0e, 0xec, 0xb5, 0x0f + }; + + /* Expected output after UTF-8 conversion. */ + static char expected[] = + { + 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', + /* U+304B (HIRAGANA LETTER KA). */ + 0xe3, 0x81, 0x8b, + /* U+309A (COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK). */ + 0xe3, 0x82, 0x9a + }; + + iconv_t cd = iconv_open ("UTF-8", encoding); + TEST_VERIFY_EXIT (cd != (iconv_t) -1); + + char result_storage[64]; + struct alloc_buffer result_buf + = alloc_buffer_create (result_storage, sizeof (result_storage)); + + char *inptr = &input[shift]; + size_t inleft = sizeof (input) - shift - truncate; + + while (inleft > 0) + { + char *outptr = outbuf; + size_t outleft = outbufsize; + size_t inleft_before = inleft; + + size_t ret = iconv (cd, &inptr, &inleft, &outptr, &outleft); + size_t produced = outptr - outbuf; + alloc_buffer_copy_bytes (&result_buf, outbuf, produced); + + if (ret == (size_t) -1 && errno == E2BIG) + { + if (produced == 0 && inleft == inleft_before) + { + /* Output buffer too small to make progress. This is + expected for very small output buffer sizes. */ + TEST_VERIFY_EXIT (outbufsize < 3); + break; + } + continue; + } + if (ret == (size_t) -1) + FAIL_EXIT1 ("%s (outbufsize %zu): iconv: %m", encoding, outbufsize); + break; + } + + /* Flush any pending state (e.g. a buffered combined character). + With outbufsize < 3, we could not store the first character, so + the second character did not become pending, and there is nothing + to flush. */ + { + char *outptr = outbuf; + size_t outleft = outbufsize; + + size_t ret = iconv (cd, NULL, NULL, &outptr, &outleft); + TEST_VERIFY_EXIT (ret == 0); + size_t produced = outptr - outbuf; + alloc_buffer_copy_bytes (&result_buf, outbuf, produced); + + /* Second flush does not provide more data. */ + outptr = outbuf; + outleft = outbufsize; + ret = iconv (cd, NULL, NULL, &outptr, &outleft); + TEST_VERIFY_EXIT (ret == 0); + TEST_VERIFY (outptr == outbuf); + } + + TEST_VERIFY_EXIT (!alloc_buffer_has_failed (&result_buf)); + size_t result_used + = sizeof (result_storage) - alloc_buffer_size (&result_buf); + + if (outbufsize >= 3) + { + TEST_COMPARE (inleft, 0); + TEST_COMPARE (result_used, sizeof (expected) - shift); + TEST_COMPARE_BLOB (result_storage, result_used, + &expected[shift], sizeof (expected) - shift); + } + else + /* If the buffer is too small, only the leading X could be converted. */ + TEST_COMPARE (result_used, 8 - shift); + + TEST_VERIFY_EXIT (iconv_close (cd) == 0); +} + +static int +do_test (void) +{ + struct support_next_to_fault ntf + = support_next_to_fault_allocate (8); + + for (int shift = 0; shift <= 8; ++shift) + for (int truncate = 0; truncate < 2; ++truncate) + for (size_t outbufsize = 1; outbufsize <= 8; outbufsize++) + { + char *outbuf = ntf.buffer + ntf.length - outbufsize; + test_one ("IBM1390", shift, truncate, outbuf, outbufsize); + test_one ("IBM1399", shift, truncate, outbuf, outbufsize); + } + + support_next_to_fault_free (&ntf); + return 0; +} + +#include commit d1d8d27164e9682e467b55a7b56bd6229b7beef2 Author: DJ Delorie Date: Mon Jan 26 22:24:42 2026 -0500 include: isolate __O_CLOEXEC flag for sys/mount.h and fcntl.h Including sys/mount.h should not implicitly include fcntl.h as that causes namespace pollution and conflicts with kernel headers. It only needs O_CLOEXEC for OPEN_TREE_CLOEXEC (although it shouldn't need that, but it's defined that way) so we provide that define (via a private version) separately. Reviewed-by: Adhemerval Zanella Tested-by: Florian Weimer (cherry picked from commit 419245719ccbc7dad6a97f24465e7f09c090327a) diff --git a/io/fcntl.c b/io/fcntl.c index c13546e4fd..4fbc522624 100644 --- a/io/fcntl.c +++ b/io/fcntl.c @@ -18,6 +18,10 @@ #include #include +#ifndef __O_CLOEXEC +# error __O_CLOEXEC not defined by fcntl.h/cloexec.h +#endif + /* Perform file control operations on FD. */ int __fcntl (int fd, int cmd, ...) diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 955d316362..c6bd97abf1 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -129,6 +129,7 @@ CFLAGS-test-errno-linux.c += $(no-fortify-source) sysdep_headers += \ bits/a.out.h \ + bits/cloexec.h \ bits/epoll.h \ bits/eventfd.h \ bits/inotify.h \ diff --git a/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h b/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h new file mode 100644 index 0000000000..f381f28a53 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h @@ -0,0 +1 @@ +#define __O_CLOEXEC 010000000 diff --git a/sysdeps/unix/sysv/linux/bits/cloexec.h b/sysdeps/unix/sysv/linux/bits/cloexec.h new file mode 100644 index 0000000000..3059fb6473 --- /dev/null +++ b/sysdeps/unix/sysv/linux/bits/cloexec.h @@ -0,0 +1 @@ +#define __O_CLOEXEC 02000000 diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h index ad7f7c98c6..221a71aa62 100644 --- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h +++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h @@ -81,9 +81,7 @@ #ifndef __O_NOFOLLOW # define __O_NOFOLLOW 0400000 #endif -#ifndef __O_CLOEXEC -# define __O_CLOEXEC 02000000 -#endif +#include #ifndef __O_DIRECT # define __O_DIRECT 040000 #endif diff --git a/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h b/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h new file mode 100644 index 0000000000..f381f28a53 --- /dev/null +++ b/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h @@ -0,0 +1 @@ +#define __O_CLOEXEC 010000000 diff --git a/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h b/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h new file mode 100644 index 0000000000..6706eaa7d5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h @@ -0,0 +1 @@ +#define __O_CLOEXEC 0x400000 diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h index 457d8dcff2..5e496caf2f 100644 --- a/sysdeps/unix/sysv/linux/sys/mount.h +++ b/sysdeps/unix/sysv/linux/sys/mount.h @@ -21,7 +21,6 @@ #ifndef _SYS_MOUNT_H #define _SYS_MOUNT_H 1 -#include #include #include #include @@ -266,6 +265,11 @@ enum fsconfig_command /* open_tree flags. */ #define OPEN_TREE_CLONE 1 /* Clone the target tree and attach the clone */ +#ifndef O_CLOEXEC +# include +# define O_CLOEXEC __O_CLOEXEC +#endif +#undef OPEN_TREE_CLOEXEC #define OPEN_TREE_CLOEXEC O_CLOEXEC /* Close the file on execve() */ diff --git a/sysdeps/unix/sysv/linux/tst-mount.c b/sysdeps/unix/sysv/linux/tst-mount.c index 8e3ffbd56f..84dcd448d4 100644 --- a/sysdeps/unix/sysv/linux/tst-mount.c +++ b/sysdeps/unix/sysv/linux/tst-mount.c @@ -20,6 +20,7 @@ #include #include #include +#include /* For AT_ constants. */ #include _Static_assert (sizeof (struct mount_attr) == MOUNT_ATTR_SIZE_VER0, commit 1634cc11a5a54efcd542f468cf2efa5cdfc65194 Author: Florian Weimer Date: Wed Mar 4 18:32:36 2026 +0100 Linux: Only define OPEN_TREE_* macros in if undefined (bug 33921) There is a conditional inclusion of earlier in the file. If that defines the macros, do not redefine them. This addresses build problems as the token sequence used by the UAPI macro definitions changes between Linux versions. Reviewed-by: Adhemerval Zanella (cherry picked from commit d12b017cddfeb9fe9920ba054ae3dfcb8e9238b8) diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h index 5e496caf2f..0c5ebed33a 100644 --- a/sysdeps/unix/sysv/linux/sys/mount.h +++ b/sysdeps/unix/sysv/linux/sys/mount.h @@ -264,14 +264,16 @@ enum fsconfig_command #define FSOPEN_CLOEXEC 0x00000001 /* open_tree flags. */ -#define OPEN_TREE_CLONE 1 /* Clone the target tree and attach the clone */ +#ifndef OPEN_TREE_CLONE +# define OPEN_TREE_CLONE 1 /* Clone the target tree and attach the clone */ +#endif #ifndef O_CLOEXEC # include # define O_CLOEXEC __O_CLOEXEC #endif -#undef OPEN_TREE_CLOEXEC -#define OPEN_TREE_CLOEXEC O_CLOEXEC /* Close the file on execve() */ - +#ifndef OPEN_TREE_CLOEXEC +# define OPEN_TREE_CLOEXEC O_CLOEXEC /* Close the file on execve() */ +#endif __BEGIN_DECLS commit e9517114acc77c0b8af9da6700107df16882b701 Author: H.J. Lu Date: Mon Apr 13 10:46:42 2026 +0800 abilist.awk: Handle weak unversioned defined symbols After commit f685e3953f9a38a41bbd0a597f9882870cee13d5 Author: H.J. Lu Date: Wed Oct 29 09:49:57 2025 +0800 elf: Don't set its DT_VERSYM entry for unversioned symbol ld no longer assigns version index 1 to unversioned defined symbol. For libmachuser.so, "objdump --dynamic-syms" reports: 0000dd30 w DF .text 000000f8 processor_start instead of 0000dd30 w DF .text 000000f8 (Base) processor_start Also allow NF == 6 for weak unversioned dynamic symbols. This fixes BZ 33650. Signed-off-by: H.J. Lu Reviewed-by: Sam James (cherry picked from commit ee5d1db2a81468413fbf7c82779ffa782f429d1a) diff --git a/scripts/abilist.awk b/scripts/abilist.awk index 6cc7af6ac8..7ea1edf8c0 100644 --- a/scripts/abilist.awk +++ b/scripts/abilist.awk @@ -38,7 +38,7 @@ $4 == "*UND*" { next } $2 == "l" { next } # If the target uses ST_OTHER, it will be output before the symbol name. -$2 == "g" || $2 == "w" && (NF == 7 || NF == 8) { +$2 == "g" || $2 == "w" && (NF == 6 || NF == 7 || NF == 8) { type = $3; size = $5; sub(/^0*/, "", size); commit 2890b35cd361df2517525bf2c5f8c63f6f0d4a20 Author: Rocket Ma Date: Fri May 1 20:39:07 2026 -0700 libio: Fix ungetwc operating on byte stream [BZ #33998] * libio/wgenops.c: When _IO_wdefault_pbackfail attempts to push back one character, it accidently compare the wchar to push back with the last char from byte stream, instead of wide stream. Under specific coding, attacker may exploit this to leak information. This commit fix bug 33998, or CVE-2026-5928. Signed-off-by: Rocket Ma Reviewed-by: Carlos O'Donell (cherry picked from commit ef3bfb5f910011f3780cb06aa47e730035f53285) diff --git a/libio/Makefile b/libio/Makefile index 4f4dd9f275..5995adf5dd 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -84,6 +84,7 @@ tests = \ bug-ungetwc1 \ bug-ungetwc2 \ bug-wfflush \ + bug-wgenops-bz33998 \ bug-wmemstream1 \ bug-wsetpos \ test-fmemopen \ diff --git a/libio/bug-wgenops-bz33998.c b/libio/bug-wgenops-bz33998.c new file mode 100644 index 0000000000..cc4067da99 --- /dev/null +++ b/libio/bug-wgenops-bz33998.c @@ -0,0 +1,54 @@ +/* Regression test for ungetwc operating on byte stream (BZ #33998) + Copyright (C) 2026 The GNU Toolchain Authors. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "support/temp_file.h" +#include "support/xstdio.h" +#include "support/xunistd.h" +#include +#include +#include +#include +#include +#include + +static int +do_test (void) +{ + char *filename; + int fd = create_temp_file ("tst-bz33998-", &filename); + TEST_VERIFY (fd != -1); + xwrite (fd, "A", sizeof ("A")); // write "A\0" by design + xclose (fd); + + FILE *fp = xfopen (filename, "r+"); + TEST_COMPARE (getwc (fp), L'A'); + /* If the bug is fixed, then ungetwc should not touch byte stream. + If the bug is not fixed, ungetwc firstly match last read char, L'A', + failed, then the pbackfail branch, matching last read char in byte + stream, that is, '\0' (initialized when setup wide stream). */ + char *old_read_ptr = fp->_IO_read_ptr; + TEST_COMPARE (ungetwc (L'\0', fp), L'\0'); + TEST_VERIFY (fp->_IO_read_ptr == old_read_ptr); + + xfclose (fp); + free (filename); + + return 0; +} + +#include diff --git a/libio/wgenops.c b/libio/wgenops.c index 7a8466ea44..7c47459828 100644 --- a/libio/wgenops.c +++ b/libio/wgenops.c @@ -108,8 +108,8 @@ _IO_wdefault_pbackfail (FILE *fp, wint_t c) { if (fp->_wide_data->_IO_read_ptr > fp->_wide_data->_IO_read_base && !_IO_in_backup (fp) - && (wint_t) fp->_IO_read_ptr[-1] == c) - --fp->_IO_read_ptr; + && (wint_t) fp->_wide_data->_IO_read_ptr[-1] == c) + --fp->_wide_data->_IO_read_ptr; else { /* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/ commit 4070d808bea1c077eb7e7d52b52b91cae98205d5 Author: Rocket Ma Date: Fri Apr 17 23:48:41 2026 -0700 stdio-common: Fix buffer overflow in scanf %mc [BZ #34008] * stdio-common/vfscanf-internal.c: When enlarging allocated buffer with format %mc or %mC, glibc allocates one byte less, leading to user-controlled one byte overflow. This commit fixes BZ #34008, or CVE-2026-5450. Reviewed-by: Carlos O'Donell Signed-off-by: Rocket Ma Reviewed-by: H.J. Lu (cherry picked from commit 839898777226a3ed88c0859f25ffe712519b4ead) diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 210944837e..0c0085e607 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -349,6 +349,7 @@ tests := \ tst-vfprintf-user-type \ tst-vfprintf-width-i18n \ tst-vfprintf-width-prec-alloc \ + tst-vfscanf-bz34008 \ tst-wc-printf \ tstdiomisc \ tstgetln \ @@ -564,6 +565,9 @@ tst-printf-bz18872-ENV = MALLOC_TRACE=$(objpfx)tst-printf-bz18872.mtrace \ tst-vfprintf-width-prec-ENV = \ MALLOC_TRACE=$(objpfx)tst-vfprintf-width-prec.mtrace \ LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so +tst-vfscanf-bz34008-ENV = \ + MALLOC_CHECK_=3 \ + LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so tst-printf-bz25691-ENV = \ MALLOC_TRACE=$(objpfx)tst-printf-bz25691.mtrace \ LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so diff --git a/stdio-common/tst-vfscanf-bz34008.c b/stdio-common/tst-vfscanf-bz34008.c new file mode 100644 index 0000000000..48371c8a3d --- /dev/null +++ b/stdio-common/tst-vfscanf-bz34008.c @@ -0,0 +1,48 @@ +/* Regression test for vfscanf %Nmc out-of-bound write (BZ #34008) + Copyright (C) 2026 The GNU Toolchain Authors. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "malloc/mcheck.h" +#include +#include +#include +#include +#include +#include +#include + +#define WIDTH 0x410 +#define SCANFSTR "%1040mc" +static int +do_test (void) +{ + mcheck_pedantic (NULL); + char *input = malloc (WIDTH + 1); + TEST_VERIFY (input != NULL); + memset (input, 'A', WIDTH); + input[WIDTH] = '\0'; + + char *buf = NULL; + TEST_VERIFY (sscanf (input, SCANFSTR, &buf) != -1); + TEST_VERIFY (buf != NULL); + + free (buf); + free (input); + return 0; +} + +#include diff --git a/stdio-common/vfscanf-internal.c b/stdio-common/vfscanf-internal.c index 63b9246e47..8687150dff 100644 --- a/stdio-common/vfscanf-internal.c +++ b/stdio-common/vfscanf-internal.c @@ -862,8 +862,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr, { /* Enlarge the buffer. */ size_t newsize - = strsize - + (strsize >= width ? width - 1 : strsize); + = strsize + (strsize >= width ? width : strsize); str = (char *) realloc (*strptr, newsize); if (str == NULL) @@ -936,7 +935,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr, && wstr == (wchar_t *) *strptr + strsize) { size_t newsize - = strsize + (strsize > width ? width - 1 : strsize); + = strsize + (strsize >= width ? width : strsize); /* Enlarge the buffer. */ wstr = (wchar_t *) realloc (*strptr, newsize * sizeof (wchar_t)); @@ -991,7 +990,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr, && wstr == (wchar_t *) *strptr + strsize) { size_t newsize - = strsize + (strsize > width ? width - 1 : strsize); + = strsize + (strsize >= width ? width : strsize); /* Enlarge the buffer. */ wstr = (wchar_t *) realloc (*strptr, newsize * sizeof (wchar_t)); commit a47b5b2b3eee486c4bea0df65af775296a13f09d Author: Adhemerval Zanella Date: Wed May 27 16:48:19 2026 -0300 math: Fix fma alignment when exponent difference is exactly 64 (BZ 34183) When d (the exponent difference between z and x*y) is exactly 64, the alignment path shifts z left by 64 bits via (zhi = nz.m, zlo = 0) and decrements d to 0, then takes the inner 'if (d < 64)' branch which evaluates 'rhi << (64 - d)' with d == 0. A shift by 64 of a 64-bit value is UB in C. Add the explicit 'if (d == 0)' empty branch (present in the original musl implementation). Checked on x86_64-linux-gnu with --disable-multi-arch and arm-linux-gnueabihf. Reviewed-by: H.J. Lu (cherry picked from commit 1e7935ae87550323021876f3099bb04aeadd8491) diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 2001baa605..82f0aface8 100644 --- a/math/auto-libm-test-in +++ b/math/auto-libm-test-in @@ -6483,6 +6483,8 @@ fma 0x1.000002p-126 -0x1.000002p-26 0x1p103 fma 0x1.000002p-126 0x1.000002p-26 -0x1p103 fma 0x1.000002p-126 -0x1.000002p-26 -0x1p103 +fma 0x1.000008p+0 0x1.000008p+0 0x1p+11 + fma 0x1.7fp+13 0x1.0000000000001p+0 0x1.ffep-48 fma 0x1.fffp+0 0x1.0000000000001p+0 -0x1.fffp+0 fma 0x1.0000002p+0 0x1.ffffffcp-1 0x1p-300 diff --git a/math/auto-libm-test-out-fma b/math/auto-libm-test-out-fma index 438fcb61da..ba1fdc7472 100644 --- a/math/auto-libm-test-out-fma +++ b/math/auto-libm-test-out-fma @@ -13364,6 +13364,31 @@ fma 0x1.000002p-126 -0x1.000002p-26 -0x1p103 = fma tonearest ibm128 0x4.000008p-128 -0x4.000008p-28 -0x8p+100 : -0x8p+100 : inexact = fma towardzero ibm128 0x4.000008p-128 -0x4.000008p-28 -0x8p+100 : -0x8p+100 : inexact = fma upward ibm128 0x4.000008p-128 -0x4.000008p-28 -0x8p+100 : -0x8p+100 : inexact +fma 0x1.000008p+0 0x1.000008p+0 0x1p+11 += fma downward binary32 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.01p+8 : inexact += fma tonearest binary32 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.01p+8 : inexact += fma towardzero binary32 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.01p+8 : inexact += fma upward binary32 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.01001p+8 : inexact += fma downward binary64 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001p+8 : inexact += fma tonearest binary64 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001p+8 : inexact += fma towardzero binary64 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001p+8 : inexact += fma upward binary64 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000008p+8 : inexact += fma downward intel96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma tonearest intel96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma towardzero intel96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma upward intel96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma downward m68k96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma tonearest m68k96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma towardzero m68k96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma upward m68k96 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma downward binary128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma tonearest binary128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma towardzero binary128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma upward binary128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma downward ibm128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma tonearest ibm128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma towardzero ibm128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : += fma upward ibm128 0x1.000008p+0 0x1.000008p+0 0x8p+8 : 0x8.0100001000004p+8 : fma 0x1.7fp+13 0x1.0000000000001p+0 0x1.ffep-48 = fma downward binary64 0x2.fep+12 0x1.0000000000001p+0 0x1.ffep-48 : 0x2.fe00000000002p+12 : inexact = fma tonearest binary64 0x2.fep+12 0x1.0000000000001p+0 0x1.ffep-48 : 0x2.fe00000000002p+12 : inexact diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c index d65d505915..b9147ae32c 100644 --- a/sysdeps/ieee754/dbl-64/s_fma.c +++ b/sysdeps/ieee754/dbl-64/s_fma.c @@ -114,7 +114,10 @@ __fma (double x, double y, double z) zhi = nz.m; e = nz.e - 64; d -= 64; - if (d < 64) + if (d == 0) + /* No further shift of r needed; rhi/rlo are unchanged. */ + ; + else if (d < 64) { rlo = rhi << (64 - d) | rlo >> d | !!(rlo << (64 - d)); rhi = rhi >> d; commit 18b97b03b7442d8ba0860e43145f8724c9e77b17 Author: Jakub Jelinek Date: Tue Feb 17 17:06:48 2026 +0100 Rename __unused fields to __glibc_reserved. __unused is often defined to __attribute__((unused)) in BSD sources and furthermore libstdc++ testsuite uses it as a macro to verify libstdc++ headers don't use __unused identifiers. In ~2012 glibc headers have been cleaned up, but some new uses of __unused have reappeared (s390 fenv.h already many years ago, the rest last November). Reviewed-by: Florian Weimer (cherry picked from commit 243bdfec8f7cd4a85a8ce6e4e9a5a5accd3ce1aa) diff --git a/sysdeps/powerpc/nptl/bits/struct_mutex.h b/sysdeps/powerpc/nptl/bits/struct_mutex.h index 1472af21f7..ebf2d50922 100644 --- a/sysdeps/powerpc/nptl/bits/struct_mutex.h +++ b/sysdeps/powerpc/nptl/bits/struct_mutex.h @@ -32,7 +32,7 @@ struct __pthread_mutex_s int __kind; #if __WORDSIZE == 64 short __spins; - short __unused; + short __glibc_reserved; __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV 1 #else diff --git a/sysdeps/s390/fpu/bits/fenv.h b/sysdeps/s390/fpu/bits/fenv.h index b9e844e393..33e88fbe9d 100644 --- a/sysdeps/s390/fpu/bits/fenv.h +++ b/sysdeps/s390/fpu/bits/fenv.h @@ -76,10 +76,10 @@ typedef unsigned int fexcept_t; /* size of fpc */ typedef struct { fexcept_t __fpc; - void *__unused; - /* The field __unused (formerly __ieee_instruction_pointer) is a relict from - commit "Remove PTRACE_PEEKUSER" (87b9b50f0d4b92248905e95a06a13c513dc45e59) - and isn't used anymore. */ + void *__glibc_reserved; + /* The field __glibc_reserved (formerly __ieee_instruction_pointer) is a + relict from commit "Remove PTRACE_PEEKUSER" + (87b9b50f0d4b92248905e95a06a13c513dc45e59) and isn't used anymore. */ } fenv_t; /* If the default argument is used we use this value. */ diff --git a/sysdeps/s390/nptl/bits/struct_mutex.h b/sysdeps/s390/nptl/bits/struct_mutex.h index d069b485d1..571265267c 100644 --- a/sysdeps/s390/nptl/bits/struct_mutex.h +++ b/sysdeps/s390/nptl/bits/struct_mutex.h @@ -32,7 +32,7 @@ struct __pthread_mutex_s int __kind; #if __WORDSIZE == 64 short __spins; - short __unused; + short __glibc_reserved; __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV 1 #else diff --git a/sysdeps/x86/nptl/bits/struct_mutex.h b/sysdeps/x86/nptl/bits/struct_mutex.h index 9c19dff660..13c9894ad4 100644 --- a/sysdeps/x86/nptl/bits/struct_mutex.h +++ b/sysdeps/x86/nptl/bits/struct_mutex.h @@ -32,7 +32,7 @@ struct __pthread_mutex_s int __kind; #ifdef __x86_64__ short __spins; - short __unused; + short __glibc_reserved; __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV 1 #else commit 89cbf46693714064a57e3ae76381baf8f3ba8368 Author: Sam James Date: Sat Jun 6 20:32:27 2026 +0100 elf: don't clobber ld.so.conf in tst-glibc-hwcaps-prepend-cache [BZ #34210] dbe5065f2166be20e57a24f246a40d50e001a05d and ae589cb84df10825fc545a45c7007a5f79409bf1 cater for setups where ld.so.conf{,.d} is required to find runtime support libraries, but tst-glibc-hwcaps-prepend-cache clobbers the created ld.so.conf with its own entry. Fix it to instead use the ld.so.conf.d created in ae589cb84df10825fc545a45c7007a5f79409bf1 to co-exist with existing entries. Bug: https://bugs.gentoo.org/976773 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31901 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34210 Tested-by: Andreas K. Hüttel Reported-by: Eli Schwartz Reviewed-by: Andreas K. Hüttel (cherry picked from commit d0cc9bf859d0434e397530d75a6507f13db79fba) diff --git a/elf/tst-glibc-hwcaps-prepend-cache.c b/elf/tst-glibc-hwcaps-prepend-cache.c index 8a80ceed3e..98bd1ef99e 100644 --- a/elf/tst-glibc-hwcaps-prepend-cache.c +++ b/elf/tst-glibc-hwcaps-prepend-cache.c @@ -46,7 +46,7 @@ do_test (void) { /* Install the default implementation of libmarkermod1.so. */ - char *conf_path = xasprintf ("%s/ld.so.conf", support_sysconfdir_prefix); + char *conf_path = xasprintf ("%s/ld.so.conf.d/hwcaps.conf", support_sysconfdir_prefix); xmkdirp (support_sysconfdir_prefix, 0777); support_write_file_string (conf_path, "/glibc-test/lib\n"); free (conf_path); commit ced45fd472eb77e66cf9dea169ee7b1fa5cf8d78 Author: Pino Toscano Date: Tue May 26 22:27:02 2026 +0200 Hurd: comment PF_LINK/AF_LINK defines Comment out the PF_LINK and AF_LINK defines, since they are usually associated with struct sockaddr_dl, which is not available on Hurd. (cherry picked from commit 59a0de89ba28028f5ec3f32c1da648a0d6f1dfc5) diff --git a/sysdeps/mach/hurd/bits/socket.h b/sysdeps/mach/hurd/bits/socket.h index 9b81d48816..4a5807e619 100644 --- a/sysdeps/mach/hurd/bits/socket.h +++ b/sysdeps/mach/hurd/bits/socket.h @@ -96,7 +96,7 @@ enum __socket_type #define PF_HYLINK 15 /* NSC Hyperchannel protocol. */ #define PF_APPLETALK 16 /* Don't use this. */ #define PF_ROUTE 17 /* Internal Routing Protocol. */ -#define PF_LINK 18 /* Link layer interface. */ +/* #define PF_LINK 18 Link layer interface. */ #define PF_XTP 19 /* eXpress Transfer Protocol (no AF). */ #define PF_COIP 20 /* Connection-oriented IP, aka ST II. */ #define PF_CNT 21 /* Computer Network Technology. */ @@ -129,7 +129,7 @@ enum __socket_type #define AF_HYLINK PF_HYLINK #define AF_APPLETALK PF_APPLETALK #define AF_ROUTE PF_ROUTE -#define AF_LINK PF_LINK +/* #define AF_LINK PF_LINK */ #ifdef __USE_MISC # define pseudo_AF_XTP PF_XTP #endif commit 446f708e4cf8845536549a7fa414142fc89c6887 Author: Samuel Thibault Date: Tue May 26 22:28:49 2026 +0200 Hurd: comment PF_ROUTE/AF_ROUTE defines Comment out the PF_ROUTE and AF_ROUTE defines, since they would be used for PF_ROUTE setsockopts, which are not available on Hurd. (cherry picked from commit ec98b25af5ae4b6dff24388ce10d0e64a7671363) diff --git a/sysdeps/mach/hurd/bits/socket.h b/sysdeps/mach/hurd/bits/socket.h index 4a5807e619..fb73dea063 100644 --- a/sysdeps/mach/hurd/bits/socket.h +++ b/sysdeps/mach/hurd/bits/socket.h @@ -95,7 +95,7 @@ enum __socket_type #define PF_LAT 14 /* DEC Local Area Transport protocol. */ #define PF_HYLINK 15 /* NSC Hyperchannel protocol. */ #define PF_APPLETALK 16 /* Don't use this. */ -#define PF_ROUTE 17 /* Internal Routing Protocol. */ +/* #define PF_ROUTE 17 Internal Routing Protocol. */ /* #define PF_LINK 18 Link layer interface. */ #define PF_XTP 19 /* eXpress Transfer Protocol (no AF). */ #define PF_COIP 20 /* Connection-oriented IP, aka ST II. */ @@ -128,7 +128,7 @@ enum __socket_type #define AF_LAT PF_LAT #define AF_HYLINK PF_HYLINK #define AF_APPLETALK PF_APPLETALK -#define AF_ROUTE PF_ROUTE +/* #define AF_ROUTE PF_ROUTE */ /* #define AF_LINK PF_LINK */ #ifdef __USE_MISC # define pseudo_AF_XTP PF_XTP commit a13ebdbc7e644c0d7ee2b638734799c0d5405fdd Author: Samuel Thibault Date: Tue May 26 22:35:55 2026 +0200 Hurd: comment ioctls which cannot currently compile We don't currently have struct ifreq_short, ifreq_int and ifaliasreq, so don't let applications even try to compile these. (cherry picked from commit 707311226345f87ce6a1536a7d7365ce34b236b3) diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h index 151761ef66..4588f813fb 100644 --- a/sysdeps/mach/hurd/bits/ioctls.h +++ b/sysdeps/mach/hurd/bits/ioctls.h @@ -293,8 +293,8 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ #define OSIOCGIFDSTADDR _IOWR('i',15, struct ifreq) /* get p-p address */ #define SIOCGIFDSTADDR _IOWR('i',34, struct ifreq) /* get p-p address */ -#define SIOCSIFFLAGS _IOW('i', 16, struct ifreq_short)/* set ifnet flags */ -#define SIOCGIFFLAGS _IOWR('i',17, struct ifreq_short)/* get ifnet flags */ +/* #define SIOCSIFFLAGS _IOW('i', 16, struct ifreq_short) set ifnet flags */ +/* #define SIOCGIFFLAGS _IOWR('i',17, struct ifreq_short) get ifnet flags */ #define OSIOCGIFBRDADDR _IOWR('i',18, struct ifreq) /* get broadcast addr */ #define SIOCGIFBRDADDR _IOWR('i',35, struct ifreq) /* get broadcast addr */ #define SIOCSIFBRDADDR _IOW('i',19, struct ifreq) /* set broadcast addr */ @@ -303,21 +303,21 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define OSIOCGIFNETMASK _IOWR('i',21, struct ifreq) /* get net addr mask */ #define SIOCGIFNETMASK _IOWR('i',37, struct ifreq) /* get net addr mask */ #define SIOCSIFNETMASK _IOW('i',22, struct ifreq) /* set net addr mask */ -#define SIOCGIFMETRIC _IOWR('i',23, struct ifreq_int) /* get IF metric */ -#define SIOCSIFMETRIC _IOW('i',24, struct ifreq_int) /* set IF metric */ +/* #define SIOCGIFMETRIC _IOWR('i',23, struct ifreq_int) get IF metric */ +/* #define SIOCSIFMETRIC _IOW('i',24, struct ifreq_int) set IF metric */ #define SIOCDIFADDR _IOW('i',25, struct ifreq) /* delete IF addr */ -#define SIOCAIFADDR _IOW('i',26, struct ifaliasreq) /* add/chg IF alias */ +/* #define SIOCAIFADDR _IOW('i',26, struct ifaliasreq) add/chg IF alias */ #define SIOCSARP _IOW('i', 30, struct arpreq) /* set arp entry */ #define OSIOCGARP _IOWR('i',31, struct arpreq) /* get arp entry */ #define SIOCGARP _IOWR('i',38, struct arpreq) /* get arp entry */ #define SIOCDARP _IOW('i', 32, struct arpreq) /* delete arp entry */ -#define SIOCGIFMTU _IOWR('i', 51, struct ifreq_int)/* get IF mtu */ -#define SIOCSIFMTU _IOW('i', 52, struct ifreq_int) /* set IF mtu */ +/* #define SIOCGIFMTU _IOWR('i', 51, struct ifreq_int) get IF mtu */ +/* #define SIOCSIFMTU _IOW('i', 52, struct ifreq_int) set IF mtu */ -#define SIOCGIFINDEX _IOWR('i', 90, struct ifreq_int)/* get IF index */ -#define SIOCGIFNAME _IOWR('i', 91, struct ifreq_int)/* set IF name */ +/* #define SIOCGIFINDEX _IOWR('i', 90, struct ifreq_int) get IF index */ +/* #define SIOCGIFNAME _IOWR('i', 91, struct ifreq_int) set IF name */ /* Compatibility with 4.3 BSD terminal driver. commit 22f3d24a6b6817086dc7b4898a06a969696c9f5e Author: Samuel Thibault Date: Tue May 26 23:07:12 2026 +0200 Hurd: restore some SIOC ioctls We do not define struct ifreq_short and ifreq_int, but we do define _IOT_ifreq_short and _IOT_ifreq_int, and need these for sysdeps/gnu/ifaddrs.c and sysdeps/mach/hurd/if_index.c (cherry picked from commit b507b6d4c6138bfa3d6ff04ff880dc626c1c3605) diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h index 4588f813fb..162a815082 100644 --- a/sysdeps/mach/hurd/bits/ioctls.h +++ b/sysdeps/mach/hurd/bits/ioctls.h @@ -293,8 +293,8 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define SIOCSIFDSTADDR _IOW('i', 14, struct ifreq) /* set p-p address */ #define OSIOCGIFDSTADDR _IOWR('i',15, struct ifreq) /* get p-p address */ #define SIOCGIFDSTADDR _IOWR('i',34, struct ifreq) /* get p-p address */ -/* #define SIOCSIFFLAGS _IOW('i', 16, struct ifreq_short) set ifnet flags */ -/* #define SIOCGIFFLAGS _IOWR('i',17, struct ifreq_short) get ifnet flags */ +#define SIOCSIFFLAGS _IOW('i', 16, struct ifreq_short)/* set ifnet flags */ +#define SIOCGIFFLAGS _IOWR('i',17, struct ifreq_short)/* get ifnet flags */ #define OSIOCGIFBRDADDR _IOWR('i',18, struct ifreq) /* get broadcast addr */ #define SIOCGIFBRDADDR _IOWR('i',35, struct ifreq) /* get broadcast addr */ #define SIOCSIFBRDADDR _IOW('i',19, struct ifreq) /* set broadcast addr */ @@ -303,8 +303,8 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define OSIOCGIFNETMASK _IOWR('i',21, struct ifreq) /* get net addr mask */ #define SIOCGIFNETMASK _IOWR('i',37, struct ifreq) /* get net addr mask */ #define SIOCSIFNETMASK _IOW('i',22, struct ifreq) /* set net addr mask */ -/* #define SIOCGIFMETRIC _IOWR('i',23, struct ifreq_int) get IF metric */ -/* #define SIOCSIFMETRIC _IOW('i',24, struct ifreq_int) set IF metric */ +#define SIOCGIFMETRIC _IOWR('i',23, struct ifreq_int) /* get IF metric */ +#define SIOCSIFMETRIC _IOW('i',24, struct ifreq_int) /* set IF metric */ #define SIOCDIFADDR _IOW('i',25, struct ifreq) /* delete IF addr */ /* #define SIOCAIFADDR _IOW('i',26, struct ifaliasreq) add/chg IF alias */ @@ -313,11 +313,11 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define SIOCGARP _IOWR('i',38, struct arpreq) /* get arp entry */ #define SIOCDARP _IOW('i', 32, struct arpreq) /* delete arp entry */ -/* #define SIOCGIFMTU _IOWR('i', 51, struct ifreq_int) get IF mtu */ -/* #define SIOCSIFMTU _IOW('i', 52, struct ifreq_int) set IF mtu */ +#define SIOCGIFMTU _IOWR('i', 51, struct ifreq_int)/* get IF mtu */ +#define SIOCSIFMTU _IOW('i', 52, struct ifreq_int) /* set IF mtu */ -/* #define SIOCGIFINDEX _IOWR('i', 90, struct ifreq_int) get IF index */ -/* #define SIOCGIFNAME _IOWR('i', 91, struct ifreq_int) set IF name */ +#define SIOCGIFINDEX _IOWR('i', 90, struct ifreq_int)/* get IF index */ +#define SIOCGIFNAME _IOWR('i', 91, struct ifreq_int)/* set IF name */ /* Compatibility with 4.3 BSD terminal driver. commit fe0ccc9564c3476f7171cb005884560da0699773 Author: Florian Weimer Date: Tue Jun 9 07:28:02 2026 +0200 iconv: Suppress intermediate errors with //TRANSLIT (bug 34236) When tentatively converting characters on behalf of __gconv_transliterate, do not create a persistent error. Just produce a local error, and rely on __gconv_transliterate to produce the error if all transliteration options are exhausted. This fixes transliteration of “½” to ASCII, which cannot use the “ 1⁄2 ” alternative. Eventually, the “ 1/2 ” alternative is chosen, but the error sticks. Therefore, iconv exited with status 1 before this change. Adjust iconv/tst-iconv_prog.sh to test both C and en_US.UTF-8 locales. This requires changing the way the ICONV template is defined, so that run_program_env is evaluated multiple times. Fixes commit 9a4b0eaf726f5404c6683d5c7c5e86f61c3f3fbc ("iconv: do not report error exit with transliteration [BZ #32448]"), commit 6cbf845fcdc76131d0e674cee454fe738b69c69d ("iconv: Preserve iconv -c error exit on invalid inputs (bug 32046)"), and bug 34236. Reviewed-by: Aurelien Jarno (cherry picked from commit e9325bd7d04aacc45cf39505e279b1ca9de22c08) diff --git a/iconv/Makefile b/iconv/Makefile index 51ffab9efc..69555cbe57 100644 --- a/iconv/Makefile +++ b/iconv/Makefile @@ -139,7 +139,8 @@ $(objpfx)test-iconvconfig.out: $(objpfx)iconvconfig rm -f $$tmp) > $@; \ $(evaluate-test) -$(objpfx)tst-iconv_prog.out: tst-iconv_prog.sh $(objpfx)iconv_prog +$(objpfx)tst-iconv_prog.out: tst-iconv_prog.sh $(objpfx)iconv_prog \ + $(gen-locales) $(BASH) $< $(common-objdir) '$(test-wrapper-env)' \ '$(run-program-env)' '$(rpath-link)' > $@; \ $(evaluate-test) diff --git a/iconv/loop.c b/iconv/loop.c index 27dea1f5d6..81841d0d2d 100644 --- a/iconv/loop.c +++ b/iconv/loop.c @@ -144,8 +144,10 @@ if (irreversible == NULL) \ { \ /* This means we are in call from __gconv_transliterate. In this \ - case we are not doing any error recovery ourselves. */ \ - result = __gconv_mark_illegal_input (step_data); \ + case we are not doing any error recovery ourselves. Do not create \ + a persistent error state. If __gconv_transliterate exhausts all \ + alternatives, it will call __gconv_mark_illegal_input itself. */ \ + result = __GCONV_ILLEGAL_INPUT; \ break; \ } \ \ diff --git a/iconv/tst-iconv_prog.sh b/iconv/tst-iconv_prog.sh index f6c7c265a8..ab6e14c685 100644 --- a/iconv/tst-iconv_prog.sh +++ b/iconv/tst-iconv_prog.sh @@ -29,10 +29,10 @@ LIBPATH=$codir:$codir/iconvdata # How the start the iconv(1) program. $from is not defined/expanded yet. ICONV=' +$test_wrapper_env $run_program_env $codir/elf/ld.so --library-path $library_path:$LIBPATH --inhibit-rpath ${from}.so $codir/iconv/iconv_prog ' -ICONV="$test_wrapper_env $run_program_env $ICONV" TIMEOUTFACTOR=${TIMEOUTFACTOR:-1} @@ -220,6 +220,7 @@ testarray=( "\x00\x00;;INVALID;UTF-8;1" "\x00\x00;;UTF-8;INVALID;1" "\xc3\xa9;;UTF-8;ASCII//TRANSLIT;0" +"X\xc2\xbdY;;UTF-8;ASCII//TRANSLIT;0" ) # Requires $twobyte input, $c flag, $from, and $to to be set; sets $ret @@ -280,12 +281,21 @@ check_errtest_result () fi } -for testcommand in "${testarray[@]}"; do - twobyte="$(echo "$testcommand" | cut -d";" -f 1)" - c="$(echo "$testcommand" | cut -d";" -f 2)" - from="$(echo "$testcommand" | cut -d";" -f 3)" - to="$(echo "$testcommand" | cut -d";" -f 4)" - eret="$(echo "$testcommand" | cut -d";" -f 5)" - execute_test - check_errtest_result -done +run_test_array () +{ + for testcommand in "${testarray[@]}"; do + twobyte="$(echo "$testcommand" | cut -d";" -f 1)" + c="$(echo "$testcommand" | cut -d";" -f 2)" + from="$(echo "$testcommand" | cut -d";" -f 3)" + to="$(echo "$testcommand" | cut -d";" -f 4)" + eret="$(echo "$testcommand" | cut -d";" -f 5)" + execute_test + check_errtest_result + done +} + +echo "info: testing C locale" +run_test_array +echo "info: testing en_US.UTF-8 locale" +run_program_env="$run_program_env LC_ALL=en_US.UTF-8" +run_test_array commit a6fa9a95949e3a24c09590a61e96f500e9c75c43 Author: Adhemerval Zanella Date: Wed May 13 08:32:24 2026 -0300 arm: Save/restore VFP registers in PLT trampolines (BZ 34144, BZ 15792) _dl_runtime_resolve and _dl_runtime_profile only preserved the integer argument registers (r0-r3) across the inner call to _dl_fixup / _dl_profile_fixup. Two related ABI requirements demand more: * Under AAPCS-VFP, d0-d7 hold the caller's double arguments to the function being resolved. Recent GCC emits VFP instructions inside the fixup routines, clobbering them, so the resolved function sees corrupted arguments (BZ 34144). * Per RTABI32, the __aeabi_mem* helpers (and similar runtime helpers reachable through the dynamic linker) must only corrupt integer core registers. IFUNC resolvers, audit modules, and interposed malloc invoked during symbol resolution may also use VFP, even on softfp ABI builds (BZ 15792). Save all call-clobbered VFP state -- d0-d15 unconditionally, d16-d31 when HWCAP_ARM_VFPD32 is set, and fpscr -- around the inner fixup call. Whether VFP is usable is a property of the hardware, not of the ABI glibc was built with, so the decision is gated on AT_HWCAP at runtime in both hardfp and softfp builds; hardfp builds will always find HWCAP_ARM_VFP set, while softfp builds running on a non-VFP CPU correctly skip the save. For _dl_runtime_profile the save area is slipped in just before the bl to _dl_profile_fixup; the outgoing framesizep argument is recomputed to account for the extra frame, and both the fast path (no audit framesize) and the slow path (audit wraps with pltenter/pltexit) traverse the restore before splitting. Checked on arm-linux-gnueabihf. Tested-by: Aurelien Jarno Reviewed-by: Wilco Dijkstra (cherry picked from commit 1111fbdd3e7ebed402800bc23e67055eaae0d972) diff --git a/sysdeps/arm/Makefile b/sysdeps/arm/Makefile index d08dade3c5..0bb1b6e05b 100644 --- a/sysdeps/arm/Makefile +++ b/sysdeps/arm/Makefile @@ -30,6 +30,25 @@ $(objpfx)tst-armtlsdescloc: $(objpfx)tst-armtlsdesclocmod.so $(objpfx)tst-armtlsdescextnow: $(objpfx)tst-armtlsdescextnowmod.so $(objpfx)tst-armtlsdescextlazy: $(objpfx)tst-armtlsdescextlazymod.so endif + +tests += \ + tst-bz34144 \ + tst-bz34144-audit \ + # tests +modules-names += \ + tst-bz34144-auditmod \ + tst-bz34144-mod \ + # modules-names +$(objpfx)tst-bz34144: $(objpfx)tst-bz34144-mod.so +$(objpfx)tst-bz34144-audit: $(objpfx)tst-bz34144-mod.so +$(objpfx)tst-bz34144-audit.out: $(objpfx)tst-bz34144-auditmod.so +# Use lazy binding to check if _dl_runtime_resolve correctly save/restore +# the VFP state. +LDFLAGS-tst-bz34144 = -Wl,-z,lazy +# With LD_AUDIT, lazy resolution goes through _dl_runtime_profile, which +# must also save/restore VFP state (BZ 34144). +LDFLAGS-tst-bz34144-audit = -Wl,-z,lazy +tst-bz34144-audit-ENV = LD_AUDIT=$(objpfx)tst-bz34144-auditmod.so endif endif diff --git a/sysdeps/arm/dl-trampoline.S b/sysdeps/arm/dl-trampoline.S index eb6d464384..88d6824e52 100644 --- a/sysdeps/arm/dl-trampoline.S +++ b/sysdeps/arm/dl-trampoline.S @@ -20,6 +20,7 @@ #define NO_THUMB #include #include +#include .text .globl _dl_runtime_resolve @@ -36,13 +37,40 @@ _dl_runtime_resolve: @ ip contains &GOT[n+3] (pointer to function) @ lr points to &GOT[2] - @ Save arguments. We save r4 to realign the stack. + @ Save arguments. We save r4 to realign the stack and to hold + @ the hwcap value used to decide whether to save VFP registers. push {r0-r4} cfi_adjust_cfa_offset (20) cfi_rel_offset (r0, 0) cfi_rel_offset (r1, 4) cfi_rel_offset (r2, 8) cfi_rel_offset (r3, 12) + cfi_rel_offset (r4, 16) + +#ifdef SHARED + @ Preserve all call-clobbered VFP registers across _dl_fixup. + @ VFP may be used by IFUNC resolvers, audit modules, interposed + @ malloc, and the __aeabi_mem* helpers required by RTABI32, + @ which mandates that those helpers only corrupt integer core + @ registers. + LDR_GLOBAL (r4, r3, C_SYMBOL_NAME(_rtld_global_ro), \ + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET) + + tst r4, #HWCAP_ARM_VFP + beq .Lno_vfp_save + +# define VFP_STACK_REQ (32*8 + 8) + sub sp, sp, VFP_STACK_REQ + cfi_adjust_cfa_offset (VFP_STACK_REQ) + mov r3, sp + .inst 0xeca30b20 @ vstmia r3!, {d0-d15} + tst r4, #HWCAP_ARM_VFPD32 + beq 1f + .inst 0xece30b20 @ vstmia r3!, {d16-d31} +1: .inst 0xeef12a10 @ vmrs r2, fpscr + str r2, [r3] +.Lno_vfp_save: +#endif /* SHARED */ @ get pointer to linker struct ldr r0, [lr, #-4] @@ -59,8 +87,23 @@ _dl_runtime_resolve: @ save the return mov ip, r0 - @ get arguments and return address back. We restore r4 - @ only to realign the stack. +#ifdef SHARED + tst r4, #HWCAP_ARM_VFP + beq .Lno_vfp_restore + mov r3, sp + .inst 0xecb30b20 @ vldmia r3!, {d0-d15} + tst r4, #HWCAP_ARM_VFPD32 + beq 2f + .inst 0xecf30b20 @ vldmia r3!, {d16-d31} +2: ldr r2, [r3] + .inst 0xeee12a10 @ vmsr fpscr, r2 + add sp, sp, VFP_STACK_REQ + cfi_adjust_cfa_offset (-VFP_STACK_REQ) +.Lno_vfp_restore: +#endif /* SHARED */ + + @ get arguments and return address back. We restore r4 to + @ its original value as well. pop {r0-r4,lr} cfi_adjust_cfa_offset (-24) @@ -124,14 +167,71 @@ _dl_runtime_profile: add r3, sp, #8 stmia r3!, {r0,r1} + @ Preserve all call-clobbered VFP registers across + @ _dl_profile_fixup. See the matching comment in + @ _dl_runtime_resolve above for the rationale (BZ 34144, + @ BZ 15792). + @ + @ Stack layout below the current sp (which becomes the new sp + @ after the sub): + @ sp + 0 .. 3: outgoing arg (framesizep) for _dl_profile_fixup + @ sp + 4 .. 7: saved hwcap (so we can test it after the call) + @ sp + 8 .. 11: saved r2 (used as scratch for LDR_GLOBAL) + @ sp + 12 .. 15: padding (for 8-byte alignment of the VFP area) + @ sp + 16 .. 16+VFP_STACK_REQ-1: VFP regs + fpscr +#define VFP_PROFILE_STACK (16 + VFP_STACK_REQ) + sub sp, sp, #VFP_PROFILE_STACK + cfi_adjust_cfa_offset (VFP_PROFILE_STACK) + + @ r2 holds the retaddr (3rd arg to _dl_profile_fixup); spill + @ it so we can use it as the LDR_GLOBAL destination. + str r2, [sp, #8] + + LDR_GLOBAL (r2, ip, C_SYMBOL_NAME(_rtld_global_ro), \ + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET) + str r2, [sp, #4] + + tst r2, #HWCAP_ARM_VFP + beq .Lprofile_no_vfp_save + add ip, sp, #16 + .inst 0xecac0b20 @ vstmia ip!, {d0-d15} + tst r2, #HWCAP_ARM_VFPD32 + beq 7f + .inst 0xecec0b20 @ vstmia ip!, {d16-d31} +7: .inst 0xeef12a10 @ vmrs r2, fpscr + str r2, [ip] +.Lprofile_no_vfp_save: + + @ Restore r2 (retaddr) for _dl_profile_fixup. + ldr r2, [sp, #8] + @ Set up extra args for _dl_profile_fixup. - @ r2 and r3 are already loaded. - add ip, sp, #208 + @ The framesize slot is at the old sp+208, which is the new + @ sp + VFP_PROFILE_STACK + 208 -- compute in two steps because + @ the combined offset is not encodable as an ARM immediate. + add ip, sp, #VFP_PROFILE_STACK + add ip, ip, #208 str ip, [sp, #0] @ call profiling fixup routine bl _dl_profile_fixup + @ Restore VFP registers. r0 holds the resolved function + @ address; r1/r2/ip are caller-saved by the call. + ldr r1, [sp, #4] + tst r1, #HWCAP_ARM_VFP + beq .Lprofile_no_vfp_restore + add ip, sp, #16 + .inst 0xecbc0b20 @ vldmia ip!, {d0-d15} + tst r1, #HWCAP_ARM_VFPD32 + beq 8f + .inst 0xecfc0b20 @ vldmia ip!, {d16-d31} +8: ldr r2, [ip] + .inst 0xeee12a10 @ vmsr fpscr, r2 +.Lprofile_no_vfp_restore: + add sp, sp, #VFP_PROFILE_STACK + cfi_adjust_cfa_offset (-VFP_PROFILE_STACK) + @ The address to call is now in r0. @ Check whether we're wrapping this function. diff --git a/sysdeps/arm/tst-bz34144-audit.c b/sysdeps/arm/tst-bz34144-audit.c new file mode 100644 index 0000000000..8f1084fa0a --- /dev/null +++ b/sysdeps/arm/tst-bz34144-audit.c @@ -0,0 +1,32 @@ +/* Test that lazy PLT resolution via _dl_runtime_profile preserves + caller-saved VFP registers used to pass double arguments (BZ 34144). + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +extern void test_float_args (double a, double b, double c, double d, + double e, double f, double g, double h); + +static int +do_test (void) +{ + test_float_args (2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); + return 0; +} + +#include diff --git a/sysdeps/arm/tst-bz34144-auditmod.c b/sysdeps/arm/tst-bz34144-auditmod.c new file mode 100644 index 0000000000..ada9f126c2 --- /dev/null +++ b/sysdeps/arm/tst-bz34144-auditmod.c @@ -0,0 +1,50 @@ +/* Minimal audit module used by tst-bz34144-audit to force PLT calls + to go through _dl_runtime_profile instead of _dl_runtime_resolve. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +unsigned int +la_version (unsigned int v) +{ + return v; +} + +unsigned int +la_objopen (struct link_map *l, Lmid_t lmid, uintptr_t *cookie) +{ + return LA_FLG_BINDFROM | LA_FLG_BINDTO; +} + +uintptr_t +la_symbind32 (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook, + uintptr_t *defcook, unsigned int *flags, const char *symname) +{ + return sym->st_value; +} + +Elf32_Addr +la_arm_gnu_pltenter (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook, + uintptr_t *defcook, La_arm_regs *regs, + unsigned int *flags, const char *symname, + long int *framesizep) +{ + return sym->st_value; +} diff --git a/sysdeps/arm/tst-bz34144-mod.c b/sysdeps/arm/tst-bz34144-mod.c new file mode 100644 index 0000000000..be6b54bf91 --- /dev/null +++ b/sysdeps/arm/tst-bz34144-mod.c @@ -0,0 +1,28 @@ +/* DSO used by tst-bz34144. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +void +test_float_args (double a, double b, double c, double d, + double e, double f, double g, double h) +{ + if (a != 2.0 || b != 3.0 || c != 4.0 || d != 5.0 + || e != 6.0 || f != 7.0 || g != 8.0 || h != 9.0) + abort (); +} diff --git a/sysdeps/arm/tst-bz34144.c b/sysdeps/arm/tst-bz34144.c new file mode 100644 index 0000000000..61e41b3945 --- /dev/null +++ b/sysdeps/arm/tst-bz34144.c @@ -0,0 +1,32 @@ +/* Test that lazy PLT resolution preserves caller-saved VFP registers + used to pass double arguments (BZ 34144). + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +extern void test_float_args (double a, double b, double c, double d, + double e, double f, double g, double h); + +static int +do_test (void) +{ + test_float_args (2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); + return 0; +} + +#include commit fdf10644d6ee345c7b5277c3fa009c1bedb92d60 Author: John David Anglin Date: Tue Jun 23 13:41:10 2026 -0400 hppa: Fix missing call to __feraiseexcept (BZ 34306) The feupdateenv function is supposed to raise exceptions after installing the environment represented by its envp argument. This was accidentally missed on hppa. The failure to raise exceptions was noticed by the failure of the math/test-narrowing-trap test. Signed-off-by: John David Anglin diff --git a/sysdeps/hppa/fpu/feupdateenv.c b/sysdeps/hppa/fpu/feupdateenv.c index 397ec7298c..4d7c7f5a37 100644 --- a/sysdeps/hppa/fpu/feupdateenv.c +++ b/sysdeps/hppa/fpu/feupdateenv.c @@ -24,6 +24,7 @@ __feupdateenv (const fenv_t *envp) { union { unsigned long long l; unsigned int sw[2]; } s; fenv_t temp; + /* Get the current exception status */ __asm__ ("fstd %%fr0,0(%1) \n\t" "fldd 0(%1),%%fr0 \n\t" @@ -46,6 +47,10 @@ __feupdateenv (const fenv_t *envp) /* Install new environment. */ __fesetenv (&temp); + + /* Raise exceptions. */ + __feraiseexcept (temp.__status_word >> 27); + /* Success. */ return 0; } commit 349297a4ebaedf80701a7505351a23a8bdbd9808 Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: Declare __p_class_syms, __p_type_syms for internal use Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit 360f352c9a6da545d798ef3015e73ca114f0d230) diff --git a/include/resolv.h b/include/resolv.h index 4dbbac3800..d5ad9994b9 100644 --- a/include/resolv.h +++ b/include/resolv.h @@ -70,6 +70,11 @@ libc_hidden_proto (__libc_res_nameinquery) extern __typeof (__res_queriesmatch) __libc_res_queriesmatch; libc_hidden_proto (__libc_res_queriesmatch) +extern const struct res_sym __p_class_syms[]; +libresolv_hidden_proto (__p_class_syms) +extern const struct res_sym __p_type_syms[]; +libresolv_hidden_proto (__p_type_syms) + /* Variant of res_hnok which operates on binary (but uncompressed) names. */ bool __res_binary_hnok (const unsigned char *dn) attribute_hidden; diff --git a/resolv/res_debug.c b/resolv/res_debug.c index 73af0c72fe..6bf9962916 100644 --- a/resolv/res_debug.c +++ b/resolv/res_debug.c @@ -390,8 +390,6 @@ p_fqname(const u_char *cp, const u_char *msg, FILE *file) { * that C_ANY is a qclass but not a class. (You can ask for records of class * C_ANY, but you can't have any records of that class in the database.) */ -extern const struct res_sym __p_class_syms[]; -libresolv_hidden_proto (__p_class_syms) const struct res_sym __p_class_syms[] = { {C_IN, (char *) "IN"}, {C_CHAOS, (char *) "CHAOS"}, @@ -426,8 +424,6 @@ const struct res_sym __p_update_section_syms[] attribute_hidden = { * Names of RR types and qtypes. The list is incomplete because its * size is part of the ABI. */ -extern const struct res_sym __p_type_syms[]; -libresolv_hidden_proto (__p_type_syms) const struct res_sym __p_type_syms[] = { {ns_t_a, (char *) "A", (char *) "address"}, {ns_t_ns, (char *) "NS", (char *) "name server"}, commit 1d7d1a16b0f60b37d868e6727dcfc57ae4f2bc5a Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: Fix ns_sprintrrf formatting of class, type values (bug 34289) The p_class and p_type results could overwrite each other if both were unknown. Format unknown values with CLASS and TYPE prefixes, as in RFC 3597. Handle A6 separately because it cannot be added to __p_type_syms for ABI reasons. Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit f69b7f95e3694177546faec25d88bb266885c3b8) diff --git a/resolv/ns_print.c b/resolv/ns_print.c index cef2212fd2..e75c39eaa8 100644 --- a/resolv/ns_print.c +++ b/resolv/ns_print.c @@ -78,6 +78,24 @@ ns_sprintrr(const ns_msg *handle, const ns_rr *rr, } libresolv_hidden_def (ns_sprintrr) +/* Writes the class/type symbol NUMBER to *BUF, using the name from + *SYMS if possible. If NUMBER is not found in *SYMS, print the + number with PREFIX. */ +static int +addsym (const struct res_sym *syms, int number, const char *prefix, + char **buf, size_t *buflen) +{ + for (; syms->name != NULL; syms++) + if (number == syms->number) + { + T (addstr (" ", 1, buf, buflen)); + return addstr (syms->name, strlen (syms->name), buf, buflen); + } + char tmp[20]; + int len = snprintf (tmp, sizeof (tmp), " %s%d", prefix, number); + return addstr (tmp, len, buf, buflen); +} + /*% * Convert the fields of an RR into presentation format. * @@ -128,11 +146,21 @@ ns_sprintrrf(const u_char *msg, size_t msglen, /* * TTL, Class, Type. */ - T(x = ns_format_ttl(ttl, buf, buflen)); - addlen(x, &buf, &buflen); - len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type))); - T(addstr(tmp, len, &buf, &buflen)); - T(spaced = addtab(x + len, 16, spaced, &buf, &buflen)); + { + char *start = buf; + + T (x = ns_format_ttl (ttl, buf, buflen)); + addlen (x, &buf, &buflen); + T (addsym (__p_class_syms, class, "CLASS", &buf, &buflen)); + if (type == ns_t_a6) + /* A6 is not part of __p_type_syms, which is exported. + Adding A6 there would change its size. Handle it here. */ + T (addstr (" A6", 3, &buf, &buflen)); + else + T (addsym (__p_type_syms, type, "TYPE", &buf, &buflen)); + + T (spaced = addtab(buf - start, 16, spaced, &buf, &buflen)); + } /* * RData. commit c46f7b2fd6cdbecaa821f35f7e2f9c989e7a3767 Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: Improve formatting of unknown records in ns_sprintrrf Do not add the "unknown RR type" comment. After adding the TYPE prefix, the number is largely redundant. Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit d58415eb17d457a160af99f9e8ab164404ca151b) diff --git a/resolv/ns_print.c b/resolv/ns_print.c index e75c39eaa8..3d38876483 100644 --- a/resolv/ns_print.c +++ b/resolv/ns_print.c @@ -115,7 +115,6 @@ ns_sprintrrf(const u_char *msg, size_t msglen, const char *comment; char tmp[100]; - char errbuf[40]; int len, x; /* @@ -590,20 +589,18 @@ ns_sprintrrf(const u_char *msg, size_t msglen, T(addstr(tmp, len, &buf, &buflen)); break; } - default: - snprintf (errbuf, sizeof (errbuf), "unknown RR type %d", type); - comment = errbuf; + comment = ""; goto hexify; } return (buf - obuf); formerr: - comment = "RR format error"; + comment = " ; RR format error"; hexify: { int n, m; char *p; - len = SPRINTF((tmp, "\\# %u%s\t; %s", (unsigned)(edata - rdata), + len = SPRINTF((tmp, "\\# %u%s%s", (unsigned)(edata - rdata), rdlen != 0U ? " (" : "", comment)); T(addstr(tmp, len, &buf, &buflen)); while (rdata < edata) { commit c9225a3e73a8dba1e602802aef70f7f9dfeb4606 Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: Check for inet_ntop failure in ns_sprintrrf This makes the output more consistent (either failure or complete output) and helps with systematic testing with varying buffer sizes. Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit cd0db208d56a2cecd528b8ae96df752ba5344d9a) diff --git a/resolv/ns_print.c b/resolv/ns_print.c index 3d38876483..e58df5f35a 100644 --- a/resolv/ns_print.c +++ b/resolv/ns_print.c @@ -167,8 +167,9 @@ ns_sprintrrf(const u_char *msg, size_t msglen, switch (type) { case ns_t_a: if (rdlen != (size_t)NS_INADDRSZ) - goto formerr; - (void) inet_ntop(AF_INET, rdata, buf, buflen); + goto formerr; + if (inet_ntop (AF_INET, rdata, buf, buflen) == NULL) + return -1; addlen(strlen(buf), &buf, &buflen); break; @@ -334,9 +335,10 @@ ns_sprintrrf(const u_char *msg, size_t msglen, } case ns_t_aaaa: - if (rdlen != (size_t)NS_IN6ADDRSZ) - goto formerr; - (void) inet_ntop(AF_INET6, rdata, buf, buflen); + if (rdlen != (size_t)NS_IN6ADDRSZ) + goto formerr; + if (inet_ntop (AF_INET6, rdata, buf, buflen) == NULL) + return -1; addlen(strlen(buf), &buf, &buflen); break; @@ -427,7 +429,8 @@ ns_sprintrrf(const u_char *msg, size_t msglen, goto formerr; /* Address. */ - (void) inet_ntop(AF_INET, rdata, buf, buflen); + if (inet_ntop (AF_INET, rdata, buf, buflen) == NULL) + return -1; addlen(strlen(buf), &buf, &buflen); rdata += NS_INADDRSZ; @@ -569,7 +572,8 @@ ns_sprintrrf(const u_char *msg, size_t msglen, if (rdata + pbyte >= edata) goto formerr; memset(&a, 0, sizeof(a)); memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte); - (void) inet_ntop(AF_INET6, &a, buf, buflen); + if (inet_ntop (AF_INET6, &a, buf, buflen) == NULL) + return -1; addlen(strlen(buf), &buf, &buflen); rdata += sizeof(a) - pbyte; } commit e64ae5a591f0604b7504df4df631857bb11cc78b Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: More types as unknown in ns_sprintrrf (CVE-2026-5435) Specifically, CERT, TKEY, TSIG, OPT. This removes the buggy implementations of TSIG, fixing bug 34033, and partially fixing bug 34069. Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit ca44a6609c29a683b03575fa035c6d17aa591e72) diff --git a/resolv/ns_print.c b/resolv/ns_print.c index e58df5f35a..ab68bf2cb7 100644 --- a/resolv/ns_print.c +++ b/resolv/ns_print.c @@ -464,96 +464,6 @@ ns_sprintrrf(const u_char *msg, size_t msglen, break; } - case ns_t_cert: { - u_int c_type, key_tag, alg; - int n; - unsigned int siz; - char base64_cert[8192], tmp[40]; - const char *leader; - - c_type = ns_get16(rdata); rdata += NS_INT16SZ; - key_tag = ns_get16(rdata); rdata += NS_INT16SZ; - alg = (u_int) *rdata++; - - len = SPRINTF((tmp, "%d %d %d ", c_type, key_tag, alg)); - T(addstr(tmp, len, &buf, &buflen)); - siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ - if (siz > sizeof(base64_cert) * 3/4) { - const char *str = "record too long to print"; - T(addstr(str, strlen(str), &buf, &buflen)); - } - else { - len = b64_ntop(rdata, edata-rdata, base64_cert, siz); - - if (len < 0) - goto formerr; - else if (len > 15) { - T(addstr(" (", 2, &buf, &buflen)); - leader = "\n\t\t"; - spaced = 0; - } - else - leader = " "; - - for (n = 0; n < len; n += 48) { - T(addstr(leader, strlen(leader), - &buf, &buflen)); - T(addstr(base64_cert + n, MIN(len - n, 48), - &buf, &buflen)); - } - if (len > 15) - T(addstr(" )", 2, &buf, &buflen)); - } - break; - } - - case ns_t_tkey: { - /* KJD - need to complete this */ - u_long t; - int mode, err, keysize; - - /* Algorithm name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Inception. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%lu ", t)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Expiration. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%lu ", t)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Mode , Error, Key Size. */ - /* Priority, Weight, Port. */ - mode = ns_get16(rdata); rdata += NS_INT16SZ; - err = ns_get16(rdata); rdata += NS_INT16SZ; - keysize = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize)); - T(addstr(tmp, len, &buf, &buflen)); - - /* XXX need to dump key, print otherdata length & other data */ - break; - } - - case ns_t_tsig: { - /* BEW - need to complete this */ - int n; - - T(len = addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - rdata += 8; /*%< time */ - n = ns_get16(rdata); rdata += INT16SZ; - rdata += n; /*%< sig */ - n = ns_get16(rdata); rdata += INT16SZ; /*%< original id */ - sprintf(buf, "%d", ns_get16(rdata)); - rdata += INT16SZ; - addlen(strlen(buf), &buf, &buflen); - break; - } - case ns_t_a6: { struct in6_addr a; int pbyte, pbit; @@ -588,11 +498,6 @@ ns_sprintrrf(const u_char *msg, size_t msglen, break; } - case ns_t_opt: { - len = SPRINTF((tmp, "%u bytes", class)); - T(addstr(tmp, len, &buf, &buflen)); - break; - } default: comment = ""; goto hexify; commit 3a418da6a3938756763980541e440dbdd46900fb Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: Fix buffer overreads in ns_sprintrrf (CVE-2026-6238) Check that the RDATA payload does not require more than RDATALEN bytes while processing it. The fixes cover A6, LOC records. (CERT, TKEY, TSIG were fixed before, by switching to the generic formatter.) The vulnerable LOC record handling was first introduced before glibc 2.0, in commit ee188d555b8c32ad9704a7440cab400af967292f. CERT, TSIG, TKEY handling came with commit b43b13ac2544b11f35be301d1589b51a8473e32b, released with glibc 2.2. A6 record handling was introduced in commit 91633816430e7ec5a19fe3ff510a7c4822a9557e ("* resolv/ns_print.c (ns_sprintrrf): Handle ns_t_a6 and ns_t_opt."), which went into glibc 2.7. This fixes bug 34069. Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit a7b60d23bbb56eaef59f4962e4140062e552600a) diff --git a/resolv/ns_print.c b/resolv/ns_print.c index ab68bf2cb7..f9dd086804 100644 --- a/resolv/ns_print.c +++ b/resolv/ns_print.c @@ -345,7 +345,8 @@ ns_sprintrrf(const u_char *msg, size_t msglen, case ns_t_loc: { char t[255]; - /* XXX protocol format checking? */ + if (rdlen != 16) + goto formerr; (void) loc_ntoa(rdata, t); T(addstr(t, strlen(t), &buf, &buflen)); break; @@ -479,13 +480,14 @@ ns_sprintrrf(const u_char *msg, size_t msglen, /* address suffix: provided only when prefix len != 128 */ if (pbit < 128) { - if (rdata + pbyte >= edata) goto formerr; + unsigned int bytelen = sizeof(a) - pbyte; + if (edata - rdata < bytelen) goto formerr; memset(&a, 0, sizeof(a)); - memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte); + memcpy(&a.s6_addr[pbyte], rdata, bytelen); if (inet_ntop (AF_INET6, &a, buf, buflen) == NULL) return -1; addlen(strlen(buf), &buf, &buflen); - rdata += sizeof(a) - pbyte; + rdata += bytelen; } /* prefix name: provided only when prefix len > 0 */ commit 8759917de589b125a08f63653170dfcb3de4df31 Author: Florian Weimer Date: Fri Jun 19 18:22:20 2026 +0200 resolv: Add test case tst-ns_sprintrr (bug 34033, bug 34069) This test case covers both input buffer overreads and output buffer overflows. It should systematically cover these issues. I used code auto-generation for updating the test expectations for truncated RDATA in TXT, ISDN records, after writing the rest of the test by hand. Assisted-by: LLM Reviewed-by: Carlos O'Donell Reviewed-by: Adhemerval Zanella (cherry picked from commit 4ba0b79b9596e5a4951cc9eaa1546a55e543e083) diff --git a/resolv/Makefile b/resolv/Makefile index 79a1b9647f..130d8b51e0 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -101,6 +101,7 @@ tests += \ tst-ns_name \ tst-ns_name_compress \ tst-ns_name_pton \ + tst-ns_sprintrr \ tst-res_hconf_reorder \ tst-res_hnok \ tst-resolv-aliases \ @@ -339,5 +340,6 @@ $(objpfx)tst-ns_name: $(objpfx)libresolv.so $(objpfx)tst-ns_name.out: tst-ns_name.data $(objpfx)tst-ns_name_compress: $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: $(objpfx)libresolv.so +$(objpfx)tst-ns_sprintrr: $(objpfx)libresolv.so $(objpfx)tst-res_hnok: $(objpfx)libresolv.so $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so diff --git a/resolv/tst-ns_sprintrr.c b/resolv/tst-ns_sprintrr.c new file mode 100644 index 0000000000..34739b5924 --- /dev/null +++ b/resolv/tst-ns_sprintrr.c @@ -0,0 +1,329 @@ +/* Tests for the ns_sprintrr function. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +/* Regions that test_one_record uses for input and output. */ +static struct support_next_to_fault ntf_in; +static struct support_next_to_fault ntf_out; + +/* This is used by test_one_record to construct the packet. */ +static const char packet_prefix[] = + /* DNS response with one question, one answer record. */ + "AA\x81\x80\0\1\0\1\0\0\0\0" + /* Question: www.example.org/IN/ANY. */ + "\3www\7example\3org\0\0\xff\0\1" + /* Response: compression reference. */ + "\xc0\x0c"; + +/* Use ns_sprintrr to format a DNS record (starting with + packet_prefix) of type RTYPE, with a record payload of RDATALEN + bytes starting at RDATA. Check successful formatting against + EXPECTED. Try various truncated input and output buffers to catch + overreads and buffer overflows, using ntf_in and ntf_out above. */ +static void +test_one_record (uint16_t rtype, const char *rdata, size_t rdatalen, + const char *expected) +{ + struct rr_header + { + uint16_t typ; + uint16_t cls; + uint32_t ttl; + uint16_t rdatalen; + uint16_t pad; + } hdr = + { + .typ = htons (rtype), + .cls = htons (ns_c_in), + .ttl = htonl (86400), /* One day. */ + .rdatalen = htons (rdatalen), + }; + enum { hdrlen = offsetof (struct rr_header, pad) }; + TEST_COMPARE (hdrlen, 10); + + /* Construct the packet from packet_prefix, hdr, and rdata. */ + unsigned char packet[512]; + size_t packetlen; + { + struct alloc_buffer buf = alloc_buffer_create (packet, sizeof (packet)); + alloc_buffer_copy_bytes (&buf, packet_prefix, sizeof (packet_prefix) - 1); + alloc_buffer_copy_bytes (&buf, &hdr, hdrlen); + alloc_buffer_copy_bytes (&buf, rdata, rdatalen); + packetlen = sizeof (packet) - alloc_buffer_size (&buf); + } + + /* Parse the record. */ + ns_msg msg; + TEST_COMPARE (ns_initparse (packet, packetlen, &msg), 0); + ns_rr rr; + TEST_COMPARE (ns_parserr (&msg, ns_s_an, 0, &rr), 0); + + /* Try sizes up to this limit. Go a bit beyond the expected size to + check for errors. */ + size_t max_result_size = strlen (expected) + 16; + + bool success = false; + for (size_t result_size = 1; result_size <= max_result_size; ++result_size) + { + char *result_start = ntf_out.buffer + ntf_out.length - result_size; + memset (result_start, 'X', result_size); + + /* ns_sprintrr was deprecated in 2.34. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); + int ret = ns_sprintrr (&msg, &rr, NULL, NULL, result_start, result_size); + DIAG_POP_NEEDS_COMMENT; + + if (ret > 0) + { + TEST_COMPARE_STRING (result_start, expected); + TEST_COMPARE (ret, strlen (expected)); + success = true; + } + else + { + TEST_VERIFY (!success); + TEST_COMPARE (ret, -1); + } + } + TEST_VERIFY (success); + + /* Test with truncated RDATA. */ + for (size_t rdata_size = 0; rdata_size <= rdatalen; ++rdata_size) + { + size_t truncated_packet_size = packetlen - rdatalen + rdata_size; + unsigned char *packet_start + = ((unsigned char *) ntf_in.buffer + ntf_in.length + - truncated_packet_size); + memcpy (packet_start, packet, truncated_packet_size); + /* Patch in the updated RDATA length field. */ + uint16_t new_rdatalen = htons (rdata_size); + memcpy (packet_start + truncated_packet_size - rdata_size - 2, + &new_rdatalen, 2); + + ns_msg msg; + TEST_COMPARE (ns_initparse (packet_start, truncated_packet_size, &msg), + 0); + ns_rr rr; + TEST_COMPARE (ns_parserr (&msg, ns_s_an, 0, &rr), 0); + + size_t result_size = strlen (expected) + 1; + char *result_start = ntf_out.buffer + ntf_out.length - result_size; + memset (result_start, 'X', result_size); + + /* ns_sprintrr was deprecated in 2.34. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); + int ret = ns_sprintrr (&msg, &rr, NULL, NULL, result_start, result_size); + DIAG_POP_NEEDS_COMMENT; + + /* This flag indicates whether the output is syntactically + correct. In some cases, truncation may still yield a valid + payload. */ + bool broken = rdata_size < rdatalen; + switch (rtype) + { + case ns_t_wks: + /* WKS records use all trailing bytes for the port bitmap. */ + broken = rdata_size < 5; + break; + case ns_t_nsap: + /* Uses all bytes that are available. */ + broken = false; + break; + case ns_t_txt: + /* Truncation produces a valid payload if it occurs right + after a complete string in the TXT payload. */ + broken = false; + for (size_t pos = 0; pos < rdata_size; ) + { + unsigned int slen = rdata[pos] & 0xff; + if (pos + 1 + slen > rdata_size) + { + broken = true; + break; + } + pos += 1 + slen; + } + break; + case ns_t_isdn: + /* The second field is optional. If it is present, it must + not be truncated. */ + broken = rdata_size < 6 || (rdata_size > 6 && rdata_size < rdatalen); + break; + case ns_t_a6: + /* The first A6 subtest contains a trailing domain name, + which is ignored and not formatted. */ + if (rdata_size > 0 && rdata[0] == 0) + broken = rdata_size < 17; + break; + case ns_t_cert: + case ns_t_tkey: + case ns_t_tsig: + /* Only generic printing, which does not validate anything. */ + broken = false; + break; + } + + if (broken) + { + if (strstr (result_start, "RR format error") != NULL) + /* No further checks if an error indicator has been added + to the output. */ + ; + else + TEST_COMPARE (ret, -1); + } + else + TEST_VERIFY (ret > 0); + } +} + +static int +do_test (void) +{ + ntf_in = support_next_to_fault_allocate (512); + ntf_out = support_next_to_fault_allocate (256); + +#define T(rtype, rdata, expected) \ + test_one_record (rtype, rdata, sizeof (rdata) - 1, expected) + T (ns_t_a, "\xc0\0\2\1", "www.example.org.\t1D IN A\t\t192.0.2.1"); + T (ns_t_cname, "\4www1\4prod\xc0\x10", + "www.example.org.\t1D IN CNAME\twww1.prod.example.org."); + T (ns_t_hinfo, "\5first\6second", + "www.example.org.\t1D IN HINFO\t\"first\" \"second\""); + T (ns_t_isdn, "\5first\6second", + "www.example.org.\t1D IN ISDN\t\"first\" \"second\""); + /* Bug: Extra space at the end in the text representation of ISDN RRs. */ + T (ns_t_isdn, "\5first", "www.example.org.\t1D IN ISDN\t\"first\" "); + T (ns_t_soa, + "\2ns\xc0\x10\12hostmaster\xc0\x10" + "\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5", + "www.example.org.\t1D IN SOA\tns.example.org. hostmaster.example.org. (\n" + "\t\t\t\t\t1\t\t; serial\n" + "\t\t\t\t\t2S\t\t; refresh\n" + "\t\t\t\t\t3S\t\t; retry\n" + "\t\t\t\t\t4S\t\t; expiry\n" + "\t\t\t\t\t5S )\t\t; minimum\n"); + T (ns_t_mx, "\0\xa\2mx\xc0\x10", + "www.example.org.\t1D IN MX\t10 mx.example.org."); + T (ns_t_px, "\0\xa\3px1\xc0\x10\3px2\xc0\x10", + "www.example.org.\t1D IN PX\t10 px1.example.org. px2.example.org."); + T (ns_t_x25, "\4X.25", + "www.example.org.\t1D IN X25\t\"X.25\""); + T (ns_t_txt, "\1A\2BC\3DEF", + "www.example.org.\t1D IN TXT\t\"A\" \"BC\" \"DEF\""); + T (ns_t_nsap, "", + "www.example.org.\t1D IN NSAP\t"); + T (ns_t_nsap, "\1", + "www.example.org.\t1D IN NSAP\t01"); + T (ns_t_nsap, "\1\2", + "www.example.org.\t1D IN NSAP\t01.02"); + T (ns_t_nsap, "\1\2\3", + "www.example.org.\t1D IN NSAP\t01.0203"); + T (ns_t_nsap, "\1\2\3\4", + "www.example.org.\t1D IN NSAP\t01.0203.04"); + T (ns_t_nsap, + "\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32" + "\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61" + "\62\63\64\65\66\67\70\71\72\73\74\75\76\77\100\101\102\103\104\105\106" + "\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127" + "\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150" + "\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171" + "\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212" + "\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233" + "\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254" + "\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275" + "\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316" + "\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" + "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360" + "\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377", + "www.example.org.\t1D IN NSAP\t" + "01.0203.0405.0607.0809.0A0B.0C0D.0E0F.1011.1213.1415.1617.1819.1A1B" + ".1C1D.1E1F.2021.2223.2425.2627.2829.2A2B.2C2D.2E2F.3031.3233.3435.3637" + ".3839.3A3B.3C3D.3E3F.4041.4243.4445.4647.4849.4A4B.4C4D.4E4F.5051.5253" + ".5455.5657.5859.5A5B.5C5D.5E5F.6061.6263.6465.6667.6869.6A6B.6C6D.6E6F" + ".7071.7273.7475.7677.7879.7A7B.7C7D.7E7F.8081.8283.8485.8687.8889.8A8B" + ".8C8D.8E8F.9091.9293.9495.9697.9899.9A9B.9C9D.9E9F.A0A1.A2A3.A4A5.A6A7" + ".A8A9.AAAB.ACAD.AEAF.B0B1.B2B3.B4B5.B6B7.B8B9.BABB.BCBD.BEBF.C0C1.C2C3" + ".C4C5.C6C7.C8C9.CACB.CCCD.CECF.D0D1.D2D3.D4D5.D6D7.D8D9.DADB.DCDD.DEDF" + ".E0E1.E2E3.E4E5.E6E7.E8E9.EAEB.ECED.EEEF.F0F1.F2F3.F4F5.F6F7.F8F9.FAFB" + ".FCFD.FEFF"); + T (ns_t_aaaa, "\x20\x01\x0d\xb8\0\0\0\0\0\0\0\0\0\0\x12\x34", + "www.example.org.\t1D IN AAAA\t2001:db8::1234"); + /* Example from RFC 1876. The loc_ntoa format is different from the + official text representation. */ + T (ns_t_loc, + "\000\063\026\023\211\027\055\320\160\276\025\360\000\230\215\040", + "www.example.org.\t1D IN LOC" + "\t42 21 54.000 N 71 06 18.000 W -24.00m 30.00m 10000.00m 10.00m"); + T (ns_t_naptr, + "\0\1\0\2\5flags\7service\2.*\5naptr\xc0\x10", + "www.example.org.\t1D IN NAPTR\t1 2 \"flags\" \"service\" \".*\"" + " naptr.example.org."); + T (ns_t_srv, + "\0\1\0\2\0\x50\4www1\xc0\x10", + "www.example.org.\t1D IN SRV\t1 2 80 www1.example.org."); + T (ns_t_rp, "\3rp1\xc0\x10\3rp2\xc0\x10", + "www.example.org.\t1D IN RP\trp1.example.org. rp2.example.org."); + T (ns_t_wks, "\xc0\0\2\1\6\0\0\0\0\0\0\0\0\0\0\200", + "www.example.org.\t1D IN WKS\t192.0.2.1 6 ( \n\t\t\t\t80 )"); + T (ns_t_cert, "\0\1\x04\xd2\0blob", + "www.example.org.\t1D IN CERT\t\\# 9 (\n" + "\t00 01 04 d2 00 62 6c 6f 62 )\t\t\t; .....blob"); + T (ns_t_tkey, "\4algo\0\0\0\0\1\0\0\0\2\0\3\0\4" + "\0\5\xa1\xa2\xa3\xa4\xa5\0\3\xb1\xb2\xb3", + "www.example.org.\t1D IN TYPE249\t\\# 30 (\n" + "\t04 61 6c 67 6f 00 00 00 00 01 00 00 00 02 00 03 ; .algo...........\n" + "\t00 04 00 05 a1 a2 a3 a4 a5 00 03 b1 b2 b3 )\t; .............."); + T (ns_t_tsig, "\4algo\0" + "\0\20\xdd\xcd\x64\x10\xe9\x21\x34\x1a\x8e\xe0\xa1\x9a\x30\xfc\x3b\xd1" + "\0\2\0\3\0\5other", + "www.example.org.\t1D IN TSIG\t\\# 35 (\n" + "\t04 61 6c 67 6f 00 00 10 dd cd 64 10 e9 21 34 1a ; .algo.....d..!4.\n" + "\t8e e0 a1 9a 30 fc 3b d1 00 02 00 03 00 05 6f 74 ; ....0.;.......ot\n" + "\t68 65 72 )\t\t\t\t\t; her"); + T (ns_t_a6, + "\0\x20\x01\x0d\xb8\0\0\0\0\0\0\0\0\0\0\x12\x34\6prefix\xc0\x10", + "www.example.org.\t1D IN A6\t0 2001:db8::1234"); + T (ns_t_a6, + "\0\x20\x01\x0d\xb8\0\0\0\0\0\0\0\0\0\0\x12\x35", + "www.example.org.\t1D IN A6\t0 2001:db8::1235"); + T (ns_t_a6, "\200\6prefix\xc0\x10", + "www.example.org.\t1D IN A6\t128 prefix.example.org."); + T (ns_t_a6, "\x20\0\0\0\0\0\0\0\0\0\0\x12\x36\6prefix\xc0\x10", + "www.example.org.\t1D IN A6\t32 ::1236 prefix.example.org."); +#undef T + + support_next_to_fault_free (&ntf_in); + support_next_to_fault_free (&ntf_out); + return 0; +} + +#include commit dae425b554207f7c4599c7fac707ad4c08545674 Author: Adhemerval Zanella Date: Tue Apr 14 10:50:37 2026 -0300 posix: Fix stack overflow in wordexp tilde expansion (BZ 34091, CVE-2026-6791) The parse_tilde function previously used strndupa to allocate memory for the parsed username on the stack, and since the input is user-defined, this can lead to a stack overflow. This patch fixes the issue by replacing strndupa with scratch_buffer, by reusing the buffer used in the __getpwnam_r call. The new “tst-wordexp-tilde.c” test is a test-container to avoid using system-defined NSS modules. Checked on x86_64-linux-gnu and i686-linux-gnu. (cherry picked from commit 07c24f35392b727e6100d33edfdf811a6c68c218) diff --git a/posix/Makefile b/posix/Makefile index f377948462..b6fb54364a 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -357,6 +357,7 @@ tests-internal := \ tests-container := \ bug-ga2 \ tst-vfork3 \ + tst-wordexp-tilde \ # tests-container tests-time64 := \ diff --git a/posix/tst-wordexp-tilde.c b/posix/tst-wordexp-tilde.c new file mode 100644 index 0000000000..1661603681 --- /dev/null +++ b/posix/tst-wordexp-tilde.c @@ -0,0 +1,244 @@ +/* Test wordexp tilde expansion with large usernames (BZ 34091). + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +typedef void (*func_callback_t)(void); + +static void +subprocess_small_stack (void *closure) +{ + struct rlimit rl; + TEST_COMPARE (getrlimit (RLIMIT_STACK, &rl), 0); + rl.rlim_cur = 512 * 1024; + TEST_COMPARE (setrlimit (RLIMIT_STACK, &rl), 0); + + func_callback_t func_test = closure; + func_test (); +} + +/* Build a string "~/tail" where is LEN bytes of the + character CH. The caller must free the result. */ +static char * +make_tilde_input (char ch, size_t len, const char *tail) +{ + /* ~ + len + / + tail + \0 */ + size_t taillen = tail != NULL ? strlen (tail) : 0; + size_t total = 1 + len + 1 + taillen + 1; + char *buf = xmalloc (total); + buf[0] = '~'; + memset (buf + 1, ch, len); + buf[1 + len] = '/'; + if (tail != NULL) + memcpy (buf + 1 + len + 1, tail, taillen); + buf[total - 1] = '\0'; + return buf; +} + +/* Test 1: A very long username must not crash. The username will not match + any real user, so wordexp returns ~/rest. */ +static void +test_long_username (void) +{ + printf ("info: test_long_username_no_crash\n"); + + static const char REST[] = "rest"; + + /* 1 MiB username — well beyond any reasonable stack frame. */ + const size_t long_len = 1024 * 1024; + char *input = make_tilde_input ('A', long_len, REST); + + wordexp_t we = { 0 }; + int ret = wordexp (input, &we, 0); + /* The (non-existent) username is invalid, so wordexp falls back to + literal output: ~AAA…/rest. */ + TEST_COMPARE (ret, 0); + TEST_COMPARE (we.we_wordc, 1); + + /* Verify prefix: '~' followed by long_len 'A's. */ + const char *result = we.we_wordv[0]; + TEST_COMPARE (result[0], '~'); + TEST_COMPARE (strlen (result), + 1 /* ~ */ + long_len + sizeof (REST)); + for (size_t j = 1; j <= long_len; j++) + if (result[j] != 'A') + { + printf (" mismatch at position %zu: expected 'A', got '%c'\n", + j, result[j]); + support_record_failure (); + break; + } + /* Verify the tail after the username. */ + TEST_COMPARE_STRING (result + 1 + long_len, "/rest"); + + wordfree (&we); + free (input); +} + +/* Test 2: A username that just exceeds the default scratch_buffer inline + size (1024 bytes) exercises the scratch_buffer_set_array_size growth path + without being excessively large. */ +static void +test_scratch_buffer_growth (void) +{ + printf ("info: test_scratch_buffer_growth\n"); + + const size_t len = 2048; + char *input = make_tilde_input ('x', len, NULL); + + wordexp_t we = { 0 }; + int ret = wordexp (input, &we, 0); + TEST_COMPARE (ret, 0); + TEST_COMPARE (we.we_wordc, 1); + + /* ~xxx…/ — the trailing slash makes a separate empty component, but + wordexp merges it into the single token ~xxx…/. */ + const char *result = we.we_wordv[0]; + TEST_COMPARE (result[0], '~'); + for (size_t j = 1; j <= len; j++) + if (result[j] != 'x') + { + printf (" mismatch at position %zu\n", j); + support_record_failure (); + break; + } + TEST_COMPARE (result[1 + len], '/'); + + wordfree (&we); + free (input); +} + +/* Test 3: ~root still resolves to the correct home directory through the + __getpwnam_r path. */ +static void +test_known_user (void) +{ + printf ("info: test_known_user\n"); + + /* Look up root's home directory for comparison. */ + struct passwd *pw = getpwnam ("root"); + if (pw == NULL || pw->pw_dir == NULL) + { + printf (" SKIP: cannot look up root\n"); + return; + } + + char *expected = xasprintf ("%s/file", pw->pw_dir); + + wordexp_t we = { 0 }; + TEST_COMPARE (wordexp ("~root/file", &we, 0), 0); + TEST_COMPARE (we.we_wordc, 1); + TEST_COMPARE_STRING (we.we_wordv[0], expected); + + wordfree (&we); + free (expected); +} + +/* Test 4: Bare tilde expands to $HOME. */ +static void +test_bare_tilde (void) +{ + printf ("info: test_bare_tilde\n"); + + const char *home = getenv ("HOME"); + if (home == NULL) + { + printf (" SKIP: HOME is not set\n"); + return; + } + + wordexp_t we = { 0 }; + TEST_COMPARE (wordexp ("~", &we, 0), 0); + TEST_COMPARE (we.we_wordc, 1); + TEST_COMPARE_STRING (we.we_wordv[0], home); + + wordfree (&we); +} + +/* Test 5: Short non-existent username falls back to literal ~username output, + exercising the invalid-login-name path. */ +static void +test_unknown_user (void) +{ + printf ("info: test_unknown_user\n"); + + /* Pick a username that is extremely unlikely to exist. */ + wordexp_t we = { 0 }; + TEST_COMPARE (wordexp ("~no_such_user_xyzzy42", &we, 0), 0); + TEST_COMPARE (we.we_wordc, 1); + TEST_COMPARE_STRING (we.we_wordv[0], "~no_such_user_xyzzy42"); + + wordfree (&we); +} + +/* Test 6: Tilde with username and WRDE_APPEND — exercises parse_tilde's + interaction with the WRDE_APPEND word list. */ +static void +test_tilde_with_append (void) +{ + printf ("info: test_tilde_with_append\n"); + + const char *home = getenv ("HOME"); + if (home == NULL) + { + printf (" SKIP: HOME is not set\n"); + return; + } + + wordexp_t we = { 0 }; + TEST_COMPARE (wordexp ("first", &we, 0), 0); + + TEST_COMPARE (wordexp ("~/path", &we, WRDE_APPEND), 0); + TEST_COMPARE (we.we_wordc, 2); + TEST_COMPARE_STRING (we.we_wordv[0], "first"); + + char *expected = xasprintf ("%s/path", home); + TEST_COMPARE_STRING (we.we_wordv[1], expected); + + wordfree (&we); + free (expected); +} + +static int +do_test (void) +{ + test_known_user (); + test_bare_tilde (); + test_unknown_user (); + test_tilde_with_append (); + + support_isolate_in_subprocess (subprocess_small_stack, + test_long_username); + + support_isolate_in_subprocess (subprocess_small_stack, + test_scratch_buffer_growth); + + return 0; +} + +#include diff --git a/posix/tst-wordexp-tilde.root/etc/group b/posix/tst-wordexp-tilde.root/etc/group new file mode 100644 index 0000000000..1dbf9013ee --- /dev/null +++ b/posix/tst-wordexp-tilde.root/etc/group @@ -0,0 +1 @@ +root:x:0: diff --git a/posix/tst-wordexp-tilde.root/etc/nsswitch.conf b/posix/tst-wordexp-tilde.root/etc/nsswitch.conf new file mode 100644 index 0000000000..098a8d5938 --- /dev/null +++ b/posix/tst-wordexp-tilde.root/etc/nsswitch.conf @@ -0,0 +1,3 @@ +passwd: files +group: files +shadow: files diff --git a/posix/tst-wordexp-tilde.root/etc/passwd b/posix/tst-wordexp-tilde.root/etc/passwd new file mode 100644 index 0000000000..eb85a552ad --- /dev/null +++ b/posix/tst-wordexp-tilde.root/etc/passwd @@ -0,0 +1 @@ +root:x:0:0:root:/root:/bin/sh diff --git a/posix/wordexp.c b/posix/wordexp.c index 4a8541add4..f0f69ee85d 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -335,17 +335,29 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length, else { /* Look up user name in database to get home directory */ - char *user = strndupa (&words[1 + *offset], i - (1 + *offset)); - struct passwd pwd, *tpwd; - int result; + size_t userlen = i - (1 + *offset); + /* tmpbuf contains both the user and the __getpwnam_r working area. */ struct scratch_buffer tmpbuf; scratch_buffer_init (&tmpbuf); + if (!scratch_buffer_set_array_size (&tmpbuf, userlen + 1, 1)) + return WRDE_NOSPACE; + char *user = tmpbuf.data; + memcpy (user, &words[1 + *offset], userlen); + user[userlen] = '\0'; - while ((result = __getpwnam_r (user, &pwd, tmpbuf.data, tmpbuf.length, + struct passwd pwd, *tpwd; + int result; + while ((result = __getpwnam_r (user, + &pwd, + tmpbuf.data + userlen + 1, + tmpbuf.length - userlen - 1, &tpwd)) != 0 && errno == ERANGE) - if (!scratch_buffer_grow (&tmpbuf)) - return WRDE_NOSPACE; + { + if (!scratch_buffer_grow_preserve (&tmpbuf)) + return WRDE_NOSPACE; + user = tmpbuf.data; + } if (result == 0 && tpwd != NULL && pwd.pw_dir) *word = w_addstr (*word, word_length, max_length, pwd.pw_dir); commit 1c9988e52540c844928c6d93ff45305adc2c24a0 Author: Fabian Rast Date: Thu Jun 11 14:30:37 2026 +0200 rtld: cache cpuid results on the stack for intel dl_init_cacheinfo retrieves various information about cache sizes, using the cpuid instruction on x86. Previously, the same cpuid leaves were queried multiple times. This behavior caused intel_check_word to prominently show up in profiles of dynamic loader startup on the Intel(R) Xeon(R) Gold 6430. The big performance impact could not be reproduced on other Intel cpus. This patch reduces the number of cpuid queries on startup by caching their results on the stack for reuse when searching for a different cache size value. This approach does not change the overall design of the cache enumeration code (repeated calls to handle_* functions). The values are cached on the stack instead of globally (e.g. in the cpu_features global) because they are never needed after early initialization. The cache is only active for Intel cpus, because it has not yet been shown through benchmarks that it meaningfully improves performance for other processors. Signed-off-by: Fabian Rast Reviewed-by: Sunil K Pandey (cherry picked from commit df83fa8813eb53dcb232462a4f6dd00c873115f0) diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h index 184e0a8f32..f329b448dc 100644 --- a/sysdeps/x86/dl-cacheinfo.h +++ b/sysdeps/x86/dl-cacheinfo.h @@ -108,6 +108,15 @@ static const struct intel_02_cache_info #define nintel_02_known (sizeof (intel_02_known) / sizeof (intel_02_known [0])) +/* Cache for redundant cpuid queries in handle_intel, intel_check_word and + get_common_cache_info. Currently, this has only been shown to significantly + improve performance on a specific Intel CPU (Xeon 6430). */ +struct intel_cpuid_cache +{ + unsigned char leaf2_valid, leaf4_valid; /* Number of cached (sub)leaves. */ + unsigned int leaf2[4], leaf4[0x10][4]; +}; + static int intel_02_known_compare (const void *p1, const void *p2) { @@ -128,7 +137,8 @@ static long int __attribute__ ((noinline)) intel_check_word (int name, unsigned int value, bool *has_level_2, bool *no_level_2_or_3, - const struct cpu_features *cpu_features) + const struct cpu_features *cpu_features, + struct intel_cpuid_cache *cache) { if ((value & 0x80000000) != 0) /* The register value is reserved. */ @@ -162,7 +172,21 @@ intel_check_word (int name, unsigned int value, bool *has_level_2, unsigned int round = 0; while (1) { - __cpuid_count (4, round, eax, ebx, ecx, edx); + if (round < cache->leaf4_valid) + /* Subleaf was queried before. Do not execute cpuid again. */ + eax = cache->leaf4[round][0], ebx = cache->leaf4[round][1], + ecx = cache->leaf4[round][2], edx = cache->leaf4[round][3]; + else if (round == cache->leaf4_valid + && round < sizeof(cache->leaf4)/sizeof(*cache->leaf4)) + { + /* Cache the cpuid result if we have space. */ + __cpuid_count (4, round, eax, ebx, ecx, edx); + cache->leaf4[round][0] = eax, cache->leaf4[round][1] = ebx; + cache->leaf4[round][2] = ecx, cache->leaf4[round][3] = edx; + cache->leaf4_valid++; + } + else + __cpuid_count (4, round, eax, ebx, ecx, edx); enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f; if (type == null) @@ -258,7 +282,8 @@ intel_check_word (int name, unsigned int value, bool *has_level_2, static long int __attribute__ ((noinline)) -handle_intel (int name, const struct cpu_features *cpu_features) +handle_intel (int name, const struct cpu_features *cpu_features, + struct intel_cpuid_cache *cache) { unsigned int maxidx = cpu_features->basic.max_cpuid; @@ -271,41 +296,33 @@ handle_intel (int name, const struct cpu_features *cpu_features) long int result = 0; bool no_level_2_or_3 = false; bool has_level_2 = false; - unsigned int eax; - unsigned int ebx; - unsigned int ecx; - unsigned int edx; - __cpuid (2, eax, ebx, ecx, edx); + int i; + + if (!cache->leaf2_valid) + { + __cpuid (2, cache->leaf2[0], cache->leaf2[1], + cache->leaf2[2], cache->leaf2[3]); + cache->leaf2_valid = 1; + } /* The low byte of EAX of CPUID leaf 2 should always return 1 and it should be ignored. If it isn't 1, use CPUID leaf 4 instead. */ - if ((eax & 0xff) != 1) + if ((cache->leaf2[0] & 0xff) != 1) return intel_check_word (name, 0xff, &has_level_2, &no_level_2_or_3, - cpu_features); - else - { - eax &= 0xffffff00; - - /* Process the individual registers' value. */ - result = intel_check_word (name, eax, &has_level_2, - &no_level_2_or_3, cpu_features); - if (result != 0) - return result; + cpu_features, cache); - result = intel_check_word (name, ebx, &has_level_2, - &no_level_2_or_3, cpu_features); - if (result != 0) - return result; - - result = intel_check_word (name, ecx, &has_level_2, - &no_level_2_or_3, cpu_features); - if (result != 0) - return result; + /* Process all descriptors in leaf 2. */ + result = intel_check_word (name, cache->leaf2[0]&0xffffff00, &has_level_2, + &no_level_2_or_3, cpu_features, cache); + if (result != 0) + return result; - result = intel_check_word (name, edx, &has_level_2, - &no_level_2_or_3, cpu_features); + for (i = 1; i < 4; i++) + { + result = intel_check_word (name, cache->leaf2[i], &has_level_2, + &no_level_2_or_3, cpu_features, cache); if (result != 0) - return result; + return result; } if (name >= _SC_LEVEL2_CACHE_SIZE && name <= _SC_LEVEL3_CACHE_LINESIZE @@ -622,7 +639,7 @@ handle_hygon (int name) static void get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, unsigned int *threads_ptr, - long int core) + long int core, struct intel_cpuid_cache *cache) { unsigned int eax; unsigned int ebx; @@ -680,7 +697,14 @@ get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, u int check = 0x1 | (threads_l3 == 0) << 1; do { - __cpuid_count (4, i++, eax, ebx, ecx, edx); + if (cache != NULL && i < cache->leaf4_valid) + eax = cache->leaf4[i][0], ebx = cache->leaf4[i][1], + ecx = cache->leaf4[i][2], edx = cache->leaf4[i][3]; + else + /* Do not attempt to cache queries at this point, + because get_common_cache_info is called last. */ + __cpuid_count (4, i, eax, ebx, ecx, edx); + i++; /* There seems to be a bug in at least some Pentium Ds which sometimes fail to iterate all cache parameters. @@ -860,35 +884,38 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) if (cpu_features->basic.kind == arch_kind_intel) { - data = handle_intel (_SC_LEVEL1_DCACHE_SIZE, cpu_features); - shared = handle_intel (_SC_LEVEL3_CACHE_SIZE, cpu_features); + struct intel_cpuid_cache cache; + cache.leaf2_valid = cache.leaf4_valid = 0; + + data = handle_intel (_SC_LEVEL1_DCACHE_SIZE, cpu_features, &cache); + shared = handle_intel (_SC_LEVEL3_CACHE_SIZE, cpu_features, &cache); shared_per_thread = shared; level1_icache_size - = handle_intel (_SC_LEVEL1_ICACHE_SIZE, cpu_features); + = handle_intel (_SC_LEVEL1_ICACHE_SIZE, cpu_features, &cache); level1_icache_linesize - = handle_intel (_SC_LEVEL1_ICACHE_LINESIZE, cpu_features); + = handle_intel (_SC_LEVEL1_ICACHE_LINESIZE, cpu_features, &cache); level1_dcache_size = data; level1_dcache_assoc - = handle_intel (_SC_LEVEL1_DCACHE_ASSOC, cpu_features); + = handle_intel (_SC_LEVEL1_DCACHE_ASSOC, cpu_features, &cache); level1_dcache_linesize - = handle_intel (_SC_LEVEL1_DCACHE_LINESIZE, cpu_features); + = handle_intel (_SC_LEVEL1_DCACHE_LINESIZE, cpu_features, &cache); level2_cache_size - = handle_intel (_SC_LEVEL2_CACHE_SIZE, cpu_features); + = handle_intel (_SC_LEVEL2_CACHE_SIZE, cpu_features, &cache); level2_cache_assoc - = handle_intel (_SC_LEVEL2_CACHE_ASSOC, cpu_features); + = handle_intel (_SC_LEVEL2_CACHE_ASSOC, cpu_features, &cache); level2_cache_linesize - = handle_intel (_SC_LEVEL2_CACHE_LINESIZE, cpu_features); + = handle_intel (_SC_LEVEL2_CACHE_LINESIZE, cpu_features, &cache); level3_cache_size = shared; level3_cache_assoc - = handle_intel (_SC_LEVEL3_CACHE_ASSOC, cpu_features); + = handle_intel (_SC_LEVEL3_CACHE_ASSOC, cpu_features, &cache); level3_cache_linesize - = handle_intel (_SC_LEVEL3_CACHE_LINESIZE, cpu_features); + = handle_intel (_SC_LEVEL3_CACHE_LINESIZE, cpu_features, &cache); level4_cache_size - = handle_intel (_SC_LEVEL4_CACHE_SIZE, cpu_features); + = handle_intel (_SC_LEVEL4_CACHE_SIZE, cpu_features, &cache); get_common_cache_info (&shared, &shared_per_thread, &threads, - level2_cache_size); + level2_cache_size, &cache); } else if (cpu_features->basic.kind == arch_kind_zhaoxin) { @@ -909,7 +936,7 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) level3_cache_linesize = handle_zhaoxin (_SC_LEVEL3_CACHE_LINESIZE); get_common_cache_info (&shared, &shared_per_thread, &threads, - level2_cache_size); + level2_cache_size, NULL); } else if (cpu_features->basic.kind == arch_kind_amd) {