diff --git a/gpkg/glibc/aarch64-arch-syscall.h.patch b/gpkg/glibc/aarch64-arch-syscall.h.patch index 0afa2501e..58e08d64f 100644 --- a/gpkg/glibc/aarch64-arch-syscall.h.patch +++ b/gpkg/glibc/aarch64-arch-syscall.h.patch @@ -32,14 +32,6 @@ #define __NR_get_mempolicy 236 #define __NR_get_robust_list 100 #define __NR_getcpu 168 -@@ -124,7 +119,6 @@ - #define __NR_lseek 62 - #define __NR_lsetxattr 6 - #define __NR_madvise 233 --#define __NR_mbind 235 - #define __NR_membarrier 283 - #define __NR_memfd_create 279 - #define __NR_memfd_secret 447 @@ -168,7 +162,6 @@ #define __NR_personality 92 #define __NR_pidfd_getfd 438 diff --git a/gpkg/glibc/arm-arch-syscall.h.patch b/gpkg/glibc/arm-arch-syscall.h.patch index f2261daa2..c1c828414 100644 --- a/gpkg/glibc/arm-arch-syscall.h.patch +++ b/gpkg/glibc/arm-arch-syscall.h.patch @@ -57,14 +57,6 @@ #define __NR_getpid 20 #define __NR_getppid 64 #define __NR_getpriority 96 -@@ -168,7 +158,6 @@ - #define __NR_lstat 107 - #define __NR_lstat64 196 - #define __NR_madvise 220 --#define __NR_mbind 319 - #define __NR_membarrier 389 - #define __NR_memfd_create 385 - #define __NR_migrate_pages 400 @@ -220,7 +209,6 @@ #define __NR_personality 136 #define __NR_pidfd_getfd 438 diff --git a/gpkg/glibc/build.sh b/gpkg/glibc/build.sh index 114bc457f..52eeb7039 100644 --- a/gpkg/glibc/build.sh +++ b/gpkg/glibc/build.sh @@ -3,7 +3,7 @@ TERMUX_PKG_DESCRIPTION="GNU C Library" TERMUX_PKG_LICENSE="GPL-3.0, LGPL-3.0" TERMUX_PKG_MAINTAINER="@termux-pacman" TERMUX_PKG_VERSION=2.38 -TERMUX_PKG_REVISION=10 +TERMUX_PKG_REVISION=11 TERMUX_PKG_SRCURL=https://ftp.gnu.org/gnu/libc/glibc-$TERMUX_PKG_VERSION.tar.xz TERMUX_PKG_SHA256=fb82998998b2b29965467bc1b69d152e9c307d2cf301c9eafb4555b770ef3fd2 TERMUX_PKG_DEPENDS="linux-api-headers-glibc" @@ -21,6 +21,8 @@ termux_step_pre_configure() { done rm ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/*/clone3.S + rm ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/*/syscall.S + rm ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/x86_64/configure* for i in android_passwd_group.h android_passwd_group.c android_system_user_ids.h; do cp ${TERMUX_PKG_BUILDER_DIR}/${i} ${TERMUX_PKG_SRCDIR}/nss/ diff --git a/gpkg/glibc/i386-arch-syscall.h.patch b/gpkg/glibc/i386-arch-syscall.h.patch index eb98cd5c0..3d108be19 100644 --- a/gpkg/glibc/i386-arch-syscall.h.patch +++ b/gpkg/glibc/i386-arch-syscall.h.patch @@ -49,14 +49,6 @@ #define __NR_getpid 20 #define __NR_getpmsg 188 #define __NR_getppid 64 -@@ -181,7 +172,6 @@ - #define __NR_lstat 107 - #define __NR_lstat64 196 - #define __NR_madvise 219 --#define __NR_mbind 274 - #define __NR_membarrier 375 - #define __NR_memfd_create 356 - #define __NR_memfd_secret 447 @@ -239,7 +229,6 @@ #define __NR_personality 136 #define __NR_pidfd_getfd 438 diff --git a/gpkg/glibc/mprotect.c b/gpkg/glibc/mprotect.c index a17b6aebb..187b03ddb 100644 --- a/gpkg/glibc/mprotect.c +++ b/gpkg/glibc/mprotect.c @@ -17,7 +17,7 @@ #include #ifdef SHARED -# define GLOBAL_READ_SIZE 45 +# define GLOBAL_READ_SIZE 1024 /* - String To Unsigned Long Int There are two chairs - one is called "strtoul", the other "stuli"... @@ -42,42 +42,36 @@ unsigned long int __stuli(char *value) { static int __is_mmaped(void *addr) { char buff[GLOBAL_READ_SIZE]; - char *buff2; - char maddr[GLOBAL_READ_SIZE*2]; - memset(maddr, 0, sizeof(maddr)); - - int skip = 0; - int res = 1; - + char *buff2 = ""; + char *cont = ""; + int res = 0; + int strlc, strlb; + memset(buff, 0, sizeof(buff)); int map = __open_nocancel("/proc/self/maps", O_RDONLY|O_CLOEXEC); if (map >= 0) { - while (__read_nocancel(map, buff, GLOBAL_READ_SIZE) == GLOBAL_READ_SIZE) { + while (__read_nocancel(map, buff, GLOBAL_READ_SIZE) > 0) { buff[GLOBAL_READ_SIZE] = '\0'; - if (skip == 1) - if ((buff2=strrchr(buff, '\n')) != NULL) - memcpy(maddr, &buff2[1], strlen(&buff2[1])+1); - else - continue; - if (strrchr(maddr, '-') == NULL) { - if (skip == 1) { - skip = 0; - continue; - } - __strncat(maddr, buff, GLOBAL_READ_SIZE); + strlc = strlen(cont); + if (strlc > 0) { + buff2 = malloc(sizeof(char)*strlc); + memcpy(buff2, cont, strlc); } - if (__stuli(strtok(maddr, "-")) == (unsigned long int)addr) { - res = 0; + cont = malloc(sizeof(char)*(strlc+strlen(buff))); + memset(cont, 0, sizeof(cont)); + strlb = strlen(buff2); + if (strlb > 0) + memcpy(cont, buff2, strlb); + __strncat(cont, buff, GLOBAL_READ_SIZE); + memset(buff, 0, sizeof(buff)); + } + char *saveptr; + while ((buff2 = strtok_r(cont, "\n", &cont))) + if (__stuli(strtok_r(buff2, "-", &saveptr)) == (unsigned long int)addr) { + res = 1; break; - } - memset(maddr, 0, sizeof(maddr)); - if ((buff2=strrchr(buff, '\n')) != NULL) - memcpy(maddr, &buff2[1], strlen(&buff2[1])+1); - else - skip = 1; } - __close_nocancel_nostatus(map); } - + __close_nocancel_nostatus(map); return res; } #endif @@ -85,18 +79,20 @@ static int __is_mmaped(void *addr) { int __mprotect(void *addr, size_t len, int prot) { int res = INLINE_SYSCALL_CALL(mprotect, addr, len, prot); #ifdef SHARED - if (res == -1 && errno == EACCES && prot & PROT_EXEC && __is_mmaped(addr) == 1) { + if (res == -1 && errno == EACCES && prot & PROT_EXEC && !__is_mmaped(addr)) { size_t saddr = strlen(addr)+1; void *caddr; + int mmap_flags = MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED; + if (prot & PROT_GROWSDOWN) + mmap_flags |= MAP_GROWSDOWN; if (saddr > 1) { caddr = malloc(saddr); memcpy(caddr, addr, saddr); } - mmap(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0); - if (saddr > 1) { + free(addr); + addr = mmap(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC, mmap_flags, -1, 0); + if (saddr > 1) memcpy(addr, caddr, saddr); - free(caddr); - } return INLINE_SYSCALL_CALL(mprotect, addr, len, prot); } #endif diff --git a/gpkg/glibc/syscall.c.patch b/gpkg/glibc/syscall.c.patch new file mode 100644 index 000000000..73a0508d3 --- /dev/null +++ b/gpkg/glibc/syscall.c.patch @@ -0,0 +1,11 @@ +--- src/sysdeps/unix/sysv/linux/syscall.c 2023-07-31 20:54:16.000000000 +0300 ++++ src/sysdeps/unix/sysv/linux/syscall.c.patch 2023-12-22 14:48:11.670944898 +0300 +@@ -36,6 +36,8 @@ + long int r = INTERNAL_SYSCALL_NCS_CALL (number, a0, a1, a2, a3, a4, a5); + if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (r))) + { ++ if (number == 1008 || number == __NR_mbind) ++ return 0; + __set_errno (-r); + return -1; + } diff --git a/gpkg/glibc/x86_64-arch-syscall.h.patch b/gpkg/glibc/x86_64-arch-syscall.h.patch index 6adf30079..952592067 100644 --- a/gpkg/glibc/x86_64-arch-syscall.h.patch +++ b/gpkg/glibc/x86_64-arch-syscall.h.patch @@ -50,14 +50,6 @@ #define __NR_getpid 39 #define __NR_getpmsg 181 #define __NR_getppid 110 -@@ -152,7 +144,6 @@ - #define __NR_lsetxattr 189 - #define __NR_lstat 6 - #define __NR_madvise 28 --#define __NR_mbind 237 - #define __NR_membarrier 324 - #define __NR_memfd_create 319 - #define __NR_memfd_secret 447 @@ -201,7 +192,6 @@ #define __NR_personality 135 #define __NR_pidfd_getfd 438