From 3e85fcb0270c9224ab95dac02c737e6676974c8e Mon Sep 17 00:00:00 2001 From: axtloss Date: Thu, 11 Jul 2024 02:56:56 +0200 Subject: Implement memset_s and improve free_secure --- src/memset_s.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/memset_s.c (limited to 'src/memset_s.c') diff --git a/src/memset_s.c b/src/memset_s.c new file mode 100644 index 0000000..deda5d7 --- /dev/null +++ b/src/memset_s.c @@ -0,0 +1,48 @@ +/* memset_s.c + * + * Copyright 2024 axtlos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: LGPL-3.0-only + */ + + +#define __STDC_WANT_LIB_EXT1__ 1 +#include "extlib.h" +#include + + +errno_t +memset_s(void *s, rsize_t smax, int c, rsize_t n) +{ + volatile unsigned char *dest = (unsigned char *) s; + errno_t ret = EINVAL; + rsize_t limit = n < smax ? n : smax; + + if (!s) + throw_constraint_handler_s("memset_s: s = NULL", ret); + else if (n > RSIZE_MAX) + throw_constraint_handler_s("memset_s: n > RSIZE_MAX", ret); + else if (smax > RSIZE_MAX) + throw_constraint_handler_s("memset_s: smax > RSIZE_MAX", ret); + else if (n > smax) + throw_constraint_handler_s("memset_s: n > smax", ret); + else { + while (limit > 0) + dest[--limit] = (unsigned char)c; + ret = 0; + } + return ret; +} + -- cgit v1.2.3