From 0c5716b886f2a251f506ffbf3799a3f9199b2592 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Thu, 12 Jan 2023 05:29:55 +0000 Subject: system/musl: Fix wchar_t issue --- system/musl/APKBUILD | 4 +- system/musl/signed-wchar_t-fixes.patch | 77 ++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 system/musl/signed-wchar_t-fixes.patch (limited to 'system/musl') 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 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 +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 + #include + + 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 + -- cgit v1.2.3-60-g2f50