From: Andreas Schneider Date: Tue, 19 Mar 2019 09:57:54 +0000 (+0100) Subject: lib:util: Add support to keep talloc chunks secret X-Git-Tag: tdb-1.4.1~542 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7f7e5a37b0b0196e07a2829486f56ce32acdeff;p=thirdparty%2Fsamba.git lib:util: Add support to keep talloc chunks secret Signed-off-by: Andreas Schneider Reviewed-by: Andrew Bartlet --- diff --git a/lib/util/talloc_keep_secret.c b/lib/util/talloc_keep_secret.c new file mode 100644 index 00000000000..d6aa38265f6 --- /dev/null +++ b/lib/util/talloc_keep_secret.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2019 Andreas Schneider + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 General Public License + * along with this program. If not, see . + */ + +#include "includes.h" +#include "talloc_keep_secret.h" + +static int talloc_keep_secret_destructor(void *ptr) +{ + size_t size = talloc_get_size(ptr); + + if (unlikely(size == 0)) { + return 0; + } + + memset_s(ptr, size, 0, size); + + return 0; +} + +void _talloc_keep_secret(void *ptr, const char *name) +{ + size_t size; + + if (unlikely(ptr == NULL)) { +#ifdef DEVELOPER + smb_panic("Invalid talloc pointer"); +#endif + return; + } + + size = talloc_get_size(ptr); + if (unlikely(size == 0)) { + return; + } + + talloc_set_name_const(ptr, name); + talloc_set_destructor(ptr, talloc_keep_secret_destructor); +} diff --git a/lib/util/talloc_keep_secret.h b/lib/util/talloc_keep_secret.h new file mode 100644 index 00000000000..44a26aef542 --- /dev/null +++ b/lib/util/talloc_keep_secret.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2019 Andreas Schneider + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 General Public License + * along with this program. If not, see . + */ + +#ifndef _TALLOC_KEEP_SECRET_H +#define _TALLOC_KEEP_SECRET_H + +#ifdef DOXYGEN +/** + * @brief Keep the memory secret when freeing. + * + * This can be used to define memory as secret. For example memory which holds + * passwords or other secrets like session keys. The memory will be zeroed + * before is being freed. + * + * If you duplicate memory, e.g. using talloc_strdup() or talloc_asprintf() you + * need to call talloc_keep_secret() on the newly allocated memory too! + * + * @param[in] ptr The talloc chunk to mark as secure. + * + * @warning Do not use this in combination with talloc_realloc(). + */ +void talloc_keep_secret(const void *ptr); +#else +#define talloc_keep_secret(ptr) _talloc_keep_secret(ptr, #ptr); +void _talloc_keep_secret(void *ptr, const char *name); +#endif + +#endif /* _TALLOC_KEEP_SECRET_H */ diff --git a/lib/util/wscript_build b/lib/util/wscript_build index 5ca72c5c03c..0a3fb09981f 100644 --- a/lib/util/wscript_build +++ b/lib/util/wscript_build @@ -115,16 +115,34 @@ else: install=False) bld.SAMBA_LIBRARY('samba-util', - source='''talloc_stack.c smb_threads.c - rbtree.c rfc1738.c system.c getpass.c - genrand_util.c fsusage.c - params.c util_id.c util_net.c - util_strlist_v3.c util_paths.c - idtree_random.c base64.c - util_str.c util_str_common.c ms_fnmatch.c - server_id.c dprintf.c - tevent_debug.c memcache.c unix_match.c tfork.c - tftw.c''', + source=''' + base64.c + dprintf.c + fsusage.c + genrand_util.c + getpass.c + idtree_random.c + memcache.c + ms_fnmatch.c + params.c + rbtree.c + rfc1738.c + server_id.c + smb_threads.c + system.c + talloc_keep_secret.c + talloc_stack.c + tevent_debug.c + tfork.c + tftw.c + unix_match.c + util_id.c + util_net.c + util_paths.c + util_str.c + util_str_common.c + util_strlist_v3.c + ''', deps='samba-util-core DYNCONFIG close-low-fd tiniparser genrand util_str_hex', public_deps='talloc tevent execinfo pthread LIBCRYPTO charset util_setid', public_headers='''