3
0
Fork 0
forked from mirrors/nixpkgs

libbsd: update patches

This commit is contained in:
Matthew Bauer 2018-10-13 18:14:56 -05:00
parent a29f2f20cd
commit 7c61bb615a
5 changed files with 209 additions and 882 deletions

View file

@ -1,222 +0,0 @@
From 11ec8f1e5dfa1c10e0c9fb94879b6f5b96ba52dd Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@hadrons.org>
Date: Tue, 6 Mar 2018 01:41:35 +0100
Subject: Handle systems missing <sys/cdefs.h>
This is a non-portable header, and we cannot expect it to be provided by
the system libc (e.g. musl). We just need and rely on declaration that
we have defined ourselves in our own <bsd/sys/cdefs.h>. So we switch to
only ever assume that.
Fixes: https://bugs.freedesktop.org/105281
---
include/bsd/libutil.h | 4 ++++
include/bsd/md5.h | 4 ++++
include/bsd/nlist.h | 4 ++++
include/bsd/readpassphrase.h | 4 ++++
include/bsd/stdlib.h | 4 ++++
include/bsd/string.h | 4 ++++
include/bsd/stringlist.h | 5 +++++
include/bsd/sys/queue.h | 4 ++++
include/bsd/sys/tree.h | 4 ++++
include/bsd/timeconv.h | 4 ++++
include/bsd/vis.h | 4 ++++
include/bsd/wchar.h | 4 ++++
12 files changed, 49 insertions(+)
diff --git a/include/bsd/libutil.h b/include/bsd/libutil.h
index 45b3b15..ccca29a 100644
--- a/include/bsd/libutil.h
+++ b/include/bsd/libutil.h
@@ -40,7 +40,11 @@
#define LIBBSD_LIBUTIL_H
#include <features.h>
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
diff --git a/include/bsd/md5.h b/include/bsd/md5.h
index 5f3ae46..bf36a30 100644
--- a/include/bsd/md5.h
+++ b/include/bsd/md5.h
@@ -27,7 +27,11 @@ typedef struct MD5Context {
uint8_t buffer[MD5_BLOCK_LENGTH]; /* input buffer */
} MD5_CTX;
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/types.h>
__BEGIN_DECLS
diff --git a/include/bsd/nlist.h b/include/bsd/nlist.h
index cb297e8..8767117 100644
--- a/include/bsd/nlist.h
+++ b/include/bsd/nlist.h
@@ -27,7 +27,11 @@
#ifndef LIBBSD_NLIST_H
#define LIBBSD_NLIST_H
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
struct nlist {
union {
diff --git a/include/bsd/readpassphrase.h b/include/bsd/readpassphrase.h
index 14744b8..5eb8021 100644
--- a/include/bsd/readpassphrase.h
+++ b/include/bsd/readpassphrase.h
@@ -31,7 +31,11 @@
#define RPP_SEVENBIT 0x10 /* Strip the high bit from input. */
#define RPP_STDIN 0x20 /* Read from stdin, not /dev/tty */
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/types.h>
__BEGIN_DECLS
diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h
index ebc9638..8d33d1f 100644
--- a/include/bsd/stdlib.h
+++ b/include/bsd/stdlib.h
@@ -42,7 +42,11 @@
#ifndef LIBBSD_STDLIB_H
#define LIBBSD_STDLIB_H
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/stat.h>
#include <stdint.h>
diff --git a/include/bsd/string.h b/include/bsd/string.h
index 6798bf6..29097f6 100644
--- a/include/bsd/string.h
+++ b/include/bsd/string.h
@@ -33,7 +33,11 @@
#ifndef LIBBSD_STRING_H
#define LIBBSD_STRING_H
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/types.h>
__BEGIN_DECLS
diff --git a/include/bsd/stringlist.h b/include/bsd/stringlist.h
index ff30cac..dd71496 100644
--- a/include/bsd/stringlist.h
+++ b/include/bsd/stringlist.h
@@ -31,7 +31,12 @@
#ifndef LIBBSD_STRINGLIST_H
#define LIBBSD_STRINGLIST_H
+
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/types.h>
/*
diff --git a/include/bsd/sys/queue.h b/include/bsd/sys/queue.h
index 4a94ea7..ac00026 100644
--- a/include/bsd/sys/queue.h
+++ b/include/bsd/sys/queue.h
@@ -33,7 +33,11 @@
#ifndef LIBBSD_SYS_QUEUE_H
#define LIBBSD_SYS_QUEUE_H
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
/*
* This file defines four types of data structures: singly-linked lists,
diff --git a/include/bsd/sys/tree.h b/include/bsd/sys/tree.h
index 628bec0..325b382 100644
--- a/include/bsd/sys/tree.h
+++ b/include/bsd/sys/tree.h
@@ -30,7 +30,11 @@
#ifndef LIBBSD_SYS_TREE_H
#define LIBBSD_SYS_TREE_H
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
/*
* This file defines data structures for different types of trees:
diff --git a/include/bsd/timeconv.h b/include/bsd/timeconv.h
index e2a2c55..a426bd3 100644
--- a/include/bsd/timeconv.h
+++ b/include/bsd/timeconv.h
@@ -41,7 +41,11 @@
#ifndef LIBBSD_TIMECONV_H
#define LIBBSD_TIMECONV_H
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <stdint.h>
#include <time.h>
diff --git a/include/bsd/vis.h b/include/bsd/vis.h
index 970dfdd..ab5430c 100644
--- a/include/bsd/vis.h
+++ b/include/bsd/vis.h
@@ -72,7 +72,11 @@
*/
#define UNVIS_END 1 /* no more characters */
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
__BEGIN_DECLS
char *vis(char *, int, int, int);
diff --git a/include/bsd/wchar.h b/include/bsd/wchar.h
index 33a500e..7216503 100644
--- a/include/bsd/wchar.h
+++ b/include/bsd/wchar.h
@@ -40,7 +40,11 @@
#define LIBBSD_WCHAR_H
#include <stddef.h>
+#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
+#else
+#include <bsd/sys/cdefs.h>
+#endif
#include <sys/types.h>
__BEGIN_DECLS
--
cgit v1.1

View file

@ -1,497 +1,103 @@
diff --git a/configure.ac b/configure.ac
index 88ccd91..0857782 100644
index 55fcfe6..1e26c93 100644
--- a/configure.ac
+++ b/configure.ac
@@ -59,7 +59,7 @@ AS_CASE([$host_os],
)
@@ -51,15 +51,19 @@ AS_CASE([$host_os],
AC_SEARCH_LIBS([clock_gettime], [rt], [CLOCK_GETTIME_LIBS="-lrt"])
AC_SUBST([CLOCK_GETTIME_LIBS])
LIBS="$saved_LIBS"
+ AM_CONDITIONAL([BUILD_LINK_VERSION_SCRIPT], [1])
],
[*-musl*], [
# Upstream refuses to define this, we will do it ourselves then.
AC_DEFINE([__MUSL__], [1], [Define to 1 if we are building for musl])
+ AM_CONDITIONAL([BUILD_LINK_VERSION_SCRIPT], [1])
],
-)
+ [
+ AM_CONDITIONAL([BUILD_LINK_VERSION_SCRIPT], [1])
+ ])
# Checks for header files.
-AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h])
+AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h stdio_ext.h])
+AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h nlist.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
@@ -146,6 +146,31 @@ AC_CHECK_FUNCS([clearenv dirfd fopencookie __fpurge \
pstat_getproc sysconf])
@@ -143,7 +147,8 @@ AC_LINK_IFELSE(
AC_CHECK_FUNCS([clearenv dirfd fopencookie __fpurge \
getauxval getentropy getexecname getline \
- pstat_getproc sysconf])
+ pstat_getproc sysconf \
+ strlcpy strlcat strnstr strmode fpurge])
AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = "xtrue"])
+HostOS=`echo "$host" | sed 's/.*-//'`
+os_is_macosx=false
+nonLinuxOS=false
+AC_SUBST(HostOS)
+case ${HostOS} in
+ darwin* | powerpc*-*-darwin* | freebsd* | netbsd* | openbsd*)
+ os_is_macosx=true
+ nonLinuxOS=true
+ echo HostOS="$HostOS"
+ ;;
+ *)
+ echo host="$host"
+ echo HostOS="$HostOS"
+ os_is_macosx=false
+ nonLinuxOS=false
+ ;;
+esac
+AM_CONDITIONAL([IS_DARWIN], [test x$os_is_macosx = xtrue])
+AM_COND_IF([IS_DARWIN],
+ [AC_DEFINE([IS_DARWIN], [1], [Get HostOS Type is Darwin])])
+
+AM_CONDITIONAL([NON_LINUX], [test x$userdefine_gethostbyname_r = xtrue])
+AM_COND_IF([NON_LINUX],
+ [AC_DEFINE([NON_LINUX], [1], [Get HostOS Type])])
+
AC_CONFIG_FILES([
Makefile
include/Makefile
diff --git a/include/bsd/libutil.h b/include/bsd/libutil.h
index 45b3b15..d0d4043 100644
--- a/include/bsd/libutil.h
+++ b/include/bsd/libutil.h
@@ -39,7 +39,9 @@
#ifndef LIBBSD_LIBUTIL_H
#define LIBBSD_LIBUTIL_H
+#ifdef HAVE_FEATURES_H
#include <features.h>
+#endif
#include <sys/cdefs.h>
#include <sys/types.h>
#include <stdint.h>
diff --git a/include/bsd/stdio.h b/include/bsd/stdio.h
index 4b69983..c75151b 100644
--- a/include/bsd/stdio.h
+++ b/include/bsd/stdio.h
@@ -48,12 +48,16 @@
__BEGIN_DECLS
const char *fmtcheck(const char *, const char *);
+#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX)
/* XXX: The function requires cooperation from the system libc to store the
* line buffer in the FILE struct itself. */
char *fgetln(FILE *fp, size_t *lenp)
- LIBBSD_DEPRECATED("This functions cannot be safely ported, "
- "use getline(3) instead, as it is supported "
- "by GNU and POSIX.1-2008.");
+ __attribute__((deprecated("This functions cannot be safely ported, "
+ "use getline(3) instead, as it is supported "
+ "by GNU and POSIX.1-2008.")));
+#else
+char *fgetln(FILE *fp, size_t *lenp);
+#endif
/*
* Note: We diverge from the FreeBSD, OpenBSD and DragonFlyBSD declarations,
diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h
index ebc9638..6cd7943 100644
--- a/include/bsd/stdlib.h
+++ b/include/bsd/stdlib.h
@@ -67,9 +67,11 @@ int sradixsort(const unsigned char **base, int nmemb,
const unsigned char *table, unsigned endbyte);
void *reallocf(void *ptr, size_t size);
-#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 26)
+#if defined(_GNU_SOURCE) && defined(__GLIBC__) && defined(__GLIBC_PREREQ)
+#if !__GLIBC_PREREQ(2, 26)
void *reallocarray(void *ptr, size_t nmemb, size_t size);
#endif
+#endif
long long strtonum(const char *nptr, long long minval, long long maxval,
const char **errstr);
diff --git a/include/bsd/string.h b/include/bsd/string.h
index 6798bf6..6baaa14 100644
index f987fee..a1e17ed 100644
--- a/include/bsd/string.h
+++ b/include/bsd/string.h
@@ -37,6 +37,12 @@
@@ -41,10 +41,21 @@
#include <sys/types.h>
__BEGIN_DECLS
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+size_t bsd_strlcpy(char *dst, const char *src, size_t siz);
+size_t bsd_strlcat(char *dst, const char *src, size_t siz);
+char *bsd_strnstr(const char *str, const char *find, size_t str_len);
+void bsd_strmode(mode_t mode, char *str);
+#else
+#if !HAVE_STRLCPY
size_t strlcpy(char *dst, const char *src, size_t siz);
size_t strlcat(char *dst, const char *src, size_t siz);
char *strnstr(const char *str, const char *find, size_t str_len);
@@ -45,6 +51,7 @@ void strmode(mode_t mode, char *str);
#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 25)
void explicit_bzero(void *buf, size_t len);
#endif
+#endif
__END_DECLS
+
+#if !HAVE_STRLCAT
size_t strlcat(char *dst, const char *src, size_t siz);
+#endif
+
+#if !HAVE_STRNSTR
char *strnstr(const char *str, const char *find, size_t str_len);
+#endif
+
+#if !HAVE_STRMODE
void strmode(mode_t mode, char *str);
+#endif
#endif
#if !defined(__GLIBC__) || \
(defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 25) || !defined(_GNU_SOURCE)))
diff --git a/src/Makefile.am b/src/Makefile.am
index ad83dbf..0f2a7ee 100644
index f3cc0fa..3aaecd4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -54,17 +54,21 @@ libbsd_la_DEPENDENCIES = \
libbsd.map
@@ -56,8 +56,10 @@ libbsd_la_DEPENDENCIES = \
libbsd_la_LIBADD = \
$(CLOCK_GETTIME_LIBS)
+
+if IS_DARWIN
+libbsd_la_LDFLAGS = \
+ -Wl \
+ -version-number $(LIBBSD_ABI)
+else
libbsd_la_LDFLAGS = \
-Wl,--version-script=$(srcdir)/libbsd.map \
- -Wl,--version-script=$(srcdir)/libbsd.map \
-version-number $(LIBBSD_ABI)
+if BUILD_LINK_VERSION_SCRIPT
+libbsd_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libbsd.map
+endif
+
libbsd_la_SOURCES = \
arc4random.c \
- arc4random.h \
- arc4random_unix.h \
- arc4random_openbsd.h \
arc4random_uniform.c \
bsd_getopt.c \
- chacha_private.h \
closefrom.c \
dehumanize_number.c \
err.c \
@@ -117,6 +121,15 @@ libbsd_la_SOURCES += \
$(nil)
endif
+noinst_HEADERS = \
+ arc4random.h \
+ arc4random_bsd.h \
+ arc4random_linux.h \
+ arc4random_unix.h \
+ arc4random_osx.h \
+ arc4random_openbsd.h \
+ chacha_private.h
+
libbsd_ctor_a_SOURCES = \
setproctitle_ctor.c \
$(nil)
diff --git a/src/arc4random_bsd.h b/src/arc4random_bsd.h
new file mode 100644
index 0000000..ece2f85
--- /dev/null
+++ b/src/arc4random_bsd.h
@@ -0,0 +1,86 @@
+/* $OpenBSD: arc4random_freebsd.h,v 1.2 2015/01/15 06:57:18 deraadt Exp $ */
+
+/*
+ * Copyright (c) 1996, David Mazieres <dm@uun.org>
+ * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
+ * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
+ * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Stub functions for portability.
+ */
+
+#include <sys/mman.h>
+
+#include <pthread.h>
+#include <signal.h>
+
+static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
+#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx)
+#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
+
+/*
+ * Unfortunately, pthread_atfork() is broken on FreeBSD (at least 9 and 10) if
+ * a program does not link to -lthr. Callbacks registered with pthread_atfork()
+ * appear to fail silently. So, it is not always possible to detect a PID
+ * wraparound.
+ */
+#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f))
+
+static inline void
+_getentropy_fail(void)
+{
+ raise(SIGKILL);
+}
+
+static volatile sig_atomic_t _rs_forked;
+
+static inline void
+_rs_forkhandler(void)
+{
+ _rs_forked = 1;
+}
+
+static inline void
+_rs_forkdetect(void)
+{
+ static pid_t _rs_pid = 0;
+ pid_t pid = getpid();
+
+ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) {
+ _rs_pid = pid;
+ _rs_forked = 0;
+ if (rs)
+ memset(rs, 0, sizeof(*rs));
+ }
+}
+
+static inline int
+_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
+{
+ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
+ return (-1);
+
+ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
+ munmap(*rsp, sizeof(**rsp));
+ return (-1);
+ }
+
+ _ARC4_ATFORK(_rs_forkhandler);
+ return (0);
+}
diff --git a/src/arc4random_linux.h b/src/arc4random_linux.h
new file mode 100644
index 0000000..d61a8db
--- /dev/null
+++ b/src/arc4random_linux.h
@@ -0,0 +1,86 @@
+/* $OpenBSD: arc4random_linux.h,v 1.8 2014/08/13 06:04:10 deraadt Exp $ */
+
+/*
+ * Copyright (c) 1996, David Mazieres <dm@uun.org>
+ * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
+ * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
+ * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Stub functions for portability.
+ */
+
+#include <sys/mman.h>
+
+#include <pthread.h>
+#include <signal.h>
+
+static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
+#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx)
+#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
+
+#ifdef __GLIBC__
+extern void *__dso_handle;
+extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *);
+#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle)
+#else
+#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f))
+#endif
+
+static inline void
+_getentropy_fail(void)
+{
+ raise(SIGKILL);
+}
+
+static volatile sig_atomic_t _rs_forked;
+
+static inline void
+_rs_forkhandler(void)
+{
+ _rs_forked = 1;
+}
+
+static inline void
+_rs_forkdetect(void)
+{
+ static pid_t _rs_pid = 0;
+ pid_t pid = getpid();
+
+ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) {
+ _rs_pid = pid;
+ _rs_forked = 0;
+ if (rs)
+ memset(rs, 0, sizeof(*rs));
+ }
+}
+
+static inline int
+_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
+{
+ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
+ return (-1);
+
+ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
+ munmap(*rsp, sizeof(**rsp));
+ return (-1);
+ }
+
+ _ARC4_ATFORK(_rs_forkhandler);
+ return (0);
+}
diff --git a/src/arc4random_osx.h b/src/arc4random_osx.h
new file mode 100644
index 0000000..14771a6
--- /dev/null
+++ b/src/arc4random_osx.h
@@ -0,0 +1,82 @@
+/* $OpenBSD: arc4random_osx.h,v 1.10 2015/09/11 11:52:55 deraadt Exp $ */
+
+/*
+ * Copyright (c) 1996, David Mazieres <dm@uun.org>
+ * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
+ * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
+ * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Stub functions for portability.
+ */
+
+#include <sys/mman.h>
+
+#include <unistd.h>
+#include <pthread.h>
+#include <signal.h>
+
+static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
+#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx)
+#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
+
+#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f))
+
+static inline void
+_getentropy_fail(void)
+{
+ raise(SIGKILL);
+}
+
+static volatile sig_atomic_t _rs_forked;
+
+static inline void
+_rs_forkhandler(void)
+{
+ _rs_forked = 1;
+}
+
+static inline void
+_rs_forkdetect(void)
+{
+ static pid_t _rs_pid = 0;
+ pid_t pid = getpid();
+
+ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) {
+ _rs_pid = pid;
+ _rs_forked = 0;
+ if (rs)
+ memset(rs, 0, sizeof(*rs));
+ }
+}
+
+static inline int
+_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
+{
+ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
+ return (-1);
+
+ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
+ munmap(*rsp, sizeof(**rsp));
+ *rsp = NULL;
+ return (-1);
+ }
+
+ _ARC4_ATFORK(_rs_forkhandler);
+ return (0);
+}
diff --git a/src/fgetln.c b/src/fgetln.c
index 4d1726e..9c73788 100644
--- a/src/fgetln.c
+++ b/src/fgetln.c
@@ -30,7 +30,9 @@
#include <sys/types.h>
#include <string.h>
+#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX)
#include "local-link.h"
+#endif
#ifdef HAVE_GETLINE
struct filebuf {
@@ -75,9 +77,11 @@ fgetln(FILE *stream, size_t *len)
return fb->buf;
}
}
+#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX)
libbsd_link_warning(fgetln,
"This functions cannot be safely ported, use getline(3) "
"instead, as it is supported by GNU and POSIX.1-2008.")
+#endif
#else
#error "Function fgetln() needs to be ported."
#endif
arc4random.h \
diff --git a/src/fpurge.c b/src/fpurge.c
index 462535a..e7eb46f 100644
index 462535a..a8941db 100644
--- a/src/fpurge.c
+++ b/src/fpurge.c
@@ -26,9 +26,11 @@
@@ -26,9 +26,10 @@
#include <errno.h>
#include <stdio.h>
+#if HAVE___FPURGE
#include <stdio_ext.h>
+#endif
-#include <stdio_ext.h>
-#ifdef HAVE___FPURGE
+#ifdef HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */
#ifdef HAVE___FPURGE
+#include <stdio_ext.h>
+
int
fpurge(FILE *fp)
{
@@ -42,5 +44,55 @@ fpurge(FILE *fp)
@@ -41,6 +42,36 @@ fpurge(FILE *fp)
return 0;
}
#else
-#error "Function fpurge() needs to be ported."
+#define fp_ fp
+//#error "Function fpurge() needs to be ported."
+//#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin 1.7 */
+/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin 1.7 */
+#elif HAVE_FPURGE
+int
+fpurge(FILE *fp)
+{
@ -501,12 +107,13 @@ index 462535a..e7eb46f 100644
+ }
+
+ /* Call the system's fpurge function. */
+# undef fpurge
+# if !HAVE_DECL_FPURGE
+#undef fpurge
+#if !HAVE_DECL_FPURGE
+ extern int fpurge (FILE *);
+# endif
+#endif
+ int result = fpurge (fp);
+# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */
+/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */
+#if defined(__sferror) || defined(__DragonFly__)
+ if (result == 0)
+ /* Correct the invariants that fpurge broke.
+ <stdio.h> on BSD systems says:
@ -514,69 +121,35 @@ index 462535a..e7eb46f 100644
+ If this invariant is not fulfilled and the stream is read-write but
+ currently reading, subsequent putc or fputc calls will write directly
+ into the buffer, although they shouldn't be allowed to. */
+ if ((fp_->_flags & __SRD) != 0)
+ fp_->_w = 0;
+ if ((fp->_flags & __SRD) != 0)
+ fp->_w = 0;
+#endif
+ return result;
+}
+//#endif
+#endif
+
+#ifdef TEST
+int
+main()
+{
+ static FILE fp_bad;
+ FILE *fp;
+
+ if (fpurge(&fp_bad) == 0)
+ return 1;
+
+ fp = fopen("/dev/zero", "r");
+ if (fpurge(fp) < 0)
+ return 1;
+
+ fclose(fp);
+
+ return 0;
+}
#else
#error "Function fpurge() needs to be ported."
#endif
diff --git a/src/funopen.c b/src/funopen.c
index 1e05c7e..75e61ea 100644
index 1e05c7e..65ba5a8 100644
--- a/src/funopen.c
+++ b/src/funopen.c
@@ -143,6 +143,7 @@ funopen(const void *cookie,
* they will not add the needed support to implement it. Just ignore this
* interface there, as it has never been provided anyway.
*/
+#elif defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+#elif defined(__MACH__)
#else
#error "Function funopen() needs to be ported or disabled."
#endif
diff --git a/src/getentropy.c b/src/getentropy.c
index 3f11a1e..8a23a07 100644
--- a/src/getentropy.c
+++ b/src/getentropy.c
@@ -28,9 +28,7 @@
#include "getentropy_linux.c"
#elif defined(__GNU__)
#include "getentropy_hurd.c"
-#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-#include "getentropy_bsd.c"
-#elif defined(__NetBSD__)
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
#include "getentropy_bsd.c"
#elif defined(__sun)
#include "getentropy_solaris.c"
diff --git a/src/hash/sha512.h b/src/hash/sha512.h
index 4f368a1..ab22fc1 100644
index 4f368a1..7632e25 100644
--- a/src/hash/sha512.h
+++ b/src/hash/sha512.h
@@ -29,7 +29,11 @@
#ifndef _SHA512_H_
#define _SHA512_H_
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+#ifdef __MACH__
+#include <stdint.h>
+#else
#include <sys/types.h>
@ -585,16 +158,15 @@ index 4f368a1..ab22fc1 100644
#define SHA512_DIGEST_LENGTH 64
diff --git a/src/hash/sha512c.c b/src/hash/sha512c.c
index b3c8d5e..f69013d 100644
index b3c8d5e..602f54e 100644
--- a/src/hash/sha512c.c
+++ b/src/hash/sha512c.c
@@ -25,7 +25,13 @@
@@ -25,7 +25,12 @@
*/
#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+#ifdef __MACH__
+#include <machine/endian.h>
+#else
#include <sys/endian.h>
@ -602,102 +174,188 @@ index b3c8d5e..f69013d 100644
#include <sys/types.h>
#include <string.h>
diff --git a/src/local-link.h b/src/local-link.h
index d518dcf..84694a2 100644
--- a/src/local-link.h
+++ b/src/local-link.h
@@ -27,7 +27,11 @@
#ifndef LIBBSD_LOCAL_LINK_H
#define LIBBSD_LOCAL_LINK_H
+#ifdef __MACH__
+#define libbsd_link_warning(symbol, msg)
+#else
#define libbsd_link_warning(symbol, msg) \
static const char libbsd_emit_link_warning_##symbol[] \
__attribute__((used,section(".gnu.warning." #symbol))) = msg;
#endif
+#endif
diff --git a/src/nlist.c b/src/nlist.c
index 0932f59..598a329 100644
index 0932f59..4502048 100644
--- a/src/nlist.c
+++ b/src/nlist.c
@@ -27,6 +27,10 @@
* SUCH DAMAGE.
*/
@@ -41,6 +41,7 @@
#include <unistd.h>
#include <nlist.h>
+#if !defined(darwin) && !defined(__APPLE__) && !defined(MACOSX)
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)nlist.c 8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
#include <sys/cdefs.h>
+#if !HAVE_NLIST_H
#include "local-elf.h"
#include <sys/param.h>
@@ -265,3 +269,4 @@ nlist(const char *name, struct nlist *list)
#define SIZE_T_MAX 0xffffffffU
@@ -265,3 +266,4 @@ nlist(const char *name, struct nlist *list)
(void)close(fd);
return (n);
}
+#endif /* _NLIST_DO_ELF */
+#endif
diff --git a/src/readpassphrase.c b/src/readpassphrase.c
index f9f6195..2bc5fb4 100644
--- a/src/readpassphrase.c
+++ b/src/readpassphrase.c
@@ -36,6 +36,14 @@
#define TCSASOFT 0
#endif
+#ifndef _SIGMAX
+#define _SIGMAX 64
+#endif
+
+#ifndef _NSIG
+#define _NSIG (_SIGMAX + 1)
+#endif
+
static volatile sig_atomic_t signo[_NSIG];
static void handler(int);
diff --git a/src/setproctitle.c b/src/setproctitle.c
index 038ac7d..d0ef01b 100644
index 038ac7d..e9ee09c 100644
--- a/src/setproctitle.c
+++ b/src/setproctitle.c
@@ -32,6 +32,11 @@
@@ -32,6 +32,10 @@
#include <unistd.h>
#include <string.h>
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+#define __asm__(x)
+#ifdef __MACH__
+extern char **environ;
+#endif
+
static struct {
/* Original value. */
const char *arg0;
@@ -287,7 +292,14 @@ __asm__(".symver setproctitle_impl,setproctitle@@LIBBSD_0.5");
@@ -280,16 +284,22 @@ setproctitle_impl(const char *fmt, ...)
*++nul = '\0';
}
}
+#ifndef __MACH__
__asm__(".symver setproctitle_impl,setproctitle@@LIBBSD_0.5");
+#endif
/* The original function introduced in 0.2 was a stub, it only got implemented
* in 0.5, make the implementation available in the old version as an alias
* for code linking against that version, and change the default to use the
* new version, so that new code depends on the implemented version. */
#ifdef HAVE_TYPEOF
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+//
+// HACK: even weak aliasing breaks in clang so just comment this out for now
+//
+// extern typeof(setproctitle_impl) setproctitle_stub __attribute__((weak, alias("setproctitle_impl")));
+#else
-#ifdef HAVE_TYPEOF
+#ifdef __MACH__
+void setproctitle_stub(const char *fmt, ...);
+#elif HAVE_TYPEOF
extern typeof(setproctitle_impl) setproctitle_stub __attribute__((alias("setproctitle_impl")));
+#endif
#else
void setproctitle_stub(const char *fmt, ...)
__attribute__((alias("setproctitle_impl")));
#endif
+#ifndef __MACH__
__asm__(".symver setproctitle_stub,setproctitle@LIBBSD_0.2");
+#endif
diff --git a/src/strlcat.c b/src/strlcat.c
index 14c53a1..e01cb60 100644
index 14c53a1..5961c17 100644
--- a/src/strlcat.c
+++ b/src/strlcat.c
@@ -27,7 +27,11 @@
@@ -26,6 +26,7 @@
* Returns strlen(src) + MIN(dsize, strlen(initial dst)).
* If retval >= dsize, truncation occurred.
*/
+#if !HAVE_STRLCAT
size_t
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+bsd_strlcat(char *dst, const char *src, size_t dsize)
+#else
strlcat(char *dst, const char *src, size_t dsize)
+#endif
{
const char *odst = dst;
const char *osrc = src;
@@ -53,3 +54,4 @@ strlcat(char *dst, const char *src, size_t dsize)
return(dlen + (src - osrc)); /* count does not include NUL */
}
+#endif
diff --git a/src/strlcpy.c b/src/strlcpy.c
index e9a7fe4..10a855f 100644
index e9a7fe4..5137acb 100644
--- a/src/strlcpy.c
+++ b/src/strlcpy.c
@@ -25,7 +25,11 @@
@@ -24,6 +24,7 @@
* chars will be copied. Always NUL terminates (unless dsize == 0).
* Returns strlen(src); if retval >= dsize, truncation occurred.
*/
+#if !HAVE_STRLCPY
size_t
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+bsd_strlcpy(char *dst, const char *src, size_t dsize)
+#else
strlcpy(char *dst, const char *src, size_t dsize)
+#endif
{
const char *osrc = src;
size_t nleft = dsize;
@@ -48,3 +49,4 @@ strlcpy(char *dst, const char *src, size_t dsize)
return(src - osrc - 1); /* count does not include NUL */
}
+#endif
diff --git a/src/strmode.c b/src/strmode.c
index e6afde5..c463243 100644
index e6afde5..da680c9 100644
--- a/src/strmode.c
+++ b/src/strmode.c
@@ -33,7 +33,11 @@
@@ -32,6 +32,7 @@
#include <sys/stat.h>
#include <string.h>
+#if !HAVE_STRMODE
void
+#if defined(darwin) || defined(__APPLE__) || defined(MACOSX)
+bsd_strmode(mode_t mode, char *p)
+#else
strmode(mode_t mode, char *p)
+#endif
{
/* print type */
switch (mode & S_IFMT) {
@@ -141,3 +142,4 @@ strmode(mode_t mode, char *p)
*p++ = ' '; /* will be a '+' if ACL's implemented */
*p = '\0';
}
+#endif
diff --git a/src/unvis.c b/src/unvis.c
index 94e3e7a..fba4c66 100644
--- a/src/unvis.c
+++ b/src/unvis.c
@@ -565,11 +565,15 @@ strnunvis_openbsd(char *dst, const char *src, size_t dlen)
{
return strnunvisx(dst, dlen, src, 0);
}
+#ifndef __MACH__
__asm__(".symver strnunvis_openbsd,strnunvis@@LIBBSD_0.2");
+#endif
int
strnunvis_netbsd(char *dst, size_t dlen, const char *src)
{
return strnunvisx(dst, dlen, src, 0);
}
+#ifndef __MACH__
__asm__(".symver strnunvis_netbsd,strnunvis@LIBBSD_0.9.1");
+#endif
diff --git a/src/vis.c b/src/vis.c
index c2cd2d8..2d84330 100644
--- a/src/vis.c
+++ b/src/vis.c
@@ -723,14 +723,18 @@ strnvis_openbsd(char *mbdst, const char *mbsrc, size_t dlen, int flags)
{
return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, "", NULL);
}
+#ifndef __MACH__
__asm__(".symver strnvis_openbsd,strnvis@@LIBBSD_0.2");
+#endif
int
strnvis_netbsd(char *mbdst, size_t dlen, const char *mbsrc, int flags)
{
return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, "", NULL);
}
+#ifndef __MACH__
__asm__(".symver strnvis_netbsd,strnvis@LIBBSD_0.9.1");
+#endif
int
stravis(char **mbdstp, const char *mbsrc, int flags)

