Skip to content

Commit e0adeab

Browse files
committed
Add explicit/volatile memset/memzero functions
Adds the following functions to platforms that support them: * `explicit_bzero` (de facto standard): Glibc, MUSL, FreeBSD, DragonFly BSD, OpenBSD * `explicit_memset`: NetBSD * `memset_s` (C11 standard): FreeBSD, DragonFly BSD These functions are useful for zeroing secret memory.
1 parent fad1e6f commit e0adeab

File tree

11 files changed

+36
-0
lines changed

11 files changed

+36
-0
lines changed

libc-test/semver/dragonfly.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,7 @@ endpwent
11741174
endservent
11751175
endutxent
11761176
exit_status
1177+
explicit_bzero
11771178
faccessat
11781179
fchdir
11791180
fchflags
@@ -1243,6 +1244,7 @@ lwpid_t
12431244
madvise
12441245
memmem
12451246
memrchr
1247+
memset_s
12461248
mincore
12471249
mkdirat
12481250
mkfifoat

libc-test/semver/freebsd.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,7 @@ endgrent
13501350
endpwent
13511351
endservent
13521352
endutxent
1353+
explicit_bzero
13531354
extattr_delete_fd
13541355
extattr_delete_file
13551356
extattr_delete_link
@@ -1442,6 +1443,7 @@ lwpid_t
14421443
madvise
14431444
memmem
14441445
memrchr
1446+
memset_s
14451447
mincore
14461448
mkdirat
14471449
mkfifoat

libc-test/semver/linux-gnu.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ copy_file_range
529529
dlinfo
530530
dlmopen
531531
endutxent
532+
explicit_bzero
532533
fgetspent_r
533534
getgrent_r
534535
getpt

libc-test/semver/linux-musl.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
# TODO: musl.
2+
explicit_bzero

libc-test/semver/netbsd.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,7 @@ endpwent
10341034
endservent
10351035
endutent
10361036
endutxent
1037+
explicit_memset
10371038
extattr_delete_fd
10381039
extattr_delete_file
10391040
extattr_delete_link

libc-test/semver/openbsd.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,7 @@ endgrent
897897
endpwent
898898
endservent
899899
execvpe
900+
explicit_bzero
900901
export_args
901902
faccessat
902903
fchdir

src/unix/bsd/freebsdlike/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,14 @@ extern "C" {
15931593
pub fn iconv_close(cd: iconv_t) -> ::c_int;
15941594
}
15951595

1596+
extern "C" {
1597+
// Added in `FreeBSD` 11.0
1598+
// Added in `DragonFly BSD` 5.4
1599+
pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t);
1600+
// ISO/IEC 9899:2011 ("ISO C11") K.3.7.4.1
1601+
pub fn memset_s(s: *mut ::c_void, smax: ::rsize_t, c: ::c_int, n: ::rsize_t) -> ::errno_t;
1602+
}
1603+
15961604
#[link(name = "rt")]
15971605
extern "C" {
15981606
pub fn mq_close(mqd: ::mqd_t) -> ::c_int;

src/unix/bsd/netbsdlike/netbsd/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,6 +2085,11 @@ extern "C" {
20852085
pub fn iconv_close(cd: iconv_t) -> ::c_int;
20862086
}
20872087

2088+
extern "C" {
2089+
// Added in `NetBSD` 7.0
2090+
pub fn explicit_memset(b: *mut ::c_void, c: ::c_int, len: ::size_t);
2091+
}
2092+
20882093
#[link(name = "util")]
20892094
extern "C" {
20902095
#[cfg_attr(target_os = "netbsd", link_name = "__getpwent_r50")]

src/unix/bsd/netbsdlike/openbsd/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,6 +1545,11 @@ extern "C" {
15451545
pub fn duplocale(base: ::locale_t) -> ::locale_t;
15461546
}
15471547

1548+
extern "C" {
1549+
// Added in `OpenBSD` 5.5
1550+
pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t);
1551+
}
1552+
15481553
cfg_if! {
15491554
if #[cfg(libc_union)] {
15501555
extern {

src/unix/linux_like/linux/gnu/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,11 @@ extern "C" {
13001300
pub fn dlinfo(handle: *mut ::c_void, request: ::c_int, info: *mut ::c_void) -> ::c_int;
13011301
}
13021302

1303+
extern "C" {
1304+
// Added in `glibc` 2.25
1305+
pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t);
1306+
}
1307+
13031308
cfg_if! {
13041309
if #[cfg(any(target_arch = "x86",
13051310
target_arch = "arm",

0 commit comments

Comments
 (0)