Branch data Line data Source code
1 : : /* Report build ID information for a module. 2 : : Copyright (C) 2007, 2008 Red Hat, Inc. 3 : : This file is part of elfutils. 4 : : 5 : : This file is free software; you can redistribute it and/or modify 6 : : it under the terms of either 7 : : 8 : : * the GNU Lesser General Public License as published by the Free 9 : : Software Foundation; either version 3 of the License, or (at 10 : : your option) any later version 11 : : 12 : : or 13 : : 14 : : * the GNU General Public License as published by the Free 15 : : Software Foundation; either version 2 of the License, or (at 16 : : your option) any later version 17 : : 18 : : or both in parallel, as here. 19 : : 20 : : elfutils is distributed in the hope that it will be useful, but 21 : : WITHOUT ANY WARRANTY; without even the implied warranty of 22 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 : : General Public License for more details. 24 : : 25 : : You should have received copies of the GNU General Public License and 26 : : the GNU Lesser General Public License along with this program. If 27 : : not, see <http://www.gnu.org/licenses/>. */ 28 : : 29 : : #ifdef HAVE_CONFIG_H 30 : : # include <config.h> 31 : : #endif 32 : : 33 : : #include "libdwflP.h" 34 : : 35 : : // XXX vs report changed module: punting old file 36 : : int 37 : 151 : dwfl_module_report_build_id (Dwfl_Module *mod, 38 : : const unsigned char *bits, size_t len, 39 : : GElf_Addr vaddr) 40 : : { 41 [ + - ]: 151 : if (mod == NULL) 42 : : return -1; 43 : : 44 [ + + ]: 151 : if (mod->main.elf != NULL) 45 : : { 46 : : /* Once we know about a file, we won't take any lies about 47 : : its contents. The only permissible call is a no-op. */ 48 : : 49 [ + - ]: 3 : if ((size_t) mod->build_id_len == len 50 [ - + - - ]: 3 : && (mod->build_id_vaddr == vaddr || vaddr == 0) 51 [ + - ]: 3 : && !memcmp (bits, mod->build_id_bits, len)) 52 : : return 0; 53 : : 54 : 0 : __libdwfl_seterrno (DWFL_E_ALREADY_ELF); 55 : 0 : return -1; 56 : : } 57 : : 58 [ + - + - : 148 : if (vaddr != 0 && (vaddr < mod->low_addr || vaddr + len > mod->high_addr)) - + ] 59 : : { 60 : 0 : __libdwfl_seterrno (DWFL_E_ADDR_OUTOFRANGE); 61 : 0 : return -1; 62 : : } 63 : : 64 : 148 : void *copy = NULL; 65 [ + - ]: 148 : if (len > 0) 66 : : { 67 : 148 : copy = malloc (len); 68 [ - + ]: 148 : if (unlikely (copy == NULL)) 69 : : { 70 : 0 : __libdwfl_seterrno (DWFL_E_NOMEM); 71 : 0 : return -1; 72 : : } 73 : 148 : memcpy (copy, bits, len); 74 : : } 75 : : 76 : 148 : free (mod->build_id_bits); 77 : : 78 : 148 : mod->build_id_bits = copy; 79 : 148 : mod->build_id_len = len; 80 : 148 : mod->build_id_vaddr = vaddr; 81 : : 82 : 148 : return 0; 83 : : } 84 : : INTDEF (dwfl_module_report_build_id)