/*1* SPDX-License-Identifier: ISC2*3* Copyright (c) 2020 Todd C. Miller <[email protected]>4*5* Permission to use, copy, modify, and distribute this software for any6* purpose with or without fee is hereby granted, provided that the above7* copyright notice and this permission notice appear in all copies.8*9* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES10* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF11* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR12* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES13* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN14* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF15* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.16*/1718#include <config.h>1920#define __STDC_WANT_LIB_EXT1__ 1 /* for memset_s() */2122#include <string.h>23#ifdef HAVE_STRINGS_H24# include <strings.h>25#endif /* HAVE_STRINGS_H */2627#include <sudo_compat.h>2829#ifndef HAVE_EXPLICIT_BZERO3031# if defined(HAVE_EXPLICIT_MEMSET)32void33sudo_explicit_bzero(void *s, size_t n)34{35explicit_memset(s, 0, n);36}37# elif defined(HAVE_MEMSET_EXPLICIT)38void39sudo_explicit_bzero(void *s, size_t n)40{41memset_explicit(s, 0, n);42}43# elif defined(HAVE_MEMSET_S)44void45sudo_explicit_bzero(void *s, size_t n)46{47(void)memset_s(s, n, 0, n);48}49# elif defined(HAVE_BZERO)50/* Jumping through a volatile function pointer should not be optimized away. */51void (* volatile sudo_explicit_bzero_impl)(void *, size_t) =52(void (*)(void *, size_t))bzero;5354void55sudo_explicit_bzero(void *s, size_t n)56{57sudo_explicit_bzero_impl(s, n);58}59# else60void61sudo_explicit_bzero(void *v, size_t n)62{63volatile unsigned char *s = v;6465/* Updating through a volatile pointer should not be optimized away. */66while (n--)67*s++ = 0;68}69# endif /* HAVE_BZERO */7071#endif /* HAVE_EXPLICIT_BZERO */727374