libc/string: Add explicit_bzero() from OpenBSD.
authorzrj <rimvydas.jasinskas@gmail.com>
Tue, 9 Apr 2019 07:29:03 +0000 (10:29 +0300)
committerzrj <zrj@dragonflybsd.org>
Thu, 11 Apr 2019 09:19:22 +0000 (12:19 +0300)
It is useful function for security related features. It allows to
further manipulate discarded memory region through weak hook.
Update the bzero.3 manpage.

Taken-from: OpenBSD

include/strings.h
lib/libc/string/Makefile.inc
lib/libc/string/Symbol.map
lib/libc/string/bzero.3
lib/libc/string/explicit_bzero.c [new file with mode: 0644]

index 31e0bcd..0a44039 100644 (file)
@@ -44,6 +44,9 @@ int    bcmp(const void *, const void *, size_t) __pure;       /* LEGACY */
 void    bcopy(const void *, void *, size_t);                   /* LEGACY */
 void    bzero(void *, size_t);                                 /* LEGACY */
 #endif
 void    bcopy(const void *, void *, size_t);                   /* LEGACY */
 void    bzero(void *, size_t);                                 /* LEGACY */
 #endif
+#if __BSD_VISIBLE
+void    explicit_bzero(void *, size_t);
+#endif
 int     ffs(int) __pure2;
 #endif
 #if __BSD_VISIBLE
 int     ffs(int) __pure2;
 #endif
 #if __BSD_VISIBLE
index 35edccf..308828c 100644 (file)
@@ -8,7 +8,8 @@ CMAPS+= ${.CURDIR}/string/Symbol.map
 CFLAGS+= -I${.CURDIR}/../libc/locale
 
 # machine-independent string sources
 CFLAGS+= -I${.CURDIR}/../libc/locale
 
 # machine-independent string sources
-MISRCS+=bcmp.c bcopy.c bzero.c ffs.c ffsl.c ffsll.c fls.c flsl.c flsll.c \
+MISRCS+=bcmp.c bcopy.c bzero.c explicit_bzero.c \
+       ffs.c ffsl.c ffsll.c fls.c flsl.c flsll.c \
        index.c memccpy.c memchr.c memrchr.c memcmp.c \
        memcpy.c memmem.c memmove.c mempcpy.c memset.c rindex.c \
        stpcpy.c stpncpy.c strcasecmp.c \
        index.c memccpy.c memchr.c memrchr.c memcmp.c \
        memcpy.c memmem.c memmove.c mempcpy.c memset.c rindex.c \
        stpcpy.c stpncpy.c strcasecmp.c \
@@ -37,6 +38,7 @@ MAN+= bcopy.3 bstring.3 bzero.3 ffs.3 index.3 memccpy.3 memchr.3 \
        strspn.3 strstr.3 strtok.3 strxfrm.3 swab.3 wcscoll.3 wcstok.3 \
        wcswidth.3 wcsxfrm.3 wmemchr.3
 
        strspn.3 strstr.3 strtok.3 strxfrm.3 swab.3 wcscoll.3 wcstok.3 \
        wcswidth.3 wcsxfrm.3 wmemchr.3
 
+MLINKS+=bzero.3 explicit_bzero.3
 MLINKS+=ffs.3 ffsl.3 \
        ffs.3 ffsll.3 \
        ffs.3 fls.3 \
 MLINKS+=ffs.3 ffsl.3 \
        ffs.3 ffsll.3 \
        ffs.3 fls.3 \
index b06e00a..ef91625 100644 (file)
@@ -94,6 +94,10 @@ DF404.0 {
     wmemset;
 };
 
     wmemset;
 };
 
+DF506.0 {
+    explicit_bzero;
+};
+
 DFprivate_1.0 {
     __strchrnul;
     __strtok_r;
 DFprivate_1.0 {
     __strchrnul;
     __strtok_r;
index 5a791a4..b5e56dc 100644 (file)
 .\"    @(#)bzero.3     8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: head/lib/libc/string/bzero.3 251069 2013-05-28 20:57:40Z emaste $
 .\"
 .\"    @(#)bzero.3     8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: head/lib/libc/string/bzero.3 251069 2013-05-28 20:57:40Z emaste $
 .\"
-.Dd June 4, 1993
+.Dd April 11, 2019
 .Dt BZERO 3
 .Os
 .Sh NAME
 .Dt BZERO 3
 .Os
 .Sh NAME
-.Nm bzero
+.Nm bzero ,
+.Nm explicit_bzero
 .Nd write zeroes to a byte string
 .Sh LIBRARY
 .Lb libc
 .Nd write zeroes to a byte string
 .Sh LIBRARY
 .Lb libc
 .In strings.h
 .Ft void
 .Fn bzero "void *b" "size_t len"
 .In strings.h
 .Ft void
 .Fn bzero "void *b" "size_t len"
+.Ft void
+.Fn explicit_bzero "void *b" "size_t len"
 .Sh DESCRIPTION
 The
 .Fn bzero
 .Sh DESCRIPTION
 The
 .Fn bzero
-function
-writes
+function writes
 .Fa len
 zero bytes to the string
 .Fa b .
 .Fa len
 zero bytes to the string
 .Fa b .
@@ -56,14 +58,30 @@ If
 is zero,
 .Fn bzero
 does nothing.
 is zero,
 .Fn bzero
 does nothing.
+.Pp
+The
+.Fn explicit_bzero
+variant behaves the same, but will not be removed by a compiler's dead store
+optimization pass, making it useful for clearing sensitive memory such as a
+password.
 .Sh SEE ALSO
 .Xr memset 3 ,
 .Xr swab 3
 .Sh SEE ALSO
 .Xr memset 3 ,
 .Xr swab 3
+.Sh STANDARDS
+The
+.Fn bzero
+function conforms to the X/Open System Interfaces option of the
+.St -p1003.1-2004
+specification.
+It was removed from the standard in
+.St -p1003.1-2008 ,
+which recommends using
+.Xr memset 3
+instead.
 .Sh HISTORY
 .Sh HISTORY
-A
+The
 .Fn bzero
 .Fn bzero
-function
-appeared in
+function appeared in
 .Bx 4.3 .
 Its prototype existed previously in
 .In string.h
 .Bx 4.3 .
 Its prototype existed previously in
 .In string.h
@@ -72,3 +90,10 @@ before it was moved to
 for
 .St -p1003.1-2001
 compliance.
 for
 .St -p1003.1-2001
 compliance.
+.Pp
+The
+.Fn explicit_bzero
+function first appeared in
+.Ox 5.5
+and
+.Dx 5.6 .
diff --git a/lib/libc/string/explicit_bzero.c b/lib/libc/string/explicit_bzero.c
new file mode 100644 (file)
index 0000000..b9f881d
--- /dev/null
@@ -0,0 +1,21 @@
+/*     $OpenBSD: explicit_bzero.c,v 1.4 2015/08/31 02:53:57 guenther Exp $ */
+/*
+ * Public domain.
+ * Written by Matthew Dempsky.
+ */
+
+#include <string.h>
+
+__attribute__((weak)) void __explicit_bzero_hook(void *, size_t);
+
+__attribute__((weak)) void
+__explicit_bzero_hook(void *buf, size_t len)
+{
+}
+
+void
+explicit_bzero(void *buf, size_t len)
+{
+       memset(buf, 0, len);
+       __explicit_bzero_hook(buf, len);
+}