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 760970 : static int talloc_keep_secret_destructor(void *ptr) 24 : { 25 24383 : int ret; 26 760970 : size_t size = talloc_get_size(ptr); 27 : 28 760970 : if (unlikely(size == 0)) { 29 0 : return 0; 30 : } 31 : 32 760970 : ret = memset_s(ptr, size, 0, size); 33 760970 : if (unlikely(ret != 0)) { 34 0 : char *msg = NULL; 35 0 : 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 736587 : return 0; 47 : } 48 : 49 778021 : void _talloc_keep_secret(void *ptr, const char *name) 50 : { 51 24392 : size_t size; 52 : 53 778021 : if (unlikely(ptr == NULL)) { 54 : #ifdef DEVELOPER 55 0 : smb_panic("Invalid talloc pointer"); 56 : #endif 57 : return; 58 : } 59 : 60 778021 : size = talloc_get_size(ptr); 61 778021 : if (unlikely(size == 0)) { 62 56 : return; 63 : } 64 : 65 777957 : talloc_set_name_const(ptr, name); 66 777957 : talloc_set_destructor(ptr, talloc_keep_secret_destructor); 67 : }