diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2023-01-12 05:29:55 +0000 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2023-04-01 21:19:59 -0500 |
commit | 0c5716b886f2a251f506ffbf3799a3f9199b2592 (patch) | |
tree | 19bdf12574cec322677790c3b133493b1d44e258 /system/musl | |
parent | 071aa41ad77f1e9fdb297423d1bdbe133d78b563 (diff) | |
download | packages-0c5716b886f2a251f506ffbf3799a3f9199b2592.tar.gz packages-0c5716b886f2a251f506ffbf3799a3f9199b2592.tar.bz2 packages-0c5716b886f2a251f506ffbf3799a3f9199b2592.tar.xz packages-0c5716b886f2a251f506ffbf3799a3f9199b2592.zip |
system/musl: Fix wchar_t issue
Diffstat (limited to 'system/musl')
-rw-r--r-- | system/musl/APKBUILD | 4 | ||||
-rw-r--r-- | system/musl/signed-wchar_t-fixes.patch | 77 |
2 files changed, 80 insertions, 1 deletions
diff --git a/system/musl/APKBUILD b/system/musl/APKBUILD index ab12e0196..9816d009e 100644 --- a/system/musl/APKBUILD +++ b/system/musl/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: A. Wilcox <awilfox@adelielinux.org> pkgname=musl pkgver=1.2.3 -pkgrel=0 +pkgrel=1 pkgdesc="System library (libc) implementation" url="https://www.musl-libc.org/" arch="all" @@ -27,6 +27,7 @@ source="https://musl.libc.org/releases/musl-${pkgver}.tar.gz handle-aux-at_base.patch fgetspent_r.patch realpath.patch + signed-wchar_t-fixes.patch ldconfig getent.c @@ -125,6 +126,7 @@ f7b05d8c5f804ba3ad6998b3de5fa4d9dfceac4aca63dd67298c2d5f27cdd28a91eba74f6e428c25 1f4e9aea5a546015c75f77aa0dec10d56fc14831ccc15cf71ff27fc15ac5230ffeadb382ebe1c87c1ea07a462620e16ed01cd36252d997d1a9c2af11cb5c9ff3 handle-aux-at_base.patch ded41235148930f8cf781538f7d63ecb0c65ea4e8ce792565f3649ee2523592a76b2a166785f0b145fc79f5852fd1fb1729a7a09110b3b8f85cba3912e790807 fgetspent_r.patch d5ec3f1a86f2194e0af83c2391508811b939d0f8f2fd2ac5ac7f03774f8a250ce42399110d2ae04d32b864ee292863fed683a029b64598dbbcb21d9811a825d0 realpath.patch +3770af3bc961e5d5b8c152c428cd20dc54e026b23b31d764fbc2e71ee38140d160db2267755f23800bc8586fd4b51554b1caebb2415bef82fd0f4a6dd8bf640d signed-wchar_t-fixes.patch cb71d29a87f334c75ecbc911becde7be825ab30d8f39fa6d64cb53812a7c9abaf91d9804c72540e5be3ddd3c84cfe7fd9632274309005cb8bcdf9a9b09b4b923 ldconfig 378d70e65bcc65bb4e1415354cecfa54b0c1146dfb24474b69e418cdbf7ad730472cd09f6f103e1c99ba6c324c9560bccdf287f5889bbc3ef0bdf0e08da47413 getent.c 9d42d66fb1facce2b85dad919be5be819ee290bd26ca2db00982b2f8e055a0196290a008711cbe2b18ec9eee8d2270e3b3a4692c5a1b807013baa5c2b70a2bbf iconv.c" diff --git a/system/musl/signed-wchar_t-fixes.patch b/system/musl/signed-wchar_t-fixes.patch new file mode 100644 index 000000000..0d5309315 --- /dev/null +++ b/system/musl/signed-wchar_t-fixes.patch @@ -0,0 +1,77 @@ +From 99b84a793669c69acc705a61d339441b50bd09a8 Mon Sep 17 00:00:00 2001
+From: Gabriel Ravier <gabravier@gmail.com>
+Date: Wed, 4 Jan 2023 16:07:19 +0100
+Subject: [PATCH] fix return value of wcs{,n}cmp for near-limits signed wchar_t values
+
+The standard states that:
+
+ > Unless explicitly stated otherwise, the functions described in
+ this subclause order two wide characters the same way as two
+ integers of the underlying integer type designated by `wchar_t`.
+ > [...]
+ > The `wcscmp` function returns an integer greater than, equal to,
+ or less than zero, accordingly as the wide string pointed to by s1
+ is greater than, equal to, or less than the wide string pointed to
+ by s2.
+ > The `wcsncmp` function returns an integer greater than, equal to,
+ or less than zero, accordingly as the possibly null-terminated
+ array pointed to by s1 is greater than, equal to, or less than the
+ possibly null-terminated array pointed to by s2
+ - N3047 (latest C draft as of the time of writing)
+
+Yet a simple test program such as this:
+
+ #include <wchar.h>
+ #include <stdio.h>
+
+ int main()
+ {
+ wchar_t str1[2] = { WCHAR_MAX, L'\0' };
+ wchar_t str2[2] = { WCHAR_MIN, L'\0' };
+
+ printf("%d\n", wcscmp(str1, str2));
+ printf("%d\n", wcsncmp(str1, str2, 1));
+ }
+
+Will fail to run correctly according to this specification on musl (on
+targets that have signed wchar_t), as it will print -1 instead of
+1 (it should print 1, since WCHAR_MAX > WCHAR_MIN).
+
+This appears to be due to the fact that musl uses a simple subtraction
+to implement wcscmp and wcsncmp, which may result in an overflow.
+
+This patch fixes this by replacing the subtraction with a little bit
+of code that orders the characters correctly, returning -1 if the
+character from the first string is smaller than the one from the
+second, 0 if they are equal and 1 if the character from the first
+string is larger than the one from the second
+---
+ src/string/wcscmp.c | 2 +-
+ src/string/wcsncmp.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/string/wcscmp.c b/src/string/wcscmp.c
+index 26eeee70..286ec3ea 100644
+--- a/src/string/wcscmp.c
++++ b/src/string/wcscmp.c
+@@ -3,5 +3,5 @@
+ int wcscmp(const wchar_t *l, const wchar_t *r)
+ {
+ for (; *l==*r && *l && *r; l++, r++);
+- return *l - *r;
++ return *l < *r ? -1 : *l > *r;
+ }
+diff --git a/src/string/wcsncmp.c b/src/string/wcsncmp.c
+index 4ab32a92..2b3558bf 100644
+--- a/src/string/wcsncmp.c
++++ b/src/string/wcsncmp.c
+@@ -3,5 +3,5 @@
+ int wcsncmp(const wchar_t *l, const wchar_t *r, size_t n)
+ {
+ for (; n && *l==*r && *l && *r; n--, l++, r++);
+- return n ? *l - *r : 0;
++ return n ? (*l < *r ? -1 : *l > *r) : 0;
+ }
+--
+2.38.1
+
|