summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-04-23 20:32:46 +0000
committerkib <kib@FreeBSD.org>2017-04-23 20:32:46 +0000
commitbc743032ad67f907e01ab07b89fa2c5417004333 (patch)
tree0d47e469cd483a5664a7e6aa1e11d412c4523637 /lib/libc/stdlib
parent240392415ab16d458302b3fdfead83d6cfa884e1 (diff)
downloadFreeBSD-src-bc743032ad67f907e01ab07b89fa2c5417004333.zip
FreeBSD-src-bc743032ad67f907e01ab07b89fa2c5417004333.tar.gz
MFC r316213:
Implement the memset_s(3) function as specified by the C11 ISO/IEC 9899:2011 Appendix K 3.7.4.1. MFC r316258: Only activate __EXT1_VISIBLE block when using sys/errno.h in userspace.
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/Makefile.inc4
-rw-r--r--lib/libc/stdlib/Symbol.map3
-rw-r--r--lib/libc/stdlib/set_constraint_handler_s.c95
3 files changed, 100 insertions, 2 deletions
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc
index 00f90e2..2585092 100644
--- a/lib/libc/stdlib/Makefile.inc
+++ b/lib/libc/stdlib/Makefile.inc
@@ -13,8 +13,8 @@ MISRCS+=C99_Exit.c a64l.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \
insque.c l64a.c labs.c ldiv.c llabs.c lldiv.c lsearch.c \
merge.c mergesort_b.c ptsname.c qsort.c qsort_r.c quick_exit.c \
radixsort.c rand.c \
- random.c reallocarray.c reallocf.c realpath.c remque.c strfmon.c \
- strtoimax.c \
+ random.c reallocarray.c reallocf.c realpath.c remque.c \
+ set_constraint_handler_s.c strfmon.c strtoimax.c \
strtol.c strtoll.c strtoq.c strtoul.c strtonum.c strtoull.c \
strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c
diff --git a/lib/libc/stdlib/Symbol.map b/lib/libc/stdlib/Symbol.map
index a239a42..65a0ee9 100644
--- a/lib/libc/stdlib/Symbol.map
+++ b/lib/libc/stdlib/Symbol.map
@@ -119,6 +119,9 @@ FBSD_1.4 {
FBSD_1.5 {
__cxa_thread_atexit;
__cxa_thread_atexit_impl;
+ abort_handler_s;
+ ignore_handler_s;
+ set_constraint_handler_s;
};
FBSDprivate_1.0 {
diff --git a/lib/libc/stdlib/set_constraint_handler_s.c b/lib/libc/stdlib/set_constraint_handler_s.c
new file mode 100644
index 0000000..dafdb16
--- /dev/null
+++ b/lib/libc/stdlib/set_constraint_handler_s.c
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2017 Juniper Networks. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/types.h>
+#include <machine/atomic.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include "un-namespace.h"
+#include "libc_private.h"
+
+/*
+ * Rationale recommends allocating new memory each time.
+ */
+static constraint_handler_t *_ch = NULL;
+static pthread_mutex_t ch_lock = PTHREAD_MUTEX_INITIALIZER;
+
+constraint_handler_t
+set_constraint_handler_s(constraint_handler_t handler)
+{
+ constraint_handler_t *new, *old, ret;
+
+ new = malloc(sizeof(constraint_handler_t));
+ if (new == NULL)
+ return (NULL);
+ *new = handler;
+ if (__isthreaded)
+ _pthread_mutex_lock(&ch_lock);
+ old = _ch;
+ _ch = new;
+ if (__isthreaded)
+ _pthread_mutex_unlock(&ch_lock);
+ if (old == NULL) {
+ ret = NULL;
+ } else {
+ ret = *old;
+ free(old);
+ }
+ return (ret);
+}
+
+void
+__throw_constraint_handler_s(const char * restrict msg, errno_t error)
+{
+ constraint_handler_t ch;
+
+ if (__isthreaded)
+ _pthread_mutex_lock(&ch_lock);
+ ch = _ch != NULL ? *_ch : NULL;
+ if (__isthreaded)
+ _pthread_mutex_unlock(&ch_lock);
+ if (ch != NULL)
+ ch(msg, NULL, error);
+}
+
+void
+abort_handler_s(const char * restrict msg __unused,
+ void * restrict ptr __unused, errno_t error __unused)
+{
+
+ abort();
+}
+
+void
+ignore_handler_s(const char * restrict msg __unused,
+ void * restrict ptr __unused, errno_t error __unused)
+{
+}
OpenPOWER on IntegriCloud