Skip to content

Commit fd4324c

Browse files
committed
string: Add memset_explicit from C23
This is a non-eliable version of memset, suitable for use before calling free to avoid leaving sensitive data visible on the heap. Signed-off-by: Keith Packard <[email protected]>
1 parent af1b331 commit fd4324c

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

newlib/libc/include/string.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ void *mempcpy (void *, const void *, size_t);
9292
void *memrchr (const void *, int, size_t);
9393
#endif
9494
void *memset (void *, int, size_t);
95+
#if __ISO_C_VISIBLE >= 2023
96+
void *memset_explicit(void *, int, size_t);
97+
#endif
9598
#if __GNU_VISIBLE
9699
void *rawmemchr (const void *, int);
97100
#endif

newlib/libc/string/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ picolibc_sources(
5353
mempcpy.c
5454
memrchr.c
5555
memset.c
56+
memset_explicit.c
5657
rawmemchr.c
5758
rindex.c
5859
stpcpy.c
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
*
4+
* Copyright © 2024 Keith Packard
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
*
13+
* 2. Redistributions in binary form must reproduce the above
14+
* copyright notice, this list of conditions and the following
15+
* disclaimer in the documentation and/or other materials provided
16+
* with the distribution.
17+
*
18+
* 3. Neither the name of the copyright holder nor the names of its
19+
* contributors may be used to endorse or promote products derived
20+
* from this software without specific prior written permission.
21+
*
22+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33+
* OF THE POSSIBILITY OF SUCH DAMAGE.
34+
*/
35+
36+
#define _ISOC23_SOURCE
37+
#include <string.h>
38+
39+
void
40+
*memset_explicit(void *dest, int ch, size_t count)
41+
{
42+
memset(dest, ch, count);
43+
/* Compiler barrier. */
44+
__asm__ __volatile__ ("" ::"r" (dest): "memory");
45+
return dest;
46+
}

newlib/libc/string/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ srcs_string = [
5353
'mempcpy.c',
5454
'memrchr.c',
5555
'memset.c',
56+
'memset_explicit.c',
5657
'rawmemchr.c',
5758
'rindex.c',
5859
'stpcpy.c',

0 commit comments

Comments
 (0)