Skip to content

Commit

Permalink
musl: backport reallocarray and others.
Browse files Browse the repository at this point in the history
It's in POSIX-future and some applications have started depending on it.
It's easier to backport into musl than fix each individual package.

Since we are adding a new interface to libc, update common/shlibs entry
as well. This should probably have been done for all musl updates.

And since we are here, also backport:
- isascii fix (removes the need for a patch in fceux)
- make epoll a cancellation point (fixes a bug in jack pipewire utilities)
  • Loading branch information
ericonr committed May 24, 2021
1 parent 064a51e commit beb3f7f
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 2 deletions.
2 changes: 1 addition & 1 deletion common/shlibs
Expand Up @@ -16,7 +16,7 @@
# PLEASE NOTE: when multiple packages provide the same SONAME, the first
# one (order top->bottom) is preferred over the next ones.
#
libc.so musl-1.1.21_1
libc.so musl-1.1.24_7
libc.so.6 glibc-2.32_1
libm.so.6 glibc-2.32_1
libpthread.so.0 glibc-2.32_1
Expand Down
28 changes: 28 additions & 0 deletions srcpkgs/musl/patches/epoll_cp.patch
@@ -0,0 +1,28 @@
From 2c00f95c1ac7dd50f53d9e361847ebd2513c8da0 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Sat, 3 Apr 2021 21:16:41 -0400
Subject: [PATCH] make epoll_[p]wait a cancellation point

this is a Linux-specific function and not covered by POSIX's
requirements for which interfaces are cancellation points, but glibc
makes it one and existing software relies on it being one.

at some point a review for similar functions that should be made
cancellation points should be done.

diff --git src/linux/epoll.c src/linux/epoll.c
index deff5b10..93baa814 100644
--- src/linux/epoll.c
+++ src/linux/epoll.c
@@ -24,9 +24,9 @@ int epoll_ctl(int fd, int op, int fd2, struct epoll_event *ev)

int epoll_pwait(int fd, struct epoll_event *ev, int cnt, int to, const sigset_t *sigs)
{
- int r = __syscall(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
+ int r = __syscall_cp(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
#ifdef SYS_epoll_wait
- if (r==-ENOSYS && !sigs) r = __syscall(SYS_epoll_wait, fd, ev, cnt, to);
+ if (r==-ENOSYS && !sigs) r = __syscall_cp(SYS_epoll_wait, fd, ev, cnt, to);
#endif
return __syscall_ret(r);
}
21 changes: 21 additions & 0 deletions srcpkgs/musl/patches/isascii.patch
@@ -0,0 +1,21 @@
From e48e99c112246fb580596404074445cb25d7858d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=89rico=20Rolim?= <ericonr@disroot.org>
Date: Mon, 4 Jan 2021 22:48:34 -0300
Subject: [PATCH] suppress isascii() macro for C++

analogous to commit a60457c84a4b59ab564d7f4abb660a70283ba98d.

diff --git include/ctype.h include/ctype.h
index 7936536f..32bcef4d 100644
--- include/ctype.h
+++ include/ctype.h
@@ -64,7 +64,9 @@ int isascii(int);
int toascii(int);
#define _tolower(a) ((a)|0x20)
#define _toupper(a) ((a)&0x5f)
+#ifndef __cplusplus
#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
+#endif

#endif

42 changes: 42 additions & 0 deletions srcpkgs/musl/patches/reallocarray.patch
@@ -0,0 +1,42 @@
From 821083ac7b54eaa040d5a8ddc67c6206a175e0ca Mon Sep 17 00:00:00 2001
From: Ariadne Conill <ariadne@dereferenced.org>
Date: Sat, 1 Aug 2020 08:26:35 -0600
Subject: [PATCH] implement reallocarray

reallocarray is an extension introduced by OpenBSD, which introduces
calloc overflow checking to realloc.

glibc 2.28 introduced support for this function behind _GNU_SOURCE,
while glibc 2.29 allows its usage in _DEFAULT_SOURCE.

diff --git a/include/stdlib.h b/include/stdlib.h
index 194c2033..b54a051f 100644
--- include/stdlib.h
+++ include/stdlib.h
@@ -145,6 +145,7 @@ int getloadavg(double *, int);
int clearenv(void);
#define WCOREDUMP(s) ((s) & 0x80)
#define WIFCONTINUED(s) ((s) == 0xffff)
+void *reallocarray (void *, size_t, size_t);
#endif

#ifdef _GNU_SOURCE
diff --git a/src/malloc/reallocarray.c b/src/malloc/reallocarray.c
new file mode 100644
index 00000000..4a6ebe46
--- /dev/null
+++ src/malloc/reallocarray.c
@@ -0,0 +1,13 @@
+#define _BSD_SOURCE
+#include <errno.h>
+#include <stdlib.h>
+
+void *reallocarray(void *ptr, size_t m, size_t n)
+{
+ if (n && m > -1 / n) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ return realloc(ptr, m * n);
+}
2 changes: 1 addition & 1 deletion srcpkgs/musl/template
Expand Up @@ -2,7 +2,7 @@
pkgname=musl
reverts="1.2.0_1"
version=1.1.24
revision=6
revision=7
archs="*-musl"
bootstrap=yes
build_style=gnu-configure
Expand Down

0 comments on commit beb3f7f

Please sign in to comment.