Line data Source code
1 : /*
2 : * Copyright (c) 2019 Andreas Schneider <asn@samba.org>
3 : *
4 : * This program is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 3 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * This program is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 : */
17 :
18 : #include "replace.h"
19 : #include <talloc.h>
20 : #include "lib/util/fault.h"
21 : #include "talloc_keep_secret.h"
22 :
23 158817 : static int talloc_keep_secret_destructor(void *ptr)
24 : {
25 : int ret;
26 158817 : size_t size = talloc_get_size(ptr);
27 :
28 158817 : if (unlikely(size == 0)) {
29 0 : return 0;
30 : }
31 :
32 158817 : ret = memset_s(ptr, size, 0, size);
33 158817 : if (unlikely(ret != 0)) {
34 0 : char *msg = NULL;
35 : int ret2;
36 0 : ret2 = asprintf(&msg,
37 : "talloc_keep_secret_destructor: memset_s() failed: %s",
38 : strerror(ret));
39 0 : if (ret2 != -1) {
40 0 : smb_panic(msg);
41 : } else {
42 0 : smb_panic("talloc_keep_secret_destructor: memset_s() failed");
43 : }
44 : }
45 :
46 158817 : return 0;
47 : }
48 :
49 159403 : void _talloc_keep_secret(void *ptr, const char *name)
50 : {
51 : size_t size;
52 :
53 159403 : if (unlikely(ptr == NULL)) {
54 : #ifdef DEVELOPER
55 0 : smb_panic("Invalid talloc pointer");
56 : #endif
57 : return;
58 : }
59 :
60 159403 : size = talloc_get_size(ptr);
61 159403 : if (unlikely(size == 0)) {
62 36 : return;
63 : }
64 :
65 159367 : talloc_set_name_const(ptr, name);
66 159367 : talloc_set_destructor(ptr, talloc_keep_secret_destructor);
67 : }
|