diff --git a/package/libselinux/0003-Inject-matchpathcon_filespec_add64-if-defined-__INO_.patch b/package/libselinux/0003-Inject-matchpathcon_filespec_add64-if-defined-__INO_.patch new file mode 100644 index 0000000000..6573cb1673 --- /dev/null +++ b/package/libselinux/0003-Inject-matchpathcon_filespec_add64-if-defined-__INO_.patch @@ -0,0 +1,84 @@ +From daecc54878e6768b3e6a2b2a0061d2690a63dea4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= +Date: Thu, 20 Mar 2025 16:55:17 +0100 +Subject: [PATCH] Inject matchpathcon_filespec_add64() if + !defined(__INO_T_MATCHES_INO64_T) instead of using __BITS_PER_LONG < 64 as + proxy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The __INO_T_MATCHES_INO64_T is defined +if ino_t would be the same size as ino64_t +if -D_FILE_OFFSET_BITS=64 were not defined. + +This is /exactly/ what + /* ABI backwards-compatible shim for non-LFS 32-bit systems */ + #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && __BITS_PER_LONG < 64 +is trying to get at, but currently fails because x32/RV32 are "LFS" +with 32-bit longs and 64-bit time_ts natively. + +Thus, the + static_assert(sizeof(unsigned long) == sizeof(__ino_t), "inode size mismatch"); +assertion fails (__ino_t is the "kernel ino_t" type, +which generally corresponds to the kernel's ulong, which is u64 on x32). + +glibc headers allow us to check the condition we care about directly. + +Fixes: commit 9395cc0322 ("Always build for LFS mode on 32-bit archs.") +Closes: #463 +Closes: Debian#1098481 +Signed-off-by: наб +Cc: Alba Mendez +Acked-by: James Carter +Upstream: 5c3fcbd931b7f9752b5ce29cec3b6813991d61c0 +Signed-off-by: Thomas Petazzoni +--- + include/selinux/selinux.h | 2 +- + src/matchpathcon.c | 8 ++++++-- + 2 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/include/selinux/selinux.h b/include/selinux/selinux.h +index f3cf5a20..f64896b7 100644 +--- a/include/selinux/selinux.h ++++ b/include/selinux/selinux.h +@@ -537,7 +537,7 @@ extern int matchpathcon_index(const char *path, + with the same inode (e.g. due to multiple hard links). If so, then + use the latter of the two specifications based on their order in the + file contexts configuration. Return the used specification index. */ +-#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && __BITS_PER_LONG < 64 ++#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && !defined(__INO_T_MATCHES_INO64_T) + #define matchpathcon_filespec_add matchpathcon_filespec_add64 + #endif + extern int matchpathcon_filespec_add(ino_t ino, int specind, const char *file); +diff --git a/src/matchpathcon.c b/src/matchpathcon.c +index 51f0e4ff..a4f65045 100644 +--- a/src/matchpathcon.c ++++ b/src/matchpathcon.c +@@ -261,7 +261,7 @@ int matchpathcon_filespec_add(ino_t ino, int specind, const char *file) + return -1; + } + +-#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && __BITS_PER_LONG < 64 ++#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) && !defined(__INO_T_MATCHES_INO64_T) + /* alias defined in the public header but we undefine it here */ + #undef matchpathcon_filespec_add + +@@ -280,9 +280,13 @@ int matchpathcon_filespec_add(unsigned long ino, int specind, + { + return matchpathcon_filespec_add64(ino, specind, file); + } ++#elif (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) || defined(__INO_T_MATCHES_INO64_T) ++ ++static_assert(sizeof(uint64_t) == sizeof(ino_t), "inode size mismatch"); ++ + #else + +-static_assert(sizeof(unsigned long) == sizeof(ino_t), "inode size mismatch"); ++static_assert(sizeof(uint32_t) == sizeof(ino_t), "inode size mismatch"); + + #endif + +-- +2.51.0 + diff --git a/package/libselinux/0004-libselinux-be-careful-with-non-portable-LFS-macro.patch b/package/libselinux/0004-libselinux-be-careful-with-non-portable-LFS-macro.patch new file mode 100644 index 0000000000..9a1d874706 --- /dev/null +++ b/package/libselinux/0004-libselinux-be-careful-with-non-portable-LFS-macro.patch @@ -0,0 +1,56 @@ +From bfcdaf2ff36d69a57810470f5405e5f27e51e01c Mon Sep 17 00:00:00 2001 +From: Alyssa Ross +Date: Sat, 26 Apr 2025 17:13:57 +0200 +Subject: [PATCH] libselinux: be careful with non-portable LFS macro +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +musl does not provide the obsolete LFS64 APIs (like ino64_t) — ino_t +has always been 64-bit on all platforms there. That means there's +also no __INO_T_MATCHES_INO64_T macro, meaning the check would pass +and reach the static asserts for the shim, which would fail due to +there being no ino64_t to check the size of. Fix this by only +assuming the absense of __INO_T_MATCHES_INO64_t is meaningful when +another non-portable Glibc macro, __INO64_T_TYPE, is defined. If both +are missing, that probably just means there is no ino64_t. + +Fixes: 5c3fcbd9 ("Inject matchpathcon_filespec_add64() if !defined(__INO_T_MATCHES_INO64_T) instead of using __BITS_PER_LONG < 64 as proxy") +Signed-off-by: Alyssa Ross +Acked-by: James Carter +Upstream: 21dd00713ae99b13e36c632992cb171c6ec1abce +Signed-off-by: Thomas Petazzoni +--- + include/selinux/selinux.h | 2 +- + src/matchpathcon.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/include/selinux/selinux.h b/include/selinux/selinux.h +index f64896b7..b1431e5d 100644 +--- a/include/selinux/selinux.h ++++ b/include/selinux/selinux.h +@@ -537,7 +537,7 @@ extern int matchpathcon_index(const char *path, + with the same inode (e.g. due to multiple hard links). If so, then + use the latter of the two specifications based on their order in the + file contexts configuration. Return the used specification index. */ +-#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && !defined(__INO_T_MATCHES_INO64_T) ++#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(__INO64_T_TYPE) && !defined(__INO_T_MATCHES_INO64_T) + #define matchpathcon_filespec_add matchpathcon_filespec_add64 + #endif + extern int matchpathcon_filespec_add(ino_t ino, int specind, const char *file); +diff --git a/src/matchpathcon.c b/src/matchpathcon.c +index a4f65045..240c9fa7 100644 +--- a/src/matchpathcon.c ++++ b/src/matchpathcon.c +@@ -261,7 +261,7 @@ int matchpathcon_filespec_add(ino_t ino, int specind, const char *file) + return -1; + } + +-#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) && !defined(__INO_T_MATCHES_INO64_T) ++#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) && defined(__INO64_T_TYPE) && !defined(__INO_T_MATCHES_INO64_T) + /* alias defined in the public header but we undefine it here */ + #undef matchpathcon_filespec_add + +-- +2.51.0 +