View file

@ -13,16 +13,7 @@ stdenv.mkDerivation rec {
# the configure scripts
nativeBuildInputs = [ autoreconfHook ];
patches = stdenv.lib.optional stdenv.isDarwin ./darwin.patch
# Suitable for all, but limited to musl to avoid rebuilds
++ stdenv.lib.optionals stdenv.hostPlatform.isMusl [
# https://cgit.freedesktop.org/libbsd/commit/?id=1f8a3f7bccfc84b195218ad0086ebd57049c3490
./non-glibc.patch
# https://cgit.freedesktop.org/libbsd/commit/?id=11ec8f1e5dfa1c10e0c9fb94879b6f5b96ba52dd
./cdefs.patch
# https://cgit.freedesktop.org/libbsd/commit/?id=b20272f5a966333b49fdf2bda797e2a9f0227404
./features.patch
];
patches = stdenv.lib.optional stdenv.isDarwin ./darwin.patch;
meta = with stdenv.lib; {
description = "Common functions found on BSD systems";

View file

@ -1,26 +0,0 @@
From b20272f5a966333b49fdf2bda797e2a9f0227404 Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@hadrons.org>
Date: Tue, 6 Mar 2018 01:42:52 +0100
Subject: Remove <features.h> inclusion from <bsd/libutil.h>
This is a non-portable header, and we should not assume it is present.
Let the first system header pull it in if needed.
---
include/bsd/libutil.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/include/bsd/libutil.h b/include/bsd/libutil.h
index ccca29a..e5f148a 100644
--- a/include/bsd/libutil.h
+++ b/include/bsd/libutil.h
@@ -39,7 +39,6 @@
#ifndef LIBBSD_LIBUTIL_H
#define LIBBSD_LIBUTIL_H
-#include <features.h>
#ifdef LIBBSD_OVERLAY
#include <sys/cdefs.h>
#else
--
cgit v1.1

View file

@ -1,74 +0,0 @@
From 1f8a3f7bccfc84b195218ad0086ebd57049c3490 Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@hadrons.org>
Date: Tue, 6 Mar 2018 01:39:45 +0100
Subject: Fix function declaration protection for glibc already providing them
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
On non-glibc based systems we cannot unconditionally use the
__GLIBC_PREREQ macro as it gets expanded before evaluation. Instead,
if it is undefined, define it to 0.
We should also always declare these functions on non-glibc based
systems. And on systems with a new enough glibc, which provides these
functions, we should still provide the declarations if _GNU_SOURCE
is *not* defined.
Reported-by: Jörg Krause <joerg.krause@embedded.rocks>
---
include/bsd/stdlib.h | 3 ++-
include/bsd/string.h | 3 ++-
include/bsd/sys/cdefs.h | 8 ++++++++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h
index 8d33d1f..a5b063c 100644
--- a/include/bsd/stdlib.h
+++ b/include/bsd/stdlib.h
@@ -71,7 +71,8 @@ int sradixsort(const unsigned char **base, int nmemb,
const unsigned char *table, unsigned endbyte);
void *reallocf(void *ptr, size_t size);
-#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 26)
+#if !defined(__GLIBC__) || \
+ (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 26) || !defined(_GNU_SOURCE)))
void *reallocarray(void *ptr, size_t nmemb, size_t size);
#endif
diff --git a/include/bsd/string.h b/include/bsd/string.h
index 29097f6..f987fee 100644
--- a/include/bsd/string.h
+++ b/include/bsd/string.h
@@ -46,7 +46,8 @@ size_t strlcat(char *dst, const char *src, size_t siz);
char *strnstr(const char *str, const char *find, size_t str_len);
void strmode(mode_t mode, char *str);
-#if defined(_GNU_SOURCE) && defined(__GLIBC__) && !__GLIBC_PREREQ(2, 25)
+#if !defined(__GLIBC__) || \
+ (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 25) || !defined(_GNU_SOURCE)))
void explicit_bzero(void *buf, size_t len);
#endif
__END_DECLS
diff --git a/include/bsd/sys/cdefs.h b/include/bsd/sys/cdefs.h
index b4c8f30..d1cc419 100644
--- a/include/bsd/sys/cdefs.h
+++ b/include/bsd/sys/cdefs.h
@@ -59,6 +59,14 @@
#endif
/*
+ * On non-glibc based systems, we cannot unconditionally use the
+ * __GLIBC_PREREQ macro as it gets expanded before evaluation.
+ */
+#ifndef __GLIBC_PREREQ
+#define __GLIBC_PREREQ(maj, min) 0
+#endif
+
+/*
* Some kFreeBSD headers expect those macros to be set for sanity checks.
*/
#ifndef _SYS_CDEFS_H_
--
cgit v1.1